php-fpmのエラーログに出る「seems busy」は、待機中のワーカーが足りなくなったのでphp-fpmが自動で増やした、という通知です。この警告だけなら対応は不要で、同じ時間帯に「max_children」の警告や5xxの応答が出ていないかで判断します。
実際に出たログは次の通りです。数秒のあいだに3回出て、プロセスが15個から31個まで増えています。
WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 1 idle, and 15 total children
WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 8 children, there are 0 idle, and 26 total children
WARNING: [pool www] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 0 idle, and 31 total children
警告の意味
pm = dynamicのphp-fpmは、待機中のワーカー数がpm.min_spare_serversを下回ると新しいワーカーを起動します。その際、一度に起動する数が多いとこの警告を出します。リクエストを断ったという意味ではなく、増やしている最中だという報告です。
対応が必要かを判断する3つの確認
本当に困るのは、ワーカーが上限のpm.max_childrenに達して、新しいリクエストを待たせるようになった状態です。そのときは次の形式の警告が別に出ます(括弧内は設定値)。
WARNING: [pool www] server reached pm.max_children setting (80), consider raising it
判断は次の順で行います。
- 同じエラーログに「server reached pm.max_children」が出ていないか。出ていれば上限に達しているので、メモリの空きを見て
pm.max_childrenを見直します。 - 同じ時刻のアクセスログに502・503・504が出ていないか。出ていれば利用者に影響が出ています。
- 警告の時刻にアクセスが集中していないか。普段より数倍のリクエストが来ていて、1と2が無ければ、php-fpmが想定通りに対応しただけです。
冒頭のログはこの3つ目に該当し、その1分間に普段の4倍ほどのリクエストが来ていました。max_childrenの警告も5xxも無く、サーバーの負荷も低いままでした。過去のログでも月に数回出る程度だったので、設定は変えていません。
警告を減らしたいとき
アクセスの山が日常的に来るなら、pm.start_serversとpm.min_spare_serversを上げて、待機させておくワーカーを増やします。待機中のワーカーもメモリを使うので、1プロセスあたりの使用量と空きメモリを見て決めます。