こんにちは、( ,_ノ` )です。
6月19日に行われました FIFA ワールドカップ 2010 日本対オランダ戦は、
優勝候補のオランダ相手に果敢に攻めましたが0対1で惜しくも日本が敗れました。
次の試合は6月24日木曜日27時30分(日本時間)決勝トーナメント進出を掛けて
デンマークと対戦します。
さて、日本対オランダ戦に向けて2ちゃんねる実況サーバーとして投入された
Intel Core i7-960搭載の新型SSDサーバーですが、試合の盛り上がり
に合わせた瞬間的なアクセス増加もなんなく耐え抜き、当初懸念されていた
100Mbps の壁も無事に突破する事が出来ました。
ピーク転送量 109.990Mbps
試合終了後にhttpdの最大接続数不足によりウェブページの表示待ち状態が
発生しましたが、hayabusaサーバーは溜まった処理を高速にこなしていき、
約4分ほどでサーバーが自力で復帰していました。
しかもhayabusaサーバーには、
httpdの最大接続数をまだまだ増やす事が出来るだけの余裕があります。
live28サーバーで数々の検証を重ねて生み出されたセッティングを、
hayabusaサーバー用に更なるチューニングが施されています。
hayabusaサーバーのチューニングをこちらにご紹介いたします。
● 2ちゃんねるセッティング
2ちゃんねるセッティングではメモリディスクの作成、Apacheチューニング、
カーネルモジュール追加を行っています。
★ メモリディスク
頻繁に更新されるファイルや呼び出し回数が多いファイルをメモリディスク上に
置く事によりハードディスクへのアクセス回数を減らして負荷を解消します。
容量はサーバーに搭載されているメモリのサイズに合わせて任意に設定可能です。
BIG-server.com のサーバーは大容量メモリを標準搭載していますので、
メモリの追加無しでメモリディスクを作成できます。
★ Apacheチューニング
アクセス数が多いサーバーでもリソースを効率よく使えるように、
Apacheの各種パラメーターを調整します。
★ カーネルモジュール追加
accf_http.ko HTTP通信のパフォーマンスを向上させるモジュールを追加します。
accf_data.ko HTTPS通信のパフォーマンスを向上させるモジュールを追加します。
● changiセッティング
changiセッティングは2ちゃんねるセッティングの発展形です。
(設定方法についてはこちらの日記でもご紹介しています。)
★ ウェブサーバーメイン機能の高速化
changiセッティングでは、OSの実行ファイル/ライブラリ/モジュール、
Apacheの実行ファイル/ライブラリ/モジュールを、データ処理が速い
メモリディスク上にすべて展開しています。
★ 各種プログラム実行時のオーバーヘッドを軽減
changiセッティングでは、Apacheの実行ユーザーをシステムユーザーから
一般ユーザーに変更する事により、以下の効果が期待できます。
1. CGIプログラム実行時のSuExecによるオーバーヘッドを無くすことができ、
サーバーパフォーマンスの向上につながります。
2. mod_cgidsoやPHPなどのApacheモジュールから直接実行されるプログラムと
通常のCGIプログラムが同一ユーザとなるため、生成されるファイルのオーナーや
パーミッション等も同一となり、より円滑な運用が可能になります。
3. 高速なCGI実行を実現するためのSpeedyCGIを、従来のspeedyプログラムを
経由する方法(CGI方式)から、子プロセスの生成を伴わないmod_speedycgiモジュール
経由での実行に変更できます。
特に3.は、外部イベント等により集中的・爆発的にCGIが実行されるサーバーにおいて、
パフォーマンス上の大きな効果が期待できます。
このようにchangiセッティングでは、データ処理が速いメモリディスク上で
ウェブサーバーメインの機能を動かし、かつ各種プログラム実行時の
オーバーヘッドを軽減させる事によりサーバー負荷を極限まで減少させて、
より大量のアクセスがあっても快適にサーバーを動かします。
● むむむさんスペシャルセッティング1
突発的なアクセス数の増加でデータのやりとりが頻繁になった時に
処理が詰まらないように、ネットワークのデータバッファの値をチューニングしています。
/boot/loader.conf
# increase nmbclusters, maxsockets, etc.
kern.ipc.nmbclusters=131072
kern.ipc.maxsockets=65536
vm.pmap.shpgperproc=2048
kern.ipc.maxpipekva=41943040
|
/etc/sysctl.conf
# increase maximum file descriptors
kern.maxfiles=131072
kern.maxfilesperproc=65536
# increase listen queue
kern.ipc.somaxconn=32768
kern.ipc.maxsockbuf=20480000
# see http://qb5.2ch.net/test/read.cgi/operate/1097931665/666-676
net.inet.icmp.icmplim=3000
net.inet.icmp.icmplim_output=0
# authority
security.bsd.see_other_uids=1
# nmb (number of mbufs) tuning for FreeBSD 7.x
# note: kern.ipc.nmbclusters=131072 should be set at /boot/loader.conf
kern.ipc.nmbjumbop=65536
kern.ipc.nmbjumbo9=32768
kern.ipc.nmbjumbo16=16384
# original settings of A-tiger
net.inet.tcp.rfc3042=1
net.inet.tcp.rfc3390=1
net.link.ether.inet.log_arp_wrong_iface=0
# changi Memory settings
vfs.ufs.dirhash_maxmem=134217728
|
● むむむさんスペシャルセッティング2(hayabusa用)
最初に指定した数のhttpd起動して、待機状態のhttpdが一定数を下回らないよう
起動数を変化させ、突発的なアクセスの増加があった場合は、待機数を最大値まで
伸ばす事により、受け入れ可能になるまでの待ち時間を作らないよう設定しています。
Apacheディレクトリ/conf/httpd.conf
【hayabusaサーバー用チューニング 6/22 改良】
最初にhttpdをN個起動し、アイドル状態のhttpdが常に(N - k - 1)個以上になるように起動数を変化させ、非常時には待機数をN + M個まで増やす設定
StartServers N
MinSpareServers (N - k - 1)
MaxSpareServers N + m
ServerLimit N + M
MaxClients N + M
MaxRequestsPerChild 10000
MaxMemFree 2000
N: 初期値
M: マージン
m: アイドル定数(M >= m >= 0)
k: 平常時の込み具合
StartServers 4096
MinSpareServers 3775
MaxSpareServers 5120
ServerLimit 5120
MaxClients 5120
MaxRequestsPerChild 10000
MaxMemFree 2000
hayabusaサーバー用セッティング
N: 4096
M: 1024
m: 1024
k: 320
|
Apacheディレクトリ/conf/httpd.conf
【hayabusaサーバー用チューニング 6/21】
最初にhttpdを1536個起動し、アイドル状態のhttpdが常に1024(1023+1)個以上になるように起動数を変化させ、非常時には待機数を8192個まで増やす設定
StartServers 1536
MinSpareServers 1023
MaxSpareServers 1536
ServerLimit 8192
MaxClients 8192
MaxRequestsPerChild 10000
MaxMemFree 2000
|
hayabusaサーバーではメモリサイズを24GBに増量していますので、
httpdの最大接続数を更に増やす事が出来る余裕が生まれました。
hayabusaサーバーではhttpdの最大接続数をlive28サーバーの4倍に設定しています。
● むむむさんスペシャルセッティング3
BIG-server.com ではサーバー内にDNSキャッシュを内包しています。
サイトのアクセス数が多くなってくると、DNSキャッシュへの問い合わせ回数も
それだけ多くなりますので、DNSキャッシュの問い合わせログの記録でかかる
I/O負荷も無視できなくなってきます。
スペシャルセッティング3ではDNSキャッシュの問い合わせログを止めて、
DNSキャッシュのログによるI/O負荷を解消します。
live28.2ch.net が入っているSSDサーバー7号機では、
DNSキャッシュの問い合わせログの記録でI/O負荷の約20%を占めていましたが、
スペシャルセッティング3の適用によりサーバーのパフォーマンスに余裕が生まれました。
● むむむさんスペシャルセッティング4
hayabusaサーバーでは、1Gbps専用線に接続しています。
FreeBSD 7.0におけるTCPのデフォルト設定は100Mbps接続を想定しているため、
1Gbps接続用にTCPのチューニングを施しました。
/etc/sysctl.conf
# additional network settings for 1Gbps connection
# http://fasterdata.es.net/TCP-tuning/FreeBSD.html
net.inet.tcp.sendbuf_max=20480000
net.inet.tcp.recvbuf_max=20480000
#net.inet.tcp.sendbuf_auto=1 # Send buffer autotuning enabled by default
net.inet.tcp.sendbuf_inc=16384
#net.inet.tcp.recvbuf_auto=1 # Receive buffer autotuning enabled by default
net.inet.tcp.recvbuf_inc=524288
net.inet.tcp.inflight.enable=0
|
● むむむさんスペシャルセッティング5
大量のアクセスが一気にサーバーに押し寄せてネットワークバッファが足りなくなると、
httpdプロセスが「zoneli(mit)」状態となり、サービスが停止する事があります。
この設定では、ネットワークバッファ使用量を節約する事により、バッファ不足の
発生を抑えてhttpdが「zoneli(mit)」状態になりにくいようにしています。
/etc/sysctl.conf
# The higher the buffer, the more mbufs will be used for network connections.
# Lowering these buffers down will reduce your memory usage and
# save yourself some mbufs.
# This should dramatically reduce your mbuf usage and get your server
# out of zonelimits once and for all.
# http://www.realfreebsdtips.com/networking/freebsd-stopping-zoneli-state/
net.inet.tcp.sendspace=8192
net.inet.tcp.recvspace=8192
|
● むむむさんスペシャルセッティング6(hayabusa用)
Apacheの方で制限している保留状態のコネクションのキューの最大長を
サーバー規模に合わせて拡大しています。
この設定により突発的に発生するアクセスの集中時(混雑時)の接続で
「詰まり」や「エラー」が発生しにくくなる事が期待されています。
Apacheディレクトリ/conf/httpd.conf
# Increasing maximum length of the queue of pending connections.
# (Default value is 511)
ListenBackLog 8192
|
FreeBSD 7.0RではListenBackLogは実際には設定値の1.5倍が設定されます。
デフォルト値511の場合、保留状態のコネクションのキューの最大長は768となり、
この数値を超えたTCP接続は破棄されます。
ListenBackLogに設定出来る最大値はkern.ipc.somaxconnの値に依存しており、
0より小さい値やkern.ipc.somaxconnより大きい値が設定された場合は、
kern.ipc.somaxconnの値が強制的に適用されます。
hayabusaサーバーではメモリサイズを24GBに増量していますので、
httpdの最大接続数を更に増やす事が出来る余裕が生まれました。
hayabusaサーバーではhttpdの最大数をlive28サーバーの4倍に設定しています。
● むむむさんスペシャルセッティング7
・ rtprioによるlogbufferの活入れ
logbufferコマンドは、多くのhttpdプロセスからのアクセスログを同時並列的に
受信しており、従来はlogbufferコマンドの処理が滞ることにより、httpdの処理も
ブロックされてしまう場合がありました。
SunOSさんがlogbufferに改良を施し、aio(4)を使用した高効率かつ非同期な
ログの書き込みが実現された事により、logbufferの処理待ちでhttpdの処理が
ブロックしてしまうことが軽減され、全体の処理能力が向上しました。
スペシャルセッティング7では、logbufferをrtprioコマンド経由で起動するように
httpd.confに設定を追加することにより、同コマンドを通常の「タイムシェアリング」
優先度から「リアルタイムプロセススケジューリング」優先度に変更して動作させることで、
httpdのブロックをさらに高いレベルまで起こりにくくすることを意図した設定となります。
Apacheディレクトリ/conf/httpd.conf
2010/06/30:logbufferの優先度をspeedy_backendよりも上にするため31→23に変更
TransferLog "| exec /usr/sbin/rtprio 23 /usr/local/sbin/logbuffer"
|
TransferLog "| exec /usr/sbin/rtprio 31 /usr/local/sbin/logbuffer"
|
/etc/sysctl.conf
# tuning for aio(4)
vfs.aio.max_aio_queue_per_proc=1024
vfs.aio.max_aio_queue=4096
|
・ speedy_backendプロセスの最大数の調整
SpeedyCGIでは、speedy_backendというバックエンドプロセスが実際の処理を行います。
speedy_backendは処理状況によりプロセスが必要に応じて起動され、
並列処理を実行することが可能となっています。
しかし、あまりにも多くのプロセスが同時に起動されると、
例えばHDDのパフォーマンスが低い場合、多くのspeedy_backend
プロセス同士が競合してしまい、全体の処理能力が低下する事がありました。
従来の主な設定値は以下の通りです。
(実際にはサーバの状況により、微妙な調整を実施しています)
-M 8 旧banana
-M 16〜-M 32 旧tiger、T-banana
-M 32〜-M 48 A-tiger
-M 64 live28
|
hayabusaサーバでは従来の4倍 -M 256 に設定値を上げる事にしました。
これにはCPU処理能力の向上と、SSDの採用によるディスクI/Oの大幅な
パフォーマンス向上が大きく寄与しています。
● むむむさんスペシャルセッティング8
mod_speedycgiを有効にした環境では、httpdが受け取ったSpeedyCGIで処理する
プログラムは、httpdに包含されたmod_speedycgiモジュールにより、speedy_backendを
直接起動して実行されます。
この場合、httpd → speedy_backendという形でプログラムが実行され、
httpdから起動されるspeedy_backendプログラムは一般的な優先度で実行されます。
これを、setuidとrtprio(2)機能を利用して自分自身の優先度を
「リアルタイムスケジューリング」に上げてspeedy_backendプログラムを上書き実行して
処理を渡す「speedy_backend_wrapper」という特別なプログラムを作成・インストール
して、speedy_backendプログラムの優先度を向上させます。
具体的には、
httpd ―(子プロセスとして起動)→ speedy_backend
|
という従来の形を、
httpd ―(子プロセスとして起動)→ speedy_backend_wrapper ―(自分自身を上書き)→ speedy_backend
|
という形に変更することにより、
speedy_backend_wrapperプログラム内で、優先度の変更を実施できるようにします。
この場合、speedy_backendを直接実行する形よりも起動コストは上がりますが、
一度起動したspeedy_backendはしばらくの間常駐し、毎回起動されるわけではないため、
コストの上昇は最小限にとどめられることとなります。
live28サーバーからhayabusaサーバーへのハードウェアの進化は非常に大きく、
live28サーバーそのままの設定で大量のアクセス数をなんなくこなす事が出来ました。
しかも、httpdの最大接続数を更に増やすなどチューニングの改良にまだまだ余裕
がありますので、ソフトウェアの設定値による限界を超えた場合でも、設定値の増量など
拡張が可能です。
hayabusaサーバーにある掲示板の一覧やサーバーの稼働状況など、
こちらのページでご確認いただけます。
新作戦「一羽の鴎」/ i7-960 + SSD サーバー / hayabusa.2ch.net
ぜひご覧ください。
|