1G メモリのサーバで Apache リバースプロキシをチューニングします。なぜチューニングするかというと、デフォルトままだとメモリを全て使ってしまい、Out of Memory (OOM) になる可能性があるためです。
Contents
環境とバージョン
- CentOS 6
- httpd-2.2.15-54.el6.centos.x86_64
- メモリ 1G
前提条件
前提条件として、このサーバは、Apache リバースプロキシのみを動かすものとします。
問題点
1プロセスのメモリ使用量
$ ps aux | grep httpd | egrep -v 'grep|root' | awk 'BEGIN{sum=0;} {sum+=$6;} END{print sum/NR;}' 4480.3
まず、Apache が起動している状態で、1プロセスあたりのメモリ使用量を算出します。
算出方法は、ps コマンドで Apache を grep し RSS を足し合わせ、その平均から算出しています。それをワンライナーで実行した例が上記となります。このサーバでは、Apache の1プロセスあたりメモリ使用量は 4,480.3 KB でした。
MaxClients
$ cat /etc/httpd/conf/httpd.conf ... <IfModule prefork.c> StartServers 8 MinSpareServers 5 MaxSpareServers 20 ServerLimit 256 MaxClients 256 MaxRequestsPerChild 4000 </IfModule> ...
CentOS6 の Apache 2.2 デフォルト MPM は prefork ですので、prefork の MaxClients を確認します。256 になっています。
必要なメモリ量を計算
1プロセスのメモリ使用量と MaxClients がわかりました。
サーバに必要なメモリ量は以下の式で求められると思います。
1プロセスのメモリ使用量は 4,480.3 KB で、MaxClients が 256 ですので、Apache が最大で使用する可能性があるメモリ量は、1,146,956.8 KB となり、1G メモリを超えています。
これが、デフォルトの設定のままだとメモリを全て使ってしまい、問題があるということです。
解決策
その1 MaxClients を減らす
この方法が一番簡単ですが、クライアントが接続できる数を減らすことになるで、やりたくはないです。
その2 MPM を worker にする
私はいつもこの方法を取っています。
$ cat /etc/httpd/conf/httpd.conf ... <IfModule worker.c> StartServers 4 MaxClients 300 MinSpareServers 25 MaxSpareServers 75 ThreadPerChild 25 MaxRequestsPerChild 0 </IfModule> ...
MPM は worker に変更し、設定は上記のようにデフォルトのままにします。
これで、prefork だったサーバで1プロセスあたりのメモリ使用量を再計算したところ、13 MB となりました。worker の MaxClients が 300 で ThreadsPerChild が 25 なので、最大プロセス数は 12 です。
これを先ほどの式に当てはめると、13 MB x 12 = 156 MB の消費となります。
prefork に比べ、メモリ消費量を抑えられる上に、44 コネクション分多くなります。
チューニング次第で、最大 1,425 コネクションまでイケそうな気がします。
MPM を prefork から worker に変更するには、/etc/sysconfig/httpd ファイルを修正し、 HTTPD=/usr/sbin/httpd.worker にします。
$ cat /etc/sysconfig/httpd ... HTTPD=/usr/sbin/httpd.worker ...
その3 Nginx にする
可能であれば、Nginx にする方が一番コストパフォーマンスが良いです。
Apache リバースプロキシで、1G メモリのサーバをギリギリまで使った場合、最大で 1,425 コネクションまで上げることが可能ですが、Nginx はその 10 倍以上さばくことが可能です。
1 コネクションに使用するメモリ量が、Apache に比べ、全然違います。
まとめ
1G メモリのサーバで Apache リバースプロキシをチューニングしました。
Apache の1プロセス当たりのメモリ使用量と最大で使用するメモリ量を計算しましょう。
問題があれば、MPM の変更や MaxClients を見直しましょう。
Apache にする理由がなければ、Nginx の導入を検討しましょう。
これから新規で Web サーバを構築するのであれば、Nginx をまず第一に検討した方がいいですね。