前回php-fpm周りの設定で「そんなにプロセスいらないよー」的な講釈を垂れてみましたが、その後全然設定が落ち着かず試行錯誤し続けていますw
php-fpmがメモリリークしてるのか、ちょっとしたことでLoad Averageが上がってサーバのパフォーマンスが落ちる、という状況に・・・。
php-fpmの設定ですったもんだしています
前回記事はこれです。
実際これまではphp-fpmの設定はpm = static
で、pm.max_children = 7
、pm.max_requests = 1000
で終わり、だったんですが・・・
ここ最近はプロセス数が上限に達したと思ったらそこから落ちなくなって、mysqlのqueryが遅くなる、という連鎖に陥っています。
muninのphp-fpmの月間グラフはこんな感じ。
オレンジがpm_.max_childrenの設定値、青が空きスロット、緑が稼働スロット。前半は安定しているのがお分かりいただけるかと。Wordpressでnginx+php-fpmだとphpのお仕事は
- 管理画面の処理
- 新規投稿やロングテールの検索結果から来たレア記事の再生成
- 検索の処理
くらいのものなので結構暇なんです。一度でも見られた記事はnginx側でキャッシュされているのでしばらくの間(設定に依る)は生成することがありません。
ところが・・・グラフ後半から変にプロセス数が天井に届きだしてそのまま張り付きになっています。今度はmysqlのグラフ。同じくby monthです。
こちらは緑がSELECT、青がcache_hitsで縦が応答速度です。一時的におっそろしく応答速度が悪化しているのが分かると思います。先程のphp-fpmのグラフと重ねてみると一目瞭然。ピッタリ重なります。白っぽいハイライトがmysqlで、手前に見えるphp-fpmの緑と重なっています。
つまりphp-fpm側でプロセスが天井に達するとmysqlのパフォーマンスが下がる、ということですね。メモリを食っちゃってるんだと思います。そこからプロセスの上限を変えたりpm = staticをdynamicやondemandにしたりしてみましたが改善せず。というか幾つかおかしな状況まで付いてきています。
設定調整中のphp-fpmのおかしな挙動
とりあえず色々設定を試した試行錯誤の記録です。
プロセス上限の変更
通常 pm.max_children = 7
だった設定を10とかに上げてみましたが、それでも上限に達するとそこから触りっぱなしになる状況は変わらず。
max_requestsの変更
pm.max_requestsは、指定した回数プロセスが処理を終えると再起動する、という「メモリリーク」対策として一般的なものですが、pm.max_requests = 1000
の設定を500に変えても改善はしませんでした。
途中、pm = dynamicに指定しながら、max_children = 10、min_children = 10、みたいな「実質固定」も試してみましたが意味なし。とにかくプロセスが上限に達すると飽和する、みたいな状況は変わりません。
WordPressのプラグインの見直し
調べている中で、WordPressの特定バージョン(4.3だったかな?)や特定のプラグインでメモリを膨大に使うものがある、という情報もあったので、そちらも試してみましたが効果なし。
気になるのはこれがここ最近急に出だしたことです。php-fpmかmysqlのアップデートでなんかあった・・・?
現在の対応
とにかくレスポンスが悪いのは困るので、今は仕方なくcronでservice php-fpm restart
で一定時間ごとに再起動しています。
ちょっと困ってますね・・・。
コメント
[…] php-fpmがメモリリークしてる?結局設定が落ち着かない件。 […]