Wordpress(php-fpm)のボトルネックを探る

この記事では、原因を探るためのプロセスをメモしてるので、直接の問題解決に対してのアプローチとしてはいささか冗長であるので、結論を先に書くとプラグインのせいでした。

問題の解決方法だけ知りたい方はプラグインのところまでお読み飛ばしください。


サーバーが重いな...。

と思って$ top -aで%MEM順に見てみると、うちほぼ上位をphp-fpmのプロセスが占めている。しかもそれぞれ10%強ずつほど。

なんじゃこりゃー。

ということで、ひとまず一旦全部のプロセスをkill

sudo kill `ps -ef | grep php-fpm | awk '{print $2;}'`

とか。 

解決策としては下のような案が

まずはphp-fpmの設定を見直し

まずはphp-fpmのプロセス管理周りの設定を中心に抑えめに調整してみました。(結論で言えば、これでは解決してません...)

  • プロセス管理方法

pmでは、プロセスマネージャがプロセスの数を管理する方法をどうするか、を設定できます。

メモリ消費をできるだけ抑えたいので、staticではなく、dynamicにしておきます。ondemandという値もあります。

pm = dynamic

これはdynamicの場合。staticとdynamicについては、

staticは固定値でメモリを保有するので処理速度は高いですが、 dynamicは低負荷の場合メモリ消費量が少ないので、他の処理にメモリを割り当てることでができます。つまり動的にメモリを自動的に制御できます。 via: http://wp.nyumon.club/1468.html

ということらしいです。

  • 最大子プロセス数

子プロセス数の最大値をデフォルトの50から15に減らしておきます。

pm.max_children = 15
  • アイドル状態の最大プロセス数

アイドル状態のサーバープロセス数の最大値を35 => 15に変更します。

pm.max_spare_servers = 15
  • 各子プロセスの最大リクエスト数

各子プロセスの最大リクエスト回数を調整します。コメントアウトされてるので、追加します。

pm.max_requests = 512

この設定に関しては、

各子プロセスが、再起動するまでに実行するリクエスト数。 サードパーティのライブラリにおけるメモリリークの回避策として便利です。 再起動せずにずっとリクエストを処理させる場合は ‘0’ を指定します。 PHP_FCGI_MAX_REQUESTS と同じです。デフォルト値: 0 via: http://blog.offline-net.com/2015/05/09/centos-65-nginx-php-fp%EF%BD%8D-memory-tunables/

とのことです。なるほどー。

Wordpress側に何か問題が?

と、設定してみましたが、少しCPU負荷の平均値が下がったくらいで、根本的な解決にはなりませんでした。

ということで残りはnginxの設定かWordpressの問題か。

そもそも、httpリクエストを飛ばしてないのにこんなにメモリがドカドカ食われるってことは、nginxの設定ではなくてwordpressの問題なのかもとも思った。

例えば、これ...?

  • WordPress 4.3でメモリ消費量増大・CPU高負荷になる重大なバグあり。直し方を一応解説。

http://enjoypclife.net/2015/08/31/how-to-fix-wordpress-4-3-high-cpu-load/

  • WordPress4.3で急にサイトが重くなったときの対処方法(php-fpm暴走)

http://personal-studio9.com/wordpress43-bug/

Wordpressのバージョンを、wp-includes/version.phpで確認してみると、4.3.1ということで、最新だ。

プラグイン

4.3系の不具合を疑ってモンキーパッチしてしまう前に、先にプラグインが大丈夫かどうか確かめてみることにした。

ひとまず、何にせよ原因がどこかのプラグインかどうかを知るために、全部プラグインをoffにしてCPUとメモリを監視してみる。

php-fpmとnginxをrestartしてモニタの前で息をひそめる...

Screenshot 2015-10-27 20.43.56.png

ほとんどがphp-fpmのプロセス、あとはmysqldくらいで200MBちょいを推移してる。安定し始めた。

どうやらビンゴっぽい。うーーーむ、どうやらプラグインがわるさしてるみたいだ。

ということでひとつずつプラグインのon/offをぽちぽちしながらまたモニタの前で息をひそめる。。。

最初の7個のうちどれかで、一桁台だった4つくらいのphp-fpmプロセスたちがそれぞれMEM占有率11%くらいに。

メモリ専有量と、メモリ専有率の増減をみて重い印象だったプラグインを挙げてみる

  • PS Auto Sitemap
  • Broken Link Checker
  • Contact Form 7
  • EWWW Image Optimizer
  • Google XML Sitemaps
  • P3 (Plugin Performance Profiler)

ちょいちょいメモリ食うプラグインはあったものの、どこかが圧倒的にわるさをしているというわけではなく全体としてかさばることで結局php-fpmの食うメモリが700MBとかいっちゃうということみたいだった。

Screenshot 2015-10-27 21.56.40.png

ふーーむ。Wordpressはどちらかというと本体ではなくてプラグインでメモリくっちゃう感じなんだなー。勉強になりました。

参考サイト

http://www.crystalsnowman.com/?p=1309

htopよい

http://www.submit.ne.jp/379