ここしばらく、nginx + wordpressで動かしている
のDISK IOが高いです。
たまに、以下のエラーが出て
php-fpm you may need to increase pm.start_servers, or pm.min/max_spare_servers
サーバーがダウンすることもあるため、徹底して調査してみました。
目次
php-fpmのエラー you may need to increase pm.start_servers, or pm.min/max_spare_servers
まず、お名前.comのコントロールパネルからリソース状況をチェックします。
ざっとこんな感じになっています。
恒常的にDISK IOが高いタイミングがあります。
また、このDISK IOが高くなるタイミングでphp-fpmが応答しなくなったりします。
/var/log/php-fpm/error.log
を見てみると、こんな感じになっています。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 |
[29-Oct-2015 13:40:15] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 19 idle, and 63 total children [29-Oct-2015 13:40:16] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 17 idle, and 64 total children [29-Oct-2015 13:41:14] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 18 idle, and 80 total children [29-Oct-2015 13:41:40] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 19 idle, and 85 total children [29-Oct-2015 13:42:23] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 17 idle, and 90 total children [29-Oct-2015 13:42:49] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 17 idle, and 98 total children [29-Oct-2015 13:42:50] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 17 idle, and 101 total children [29-Oct-2015 13:43:37] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 19 idle, and 107 total children [29-Oct-2015 13:43:38] WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 19 idle, and 108 total children [29-Oct-2015 13:43:51] WARNING: [pool www] child 1463 exited on signal 9 (SIGKILL) after 50513.861547 seconds from start [29-Oct-2015 13:43:51] NOTICE: [pool www] child 15998 started [29-Oct-2015 13:43:57] WARNING: [pool www] child 1436 exited on signal 9 (SIGKILL) after 50519.935160 seconds from start [29-Oct-2015 13:43:57] NOTICE: [pool www] child 16000 started [29-Oct-2015 13:45:52] WARNING: [pool www] child 1455 exited on signal 9 (SIGKILL) after 50635.391546 seconds from start [29-Oct-2015 13:45:52] NOTICE: [pool www] child 16014 started |
you may need to increase pm.start_servers, or pm.min/max_spare_servers ???
うーん、要するに
pm.start_serversの値か、
または、pm.min_spare_serversとpm.max_spare_serversの値を
変更すればよいのでしょうか。
pm.start_servers とは、起動時に作成される子プロセスの数です。
pm = dynamic の場合 にのみ適用されます。
pm.min/max_spare_servers とはアイドル状態時の子プロセスの最小/最大数です。
pm = dynamic の場合 にのみ適用されます。
/etc/php-fpm.d/www.conf には以下のように書かれていました。
Default Value: pm.start_servers = min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.start_serversのデフォルト値はこの公式のようになるようです。
取り急ぎ、/etc/php-fpm.d/www.confの設定を以下のようにしました。
pm = dynamic
pm.max_children = 300
pm.start_servers = 75
pm.min_spare_servers = 20
pm.max_spare_servers = 150
pm.max_requests = 1000
これで様子を見ます。治るとよいですが。。。
抜本的にエラーを解決できないのか?
この種のエラーは運用で設定値を上げていくしかないようです。
むやみに設定値をあげればよいというものではありません。
ハードウェアのスペックと兼ね合いになります。
Raise it until this warning disappears.
Our settings:
pm.max_children = 256
pm.min_spare_servers = 5
pm.max_spare_servers = 64
pm.max_requests = 2048
「エラーがなくなるまで値を上げろ」ね。。。
ちなみにwww.confに変な値を設定するとphp-fpmが起動しないこともあります。
1 2 3 |
[29-Oct-2015 14:55:19] ALERT: [pool www] pm.min_spare_servers(100) and pm.max_spare_servers(1000) cannot be greater than pm.max_children(100) [29-Oct-2015 14:55:19] ERROR: failed to post process the configuration [29-Oct-2015 14:55:19] ERROR: FPM initialization failed |
これは、pm.max_childrenの値より
pm.min_spare_serversやpm.max_spare_serversの値が高いケースのエラーです。
pm.min_spare_serversやpm.max_spare_serversの値は
pm.max_childrenより低くなければなりません。
ディスクIOの行われているプロセスを特定するiotopコマンド
ところで、LinuxでDISK IOを行っているプロセスを表示するコマンドにiotopコマンドがあります。
iotopはデフォルトではインストールされていないので、yumでインストールします。
1 |
# yum -y install iotop |
iotopコマンドを起動するには、以下のように起動します。
1 |
# iotop --only |
--onlyを入れておくと、実際にIOを行っているプロセスだけを表示するようになります。
こんな感じです。
これでDISK IOを行っているプロセスは特定可能です。
このサーバーの場合、
php-fpm: pool www
nginx: worker process
がディスクIOを行っていることが分かります。
まとめ
この種の問題は、運用で様子を見てみるしかないのですが、最後、どうしようもなくなったら、お名前.com VPS
CPUのコア数を上げる、メモリを上げる、HDDからSDDに変更する、などが効果的なんでしょうか。
さくらのVPSサーバー
↓月額685円からの低価格&高パフォーマンスのVPS、さくらのVPSはコチラ
SSDプランが月々685円から使える!さくらのVPS
コメント