※記事内に商品プロモーションを含む場合があります
先日、サーバダウンが発生し、WordPressのメモリ消費の節約
を現在行っています。
【関連】WordPressがメモリを使い果たしてサーバが落ちてました
メモリ消費の節約と言ってもメモリ消費の多いプラグインを停止
させてるダケですけどね。
PHPでの設定memory_limitは設定してもメモリ消費は抑えられません。
PHPのメモリ節約にPHPのmemory_limitは無意味
memory_limitは使用するメモリの上限を設定する設定。
WordPressがメモリを使用し、memory_limitの上限に達した時は
途中で処理が終了してしまいます。
そうなるとブラウザでの表示は真っ白な状態になります。
memory_limitは指定すれば、それ以上のメモリ消費は避けられますが
WordPressは真っ白になってしまい、メモリ節約には意味がありません。
WordPressのメモリ節約、まずはプラグインから
WordPressのメモリ消費は25MB~30MBほど。
テーマやプラグインによってメモリ消費が増えます。
メモリ消費量の計測は計測用のプラグインを作りました。
【関連】WordPressがメモリを浪費するので使用量を表示するプラグインを作った
プラグインの中には5MB以上メモリを消費するモノもあるので
メモリ消費の多いプラグインを外しました。
私が外したプラグインはこの2つ
- Jetpack by WordPress.com
- NextScripts: Social Networks Auto-Poster
これにより、18MB程のメモリ節約になりました。
現在、記事ページでメモリ消費は40MB程となっています。
節約出来る量は少ないけど、塵も積もれば山となる
たかが18MBと思っているでしょう?
でもApacheの最大接続数(maxclients)が50でキャッシュ無しの場合
どうでしょうか?
18MB × 50プロセス = 900MB となります。
節約出来た分だけでも1GBのメモリほどとなります。
実際にはそれほどアクセス数も無く、
キャッシュも効くのでそこまでメモリは使用しません。
キャッシュの場合でもApacheの場合プロセスを使い回すので
PHPの処理と同じだけのメモリを確保したままな様な気がします。
使い回したままだと困るのでMaxRequestsPerChildで
50回リクエストを処理したらプロセスが死ぬ様にしています。
プロセスを定期的に殺す事でメモリを開放させています。
あとがき
サーバが落ちる原因は大体がメモリだと思います。
前回もプロセス数が増えた事でメモリが枯渇し
スワップまで使い始めた事でロードアベレージも60ほどまで上昇しました。
なので、maxclientsを少し減らしKeepaliveのタイムアウトを3秒にしました。