nginxに変更したらメモリ不足なったので、php-fpmを設定を見直し

2019-08-08

ApacheからNginxに変更したらサーバーが定期的に落ちる

VPSをサーバーをLightsailに変更した際に、Apacheを使っていたWEBサーバーをnginxに変更しました。始めは問題なく動作していたのですが、しばらくするとNetworkManagerが落ちるのでSSHでログインもできないなので、サーバーのインスタンスを停止・起動しないと復旧しない事が多くなってきました。

落ちる直前のCPUとかのメモリとリソース監視のグラフを見ると、物理メモリが使いつくされ、swap領域で限界まで使われている状況でした。メモリ不足でサーバーの定期的に落ちていたと推測されるので、多くのメモリを使っているサービスは、おそらくnginx + php-fpm が怪しいのそのあたりを調べると、php-fpm の設定を初期値のままだとメモリ不足になる症状のあったので、php-fpm の設定を見直しました。

php-fpmで使用しているメモリを調べて最適な設定に見直す

まずは現在のサーバーのメモリが物理メモリが「1G」でswapは「2G」です。php-fpmのメモリの使用状況は「ps」コマンドで調べます

「RSS」の値が、プロセスが確保している物理メモリサイズとなるので、php-fpmで使用しているメモリは30MB~50MBとなります。

今の状態では、20個くらいphp-fpmが起動しているで、その平均を計算するのに「awk」コマンドで計算してみます

38MBですので、計算しやすいように40MBとします。今で20個くらい使っているので20×40MB=800MB。ほぼ物理メモリを使っている状態です。

初期値のphp-fpmで子プロセスとメモリ関連の設定は以下のようです

  • pm = dynamic dynamicの設定だと、動的に子プロセスが変わっていきます
  • pm.max_children = 50 子プロセスの最大数です
  • pm.start_servers = 5 起動時のプロセス数です
  • pm.min_spare_servers = 5 待機中(アイドル時)に起動しているプロセスの最小値です
  • pm.max_spare_servers = 35 待機中(アイドル時)に起動しているのプロセスの最大値です。余剰分のプロセスはアイドル時にkillされます

初期値だと最大が50個なので、メモリの使用量は40Mとすると2GMBのメモリ状況となります。swap領域と物理メモリでギリギリの設定です。

待機中の最大プロセスの値の「pm.max_spare_servers」を35から30に変更して以下の値にして様子をみることのしました

php-fpmがメモリ不足時のログ

php-fpmが子プロセスが最大値になった時のログですが、以下のエラーが出力されていました

待機中の子プロセスが最大値に超えて使い切ってますのようなメッセージです。php-fpmの子プロセスが使い切った時にメモリが不足してNetworkManagerが落ちた状況が考えられます

swap領域を監視して、空きが少なったらメール・nginx,php-fpmを再起動する

swap領域の空きが少なったら、メールしてかなりswapの空きがなくなったら、nginxとphp-fpmを再起動すれば、メモリ不足でサーバーが落ちる状況が解決できるかもと思って、以下のスクリプトを作ってcronで定期的に実行するようにしました。

swapの使用率を監視して、50%を超えたらメモリ状況の内容を「freee」コマンドで取得してその内容をメールするようにします。また、70%超えたらnginxとphp-fpmを再起動するようにしています

スポンサーリンク