PHP - php-fpm - 接続数(再)


 クラウディア


1. 概要
2. 状況
3. 設定
4. 参考サイト

1. 概要

 前ページで、軽く接続数を増やしてみましたが・・・。  まだ、同様のログが出る。  本格的に、細かく設定してみたいと思います。

2. 状況

 現在の状況を確認します。  まず、現在のメモリ使用量。

top
 で軽く見てみます。

last pid: 80166;  load averages:    0.30,    0.48,    0.68; battery: 100%
80 processes:  2 running, 78 sleeping
CPU:  3.4% user,  0.0% nice,  0.2% system,  0.0% interrupt, 96.4% idle
Mem: 532M Active, 9439M Inact, 27M Laundry, 20G Wired, 104K Buf, 1140M Free
ARC: 16G Total, 13G MFU, 946M MRU, 1324K Anon, 220M Header, 1920M Other
     12G Compressed, 36G Uncompressed, 3.00:1 Ratio
Swap: 64G Total, 439M Used, 64G Free
 瞬時値ではありますが。 ・Free: 1,140 MB(純粋な空き) ・Inact: 9,439 MB(非アクティブ。必要になればすぐ解放される実質的な空き) ・ARC: 16 GB(ZFSのキャッシュ。必要に応じて OS が縮小させ、他へ回せます)  とまぁ、10GB 以上の空きはあるようです。  「php-fpm」のメモリ使用量を見てみます。

ps -axm -o rss,command | grep php-fpm | grep -v grep
 この結果が。

 25736 php-fpm: master process (/usr/local/etc/php-fpm.conf) (php-fpm)
146368 php-fpm: pool www (php-fpm)
159584 php-fpm: pool www (php-fpm)
185552 php-fpm: pool www (php-fpm)
 なのですが。  左端が、メモリ使用量だそうで、「KB」単位だそうです。  「php-fpm」というのが、子プロセスだそうで、平均 約 160 MB / 1プロセスといったところでしょうか。  「Laravel」にしては、少し、多いらしい。  「Gemini」伍長の言うことにゃ。  PHP全体で 8GB 程度まで使っても良いと考えるなら・・・。 8,192 MB \div 160 MB ≒ 51  で、50くらいまで増やしても問題ないらしい。

3. 設定


vi /usr/local/etc/php-fpm.d/www.conf
 下記を設定してみます。

pm = dynamic
pm.max_children = 32
pm.start_servers = 12
pm.min_spare_servers = 8
pm.max_spare_servers = 20
pm.max_requests = 500
 設定値をチェックして。

php-fpm -t

[17-Feb-2026 12:13:12] NOTICE: configuration file /usr/local/etc/php-fpm.conf test is successful
 再起動します。

service php_fpm restart
 これで、また様子を見てみます。  一応、「Gemini」伍長の受け売りで、設定値の意味を解説しておきます。
設定値 意味 備考
pm プロセスの割り当て
dynamic で動的に割り当て
static で定義分をいきなり全割り当て
pm.max_children 子プロセス数最大
pm.start_servers 初期起動時の子プロセス数
pm.min_spare_servers 常時スペアとして用意しておくプロセス数
pm.max_spare_servers スペアとして用意しておくプロセスの最大数
pm.max_requests これは下で解説

 「pm.max_requests」というのは、ひとつの子プロセスが、ここに書いてあるリクエストを処理したらいったん終了するということです。
 まんがいち、「php」のプロセスがメモリリークを起こしていても、ある程度のリクエストを処理するといったん終了するので、少なくとも設定したリクエスト数ごとに、メモリは開放することになります。
 デフォルトでは、コメントアウトされていたので、デフォルトの値が 500 かと思っていたらさにあらず。
 有効にしたら、今まで、出ていなかったログが出始めました。
 こんなの。


[17-Feb-2026 14:34:36] NOTICE: [pool www] child 47714 exited with code 0 after 396.849451 seconds from start
[17-Feb-2026 14:34:36] NOTICE: [pool www] child 53429 started
[17-Feb-2026 14:34:41] NOTICE: [pool www] child 49203 exited with code 0 after 299.904156 seconds from start
[17-Feb-2026 14:34:41] NOTICE: [pool www] child 53516 started
[17-Feb-2026 14:35:06] NOTICE: [pool www] child 47957 exited with code 0 after 407.794495 seconds from start
[17-Feb-2026 14:35:06] NOTICE: [pool www] child 53853 started
[17-Feb-2026 14:35:41] NOTICE: [pool www] child 46378 exited with code 0 after 540.980191 seconds from start
[17-Feb-2026 14:35:41] NOTICE: [pool www] child 54302 started
[17-Feb-2026 14:35:50] NOTICE: [pool www] child 48922 exited with code 0 after 384.493048 seconds from start
[17-Feb-2026 14:35:50] NOTICE: [pool www] child 54412 started
[17-Feb-2026 14:37:36] NOTICE: [pool www] child 45945 exited with code 0 after 676.713015 seconds from start
[17-Feb-2026 14:37:36] NOTICE: [pool www] child 55736 started
 「exited with code 0」は、所定のリクエストを処理したので、お役御免で終了しています。  「code 0」なので、正常終了ですわな。  「child ... started」は、終了したプロセスがいるので、代わりのプロセスが起動しているわけです。  「exited」「started」が、頻繁に出るようであり、特にリークを起こしている様子もなければ、「pm.max_requests = 500」を徐々に(いや、倍々?)増やしていけば、ログは少なくなるかと思います。

4. 参考サイト

 本ページは、「Gemini」伍長を参考にさせていただきました。

EaseUS
AbemaTV 無料体験