webサーバをチューニング

webサーバのチューニングのポイントをまとめておきます。

TIME_WAIT待機時間を短くする
アクセスが多いシステムだと、
ソケットの開放が追い付かなくなって
ポートを使いきってしまいます。
⇒特にKeep Alive OFFのwebサーバなど

RedHat系Linuxの場合、この待機時間は
net.ipv4.tcp_fin_timeout
の値になります。(単位は秒)
net.ipv4.tcp_tw_reuse、net.ipv4.tcp_tw_recycleを有効にすることで再利用を促進します。
オンラインで変更する場合、sysctlを使って調整します。

設定値の表示
# sysctl -a
設定値の書き換え
# sysctl -w net.ipv4.tcp_fin_timeout=30
# sysctl -w net.ipv4.tcp_tw_reuse=1
# sysctl -w net.ipv4.tcp_tw_recycle=0

↑なんか勘違いしていた可能性があるので修正。現状では大きな問題は起きていないですが、tcp_tw_recycleはNATで問題が起きることがあるようなので最終手段です。
@2008/12/11追記

↑tcp_tw_recycleを1にすると問題が多くて地雷祭りなので、基本0にしておきます。
@2010/10/29追記

いまさらですけど、tcp_fin_timeoutはtime_waitの数と関係ありません(60秒でハードコードされているとのこと)。tcp_fin_timeoutが関係あるのはFIN_WAIT_2の数で、FIN_WAIT_2が多い場合はtcp_fin_timeoutを短くすると改善するかもしれません。

また、起動時に設定されるように
/etc/sysctl.conf
を編集して設定しておきましょう。

参考図書



CLOSE_WAIT待機時間を短くする
apache設定ファイルのTimeout値を小さくすることで調整します。
ただし、ファイルアップロードやMTの再構築のような時間のかかる処理のときに
タイムアウトになる可能性もあるので要注意です。

同時接続数を多くする
apache設定ファイルのMaxClients値とServerLimit値を大きくすることで調整します。
/etc/httpd/conf/httpd.confか、ソースインストールの場合はconf/extra/httpd-mpm.confに
設定があると思います。

また、伴ってファイルディスクリプタや、ユーザあたりの起動プロセスの上限を引き上げる必要があります。

CentOSの場合、
/etc/security/limits.conf
に設定を記載します。

apache soft nofile 12288
apache hard nofile 12288
apache soft nproc  4096
apache hard nproc  4096

※システム上限値よりも大きくは設定できません

システム上限値
# sysctl fs.file-max
システム上限値は、上の項目と同様にsysctlコマンド・/etc/sysctl.confファイルで設定しましょう
ログ出力を抑止する
apache設定ファイルのSetEnvIfもしくはSetEnvIfNoCaseを利用して、ログ出力を抑止してディスクI/O削減を図ります。
SetEnvIf Request_URI "\.(gif)|(jpg)|(jpeg)|(png)|(swf)$" no_log
CustomLog logs/access.log combined env=!no_log




See also