![画像::[Slicehost] Ubuntuサーバーの高速化1 - Apacheチューニング 画像 - [Slicehost] Ubuntuサーバーの高速化1 - Apacheチューニング](http://de-lab.com/img/smallLogo.jpg)
少ないメモリ(258m)でも安定動作・高速動作するためにApacheの設定を見直しました。
Slicehostでの運用もしばらく経ちましたが、最初は頻繁にapacheが停止したりCPU値が100%超えてOOMキラーが発生したりしましたが、高速化、コストパフォーマンスを考えて設定を見直ししました。驚くほど動作が安定しています。
Rubyのインスタンスは正直まだ実運用は難しいレベルですが、需要があったとき考えます:-p
Apacheのチューニング
参考リンク
@IT:httpd.confによるWebサーバの最適化(2/3)
Apacheの設定を見直す
/etc/apache2/apache2.conf
KeepAlive On
KeepAliveを利用して1つの接続を使い回し、複数のリクエストに応えられるようにします。
MaxKeepAliveRequests 100
1つのKeepAliveが、開始から切断までに受け付けるリクエスト数を設定。推奨:1ページ当たりの平均的なファイル数+αを数値とする。
KeepAliveTimeout 15
KeepAliveで接続が維持されつづけると、効率が落ちるので一定時間で切断するための時間設定。
リソースの確保のため、小さい数値にする。
Timeout 45
処理タイムアウト時間。 若干短くしている。
prefork MPM の設定
Apache 2.0はマルチスレッドに対応し、1.0のプロセス処理からパフォーマンスを向上しましたが、PHPではマルチスレッドプロセスのworker MPMを使うことは推奨されていません(デフォルトもprefork)。
デフォルト設定
<IfModule mpm_prefork_module> MinSpareServers 10 MaxSpareServers 10 StartServers 10 MaxClients 50 MaxRequestsPerChild 50 </IfModule>
StartServers
Apache起動時のサーバプロセスの数。MinSpareServers と同一の値を設定する。
MaxSpareServers
待機させておくhttpdの最大数。Apacheは定期的に監視してこの値を上回っていた場合は自動的にhttpdを停止する。
MaxClients
MaxClients * Apacheの1プロセスが使用するメモリ < 使用可能なメモリ
使用可能なメモリを計算するのは複雑なので、OSメモリの90%位を目安にしてます。
プロセスの消費メモリを計算
TOP
Mでメモリ使用順に並べ替え
topで上位からの一部分
PID USER PR NI VIRT RES SHR S CPU MEM TIME COMMAND
———————————————————————————————
8131 www-data 15 0 269m 36m 23m S 0 14.4 0:00.69 apache2
8134 www-data 15 0 269m 27m 14m S 0 10.7 0:01.13 apache2
8136 www-data 15 0 269m 27m 14m S 0 10.7 0:01.14 apache2
8128 www-data 15 0 269m 27m 14m S 0 10.6 0:01.31 apache2
8127 www-data 15 0 269m 27m 14m S 0 10.6 0:00.80 apache2
8142 www-data 15 0 269m 27m 14m S 0 10.6 0:00.42 apache2
8144 www-data 15 0 269m 27m 13m S 0 10.6 0:00.73 apache2
8140 www-data 15 0 269m 26m 13m S 0 10.5 0:00.43 apache2
8138 www-data 15 0 269m 25m 12m S 0 10.1 0:00.43 apache2
8146 www-data 15 0 269m 25m 12m S 0 10.0 0:00.21 apache2
平均化したプロセス使用メモリを求める
RES(物理メモリ) - SHR(共有メモリ)で一つのプロセスが使用するメモリを求める
プロセス使用メモリ(15m) / Apacheプロセス数 = 平均プロセス使用メモリ
平均的に10m~15m位になるんじゃないかと思います。
MaxClientsの値
{物理メモリ(258m)*0.9}(232m) ÷ 平均プロセス使用メモリ(15m) ≒ MaxClients (15)
なるべく高い数値にすればクライアントの要求に応えられますが、高い値にし過ぎると、メモリを使い切りスワップが発生します。
MaxRequestsPerChild
ここで指定した数のリクエストを処理すると再起動します。Apache側で使い回しているプロセスを定期的に再起動させることで、メモリリークを防ぐことができます。
なるべく大きい数を指定します。0だと再起動しません。
修正したMPMの設定
<IfModule mpm_prefork_module>
StartServers 3
MinSpareServers 3
MaxSpareServers 13
MaxClients 15
MaxRequestsPerChild 4000
</IfModule>

