CrystalSnowman.com

あなたの時間節約につながる情報を提供します

CentOS php-fpmの設定を変更してメモリ消費を減らした方法

htop

最近ブログサイトのレスポンスが悪く、ページが開くまで5秒以上かかっていました。調査するとphp-fpmのプロセスが多数起動し、メモリが大量に消費されていました。
設定変更しphp-fpmを再起動したところパフォーマンスが回復しました。その方法を紹介します。

きっかけ

以前は2秒前後でどのページも開いていたのですが、最近は5秒前後かかるようになっていました。Javascriptの読み込み場所を変更したり、不要なプラグインを削ったり、スパムコメントをゴミ箱から削除しても改善されません。

たまたまOracleのmysql講座を受講してメモリ消費量が原因ではないかとひらめきました。

原因調査

CentOSにログインしてmysqlのメモリ使用量を調べてみます。

mysqlのメモリ消費量は120MBです。たいしたことなさそうです。

次にphpも調べてみました。

「php-fpm」のプロセスが大量に表示されていました。30個以上です。
原因はこれでした。一つ35MBのメモリ消費としても合計1GB超えています。
さくらVPSの1GBコースを契約中のこのサイトでは致命的です。

htopについて

調査中に知った「htop」をインストールして調べてみました。
「htop」は「top」の強化版です。
こちらのサイトを参考にさせていただきました。

htopを使ってサーバのプロセスの状態を詳しく見る方法 | さぶみっと!JAPAN

「htop」を実行します。

htop
htopのサンプルイメージ

このイメージは問題発生時のイメージではないのですが、当時は上のメモリのバーが800/993MBとなり、下のSwpのバーが赤く表示されていました。
つまり1GBのメモリが枯渇してswap領域まで消費されていました。これでは遅くなって当然です。

「top」でも同じ情報を表示しているのですが、グラフのバーで表示されたほうが分かりやすいです。

また上の数字の1と2のバーはCPU数とその使用率を表しています。
下のプロセス一覧にnginxのworker processも二つ表示されていることが確認できます。
以前CPU数に合わせてworker processも二つにしたのですが、その内容が確認できます。
nginxのworker_processes設定を見直してパフォーマンス改善する方法

ちなみに「RES」項目は物理メモリ消費を表しています。「F5キー」を押すとプロセスが階層構造で表示されます。

解決方法

php-fpmの再起動

php-fpmを再起動してメモリを解放します。

htopで確認するとメモリ消費量が激減し、ブログページも以前のように2秒前後で表示されるようになりました。

Swap領域の解放

メモリは解放され正常な状態になりましたが、Swap領域が消費されています。Swapはハードディスクにアクセスするため、メモリより激しく遅いです。Swap領域が存在すると、そこを使おうとするので領域をクリアします。

こちらのサイトを参考にさせていただきました。
[Linux]Swap領域をクリアする方法 – DQNEO起業日記

Swap usedの容量よりも実メモリの空き容量の方が大きかったのでこのコマンドを実行しました。

数秒後コマンドが完了しました。htopで確認すると無事Swap領域が無くなっていました。

php-fpmの設定確認

メモリを解放しただけでは、しばらくたつと再び激重な状態になってしまいます。php-fpmを設定変更して同じことが起きないようにします。

php-fpmの設定ファイルを見てみます。
設定ファイルは「/etc/php-fpm.d/www.conf」です。

「www.conf」のプロセス関連部分を見てみるとこんな状態でした。

1行目では「dynamic」となっているためプロセス数が動的に設定されます。「max_children」、「start_servers」、「min_spare_servers」、「max_spare_servers」の値を元に設定されます。

2行目ではプロセスを最大50個まで起動します。

3行目ではphp-fpmの初回起動時に起動するプロセス数を設定します。

4行目ではアイドル時に起動しておくプロセス数を設定します。この値を下回ると自動でプロセスが起動します。

5行目ではアイドル時に起動可能なプロセス数を設定します。アイドル時にこの値を超えたプロセスが存在していると自動でkillされます。

このような設定になっていたためphp-fpmのプロセスが30個以上起動してメモリを圧迫していました。

php-fpmの設定変更

php-fpmの設定ファイルを修正します。

こちらを参考にさせていただきました。
Nginxが重い? NginxにおけるPHP-FPMの設定 | WordPress入門倶楽部

まず起動するプロセス数が固定される設定をしてみました。

「static」にすると「max_children」で指定したプロセス数が起動します。ここでは10個のプロセスが起動し、10を超えたり、下回ったりしない設定になります。最初からメモリを固定値で確保するためパフォーマンスがよいそうです。メモリに余裕がある場合この設定がよいと思います。

最後の「max_requests」は各プロセスに対するリクエスト数が設定値を超えるとプロセスを再起動する設定です。500にしてみました。

現在の設定

ただこのサイトのサーバのメモリは1GBなので、節約のため動的にプロセス数が変動するdynamicにしてみました。

php-fpm起動直後は4プロセス起動し、最大10まで起動する設定です。
ちょっとこれで様子を見てみます。
今のところパフォーマンスの悪さは感じられません。

htop php-fpm

まとめ

php-fpmの設定を見直すことでメモリの節約を行いました。パフォーマンスも改善されました。またhtopで問題あるプロセスが把握しやすくなりました。
パフォーマンス問題で困っておられる方は一度設定を見直してみてはいかがでしょうか。


Top