さくらのVPSでWordPressを使う時のpreforkの設定

※記事内に商品プロモーションを含む場合があります

さくらのVPSで、動かしているWordPress。

今までは適当に設定を行っていましたが、
サーバの状況をロギングするスクリプトも完成したので
負荷をかけながら調整、チューニングする事にしました。
【関連】ccchartを使ってサーバの状況をグラフ表示するスクリプト
【関連】サーバのモニタリンクと異常通知用PHPスクリプトを作った

まず行った不要なモジュールのコメントアウト

まず行ったのは不要なモジュールのコメントアウト。
このサイトなどを参考にしました。
【参考】さくらのVPSで動いているApacheの不要モジュールを削除する
【参考】CentOS5 Webサーバーの構築[Apache] Apacheのインストールと設定
【参考】ウェブ開発者のための、1時間でできるLAMP環境構築術(CentOS編)

どうしても分からない時はモジュール名などで、
検索すると良いです。

最終的には5~6個ぐらいのモジュールをコメントアウトしました。

WordPressでのpreforkのチューニング

Apacheではリクエストが来たら親プロセスが受けて
子プロセス(スレット)が返答をします。

この編の仕組みをマルチプロセッシングモジュール(MPM)と言い、
MPMにはPrefork と Worker の2つがあります。

Preforkの方が古くWorkerの方が新しく、効率も良いそうです。

しかし、httpd -lで確認したらpreforkしかなかったので
今回はpreforkでチューニングを行います。

Preforkでの設定項目

StartServers
Apacheを起動した時の、子プロセス数を設定します。
しかしアクセスがあればすぐ、子プロセスは増えます。

MinSpareServers
待機時の最少子プロセス数を、設定します。
子プロセス数はこの値より減りませんが、私の環境では
滅多にこの値になりません。

MaxSpareServers
待機時の最大子プロセス数を設定します。
アクセスが無い状況では、この数値までプロセス数が減ります。

ServerLimit
MaxClients
起動する最大子プロセス数を設定します。
ServerLimitとMaxClientsは同じ数値にします。

MaxRequestsPerChild
起動した子プロセスが処理出来る、リクエスト数を設定します。
0にすると制限無く、子プロセスが働きます。

サーバダウンを防ぐにはメモリ解放が大事

私のサーバで発生した、サーバダウンの多くは
メモリ消費は激しくなりスワップアウトで反応しなくなる事が殆ど。
【参考】WordPressがメモリを使い果たしてサーバが落ちてました

WordPressはメモリを喰うので、
メモリを喰ったプロセスを殺す事でメモリ解放を行います。

実際WordPressを動かしたと思われるプロセスは、
30MB~50MB消費するのに対して他のプロセスは7MBほどです。

メモリの開放の鍵は、MaxSpareServers、MinSpareServers 、
MaxRequestsPerChildの3つ。

MaxSpareServers、MinSpareServersを小さめに設定する事で
アクセスが減ったら子プロセスを減らします。

MaxSpareServers、MinSpareServersの設定でも、
生き残った子プロセスはMaxRequestsPerChildで殺します。

MaxRequestsPerChildを小さめに設定する事で
ある程度生きたプロセスを殺す事でメモリ解放を行います。

WordPressを使わない場合

WordPressを使わないのであれば
MaxSpareServers、MinSpareServers、ServerLimit、MaxClients
を同じ、MaxRequestsPerChildを0にしても良いでしょう。

そうすると最大のプロセス数が起動するので子プロセス数の起動・終了の処理が省けます。
しかしWordPressを使うとこうなります。

MaxSpareServers、MinSpareServers、ServerLimit、MaxClientsをすべて同じにしてみた

Aで負荷かけています。
プロセス数は増えて、メモリも消費していますが
すぐにメモリの使用が減っています。

Bでは
MaxSpareServers、MinSpareServers、ServerLimit、MaxClients
をすべて70にしました。

Cでは再度負荷をかけています。
しかし、子プロセスを殺さないのでメモリ使用量が増えています。

ABコマンド

サーバに負荷を掛けるのにabコマンドを使います。

Apacheをインストールすれば使えますが、
自宅サーバー(Scientific Linux)は、CPUがATOMなので
Windows版をダウンロードしました。

ダウンロードはこちらより。

ダウンロードするのはAPacheやMySQLをまとめてインストールする
XAMPP というファイル。

インストラーだとインストールしないとダメなのでzip形式をダウンロードします。
zipファイル内、xampp\apache\binにab.exeがあるので
ab.exeのみを取り出して使っています。

abコマンドの使い方

abコマンドはサーバに負荷を掛けるツール。
どれぐらいのリクエスト数でサーバが落ちるのか、
遅くなるのかチェック出来ます。

リクエスト数によってはサーバが反応しなくなる事もあるので、
自分の管理外のサーバには実行しないで下さい。

相手の取り方によってはDDos攻撃とみなされる可能性もあります。

使い方は

ab -n リクエスト数 -c 同時接続数 URL

と言った感じです。

-nがリクエスト数なので-cより大きい数値である必要があります。

WordPressはメモリを浪費するのでメモリとスワップの使用状況を
確認しながらabコマンドで負荷を掛けます。

サーバ処理能力をabコマンドでチェック

WordPressでキャッシュプラグインを使っている場合は一旦
キャッシュを削除して、キャッシュを無効にします。

キャッシュを無効にする事でWordPress(PHP)の処理能力をチェックします。

チェックにはこのコマンドを使います。

ab -n 50 -c 50 http://hogehoge.jp/hoge

私のサーバでは50が最適値。
70にするとロードアベレージも急上昇し、メモリ使用率も94%まで上昇しました。

次にキャッシュを有効にしてサーバの処理能力をチェックします。

ab -n 1000 -c 200 http://hogehoge.jp/hoge

キャッシュが有効な場合、同時接続数が200でも余裕です。

しかし、実際の設定はWordPress(PHP)を考慮し
ServerLimit、MaxClientsは70としました。

キャッシュが有効な場合、多くのアクセスはキャッシュへのアクセス
だと思うのでもっと多くても良いかもしれません。

しかし、DDos攻撃などの可能性もあるので
辛うじて動作する70にしました。

もしかしたら、50まで減らすかもしれません。

実際の設定

実際、私が使っているさくらのVPSに、設定している数値です。

StartServers 10
MinSpareServers 5
MaxSpareServers 15
ServerLimit 70
MaxClients 70
MaxRequestsPerChild 50

あとがき

prefork設定後のhttpdプロセス数、メモリ使用率のグラフ

メモリ使用率も多くなる時は多くなっていますが
ちゃんと開放されているので増えたり、減ったりを繰り返しています。

今回の設定でメモリの浪費によるサーバダウンがより防げると思います。
前回はサーバダウンに気付くのに半日以上掛かったので、
盆休みにロードアベレージの上昇を通知するスクリプトを作りました。
【参考】サーバのモニタリンクと異常通知用PHPスクリプトを作った

iPhoneに通知が行くので前回よりは、
早くサーバを復帰させる事が出来ると思います、