WordPressのメモリ節約にPHPのmemory_limitは無意味

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

先日、サーバダウンが発生し、WordPressのメモリ消費の節約
を現在行っています。
【関連】WordPressがメモリを使い果たしてサーバが落ちてました

メモリ消費の節約と言ってもメモリ消費の多いプラグインを停止
させてるダケですけどね。

PHPでの設定memory_limitは設定してもメモリ消費は抑えられません。

PHPのメモリ節約にPHPのmemory_limitは無意味

https---www.pakutaso.com-assets_c-2015-05-PPW_memori-thumb-1000xauto-13216

memory_limitは使用するメモリの上限を設定する設定。

WordPressがメモリを使用し、memory_limitの上限に達した時は
途中で処理が終了してしまいます。

そうなるとブラウザでの表示は真っ白な状態になります。

memory_limitは指定すれば、それ以上のメモリ消費は避けられますが
WordPressは真っ白になってしまい、メモリ節約には意味がありません。

WordPressのメモリ節約、まずはプラグインから

WordPressのメモリ消費は25MB~30MBほど。

テーマやプラグインによってメモリ消費が増えます。

メモリ消費量の計測は計測用のプラグインを作りました。
【関連】WordPressがメモリを浪費するので使用量を表示するプラグインを作った

プラグインの中には5MB以上メモリを消費するモノもあるので
メモリ消費の多いプラグインを外しました。

私が外したプラグインはこの2つ

  1. Jetpack by WordPress.com
  2. NextScripts: Social Networks Auto-Poster

これにより、18MB程のメモリ節約になりました。
現在、記事ページでメモリ消費は40MB程となっています。

節約出来る量は少ないけど、塵も積もれば山となる

たかが18MBと思っているでしょう?

でもApacheの最大接続数(maxclients)が50でキャッシュ無しの場合
どうでしょうか?

18MB × 50プロセス = 900MB となります。

節約出来た分だけでも1GBのメモリほどとなります。

実際にはそれほどアクセス数も無く、
キャッシュも効くのでそこまでメモリは使用しません。

キャッシュの場合でもApacheの場合プロセスを使い回すので
PHPの処理と同じだけのメモリを確保したままな様な気がします。

使い回したままだと困るのでMaxRequestsPerChildで
50回リクエストを処理したらプロセスが死ぬ様にしています。

プロセスを定期的に殺す事でメモリを開放させています。

あとがき

サーバが落ちる原因は大体がメモリだと思います。

前回もプロセス数が増えた事でメモリが枯渇し
スワップまで使い始めた事でロードアベレージも60ほどまで上昇しました。

なので、maxclientsを少し減らしKeepaliveのタイムアウトを3秒にしました。