WordPressを入れていろいろ設定をしていたら、だんだん応答が遅くなってきました。
作業用ssh端末のほうもコマンドの反応が悪くなってきたので、topコマンドで調べてみました。
Shift+Mでメモリ使用量順に並べてみると、Apacheのプロセスhttpdが上位にずらっと。
5つあるhttpdのうち4つがそれぞれ約400MBほど消費し、2GBある実メモリが使い切られてしまっています。
再現は簡単で、キャッシュプラグインW3TCの設定セーブを繰り返すだけです。
メモリをじゃぶじゃぶ消費していく様子が分かります。
入れていたプラグインの中で重そうなのを選んでみましたが、別のプラグインでも似たようなことになるのかもしれません。
とにかくこんなにメモリを食いつぶされていたら使えない、ということでいろいろ調べてみました。
どうやらWordPressとは基本的にメモリを大量に使うものらしいです。プラグインを大量に入れると大変なことになることもあるとか。
大量のメモリをロックしたプロセスが居座らないよう、Apacheのconf/extra/httpd-mpm.confでMaxRequestsPerChildを設定してみたのですが、どうも効果がないようで。
仕方がないのでApacheのMPMをworkerからpreforkに変更することにしました。
ソースからコンパイルしたApacheを使っていますので、configureからやり直します。
変更点:–with-mpm=worker → –with-mpm=prefork
これで例の設定セーブを繰り返しても、実メモリの消費が600MBほどで止まるようになりました。
起動するプロセス数を調整すればもっと減らせそうです。
次の問題は、workerからpreforkにしたことでパフォーマンスへの影響がどれぐらいあるかですね。
PHPを使うならpreforkがいいという話もありますし、影響がないことを期待したいです。