• このエントリーをはてなブックマークに追加

wordpress+nginxの環境でphp-fpmがメモリを使い切る問題

  • このエントリーをはてなブックマークに追加

PHP-logo.svg
zaco muraです。

弊ブログもお陰様でアクセスが伸びてきており、多い時には1万PV/日くらいまで来ております。それに伴い、開設当初には起こらなかった問題が出てくるようになりました。

その一つが、メモリ枯渇によるレスポンスタイムの悪化です。

今回はその原因と対処について書きたいと思います。

スポンサーリンク
Sponsords Link

状況

このブログには月に数回アクセスが多くなるタイミングがあります。

今回たまたまそのタイミングにアクセスしたところ、応答が遅くタイムアウトしてしまいました。

不安に思いサーバにログインしたところ、メモリが枯渇しswapが発生している状況でした。


(補足:swapとは)
Linuxではメモリを使い切ると、メモリ上の情報をswapと呼ばれるHDD上の領域に書き出し、退避させます。
HDDの書き込み/読み込み速度はメモリと比較し桁違いに遅いため、swapが発生してしまうとサーバの動作がものすごく遅くなってしまう、という事象です。

ちなみに使っている環境は
・centos6
・wordpress
・nginx
・php-fpm
という環境です。

原因は?

topコマンドで見たところ、php-fpmプロセスがメモリの大半を使っていることがわかりました。(ちなみに、topコマンド中に M と押すとメモリ順にソートされる)
php-fpm

このphp-fpmをほぼデフォルト設定で使っていたのですが、動的に子プロセスが生成され、メモリを際限無く使ってしまったということが原因だったようです。

応急対処

とりあえず、php-fpmのプロセスを再起動することで一時的に復旧しました。

[root@server ~]# /etc/init.d/php-fpm restart

これで再度ページを開くとすぐに表示されました。

しかし、アクセスが増えるにつれ再びメモリが枯渇し、やがてswapが発生してしまいました。

根本対処

再発させないためにはphp-fpmの設定変更をする必要があります。
変更の内容としては子プロセスの数を固定させることでメモリ使用量を抑制させる、ということです。

このやり方では、アクセス数が少ない時もメモリを(無駄に)一定量使ってしまうというデメリットもありますが、弊ブログの環境ではメモリを抑制するというメリットのほうが大きいと判断し、設定変更しました。

やり方としては、以下の設定を変えればOKです。

[root@server ~]# vim /etc/php-fpm.d/www.conf
#---------------------------------------
### 子プロセスの管理方法。staticで静的に数を決める
;pm = dynamic #<==元々の行をコメントアウト
pm = static

### 子プロセスの最大数。元々15だったのを半分にした
;pm.max_children = 15 #<== コメントアウト
pm.max_children = 7 
#---------------------------------------

ちなみに子プロセスの数ですが、実環境で見たところ1プロセスあたり約90MBのメモリを使ってますので、7プロセスでおよそ650MB程度メモリを専有します。

設定変更が完了したら、php-fpmプロセスをリスタートします。

[root@server ~]# /etc/init.d/php-fpm restart

これで数日間様子を見ていますが、今のところメモリ枯渇やその他の問題は起きていません。

少ないリソースをやりくりするのは本来エンジニアの腕の見せどころなのですが、いろんなパーツが安くなっている昨今、そういったチューニングの機会もなかなか無いよな~と思ったひとときでした。

スポンサーリンク
Sponsords Link
  • このエントリーをはてなブックマークに追加

ZacoDesign

スポンサーリンク
Sponsords Link