とーますメモ

Ruby on Rails / Goなどの学習メモ

【PHP-FPM】適切なプロセス設定について

色んなサイトを見て知ったことは、適切な設定を行うためにはまず以下のことを知る必要があるということ。

・使用可能なメモリ量
・PHPプロセスが確保している平均メモリ量

上記の内容を把握したのち、その内容をベースに以下の値を適切な値に設定する。

・pm.max_children
・pm.start_servers
・pm.min_spare_server
・pm.max_spare_server

ちなみに試した環境は2Gメモリ、1coreのUbuntu環境。
またphp-fpmのバージョンは7.2を利用。

1)使用可能なメモリ量の把握

単純に以下のコマンドを打ち

free -h

表示される「available」の箇所を見ればよい。
自分の場合、1.5Gと表示されていた。
※ free(239M) + buff/cache(1.4G) = 約1.5G

[参考]
Linuxのfreeコマンドの見方 – 日々、コレ勉強

使用可能メモリ量は1.5Gから、念の為10%(150MB)のバッファーを取って約1.35GBになったが
更に切りを良くするために最終的に1.3GBにする。

将来的に他のミドルウェアなどでメモリを消費する可能性がある場合は、予め大きなバッファを引いておく。

2)PHPプロセスが確保している平均メモリ量の把握

全てのfpmプロセスが確保したメモリ量は以下のコマンドで確認できる

$ ps -ylC php-fpm7.2 --sort:rss
||>

結果は以下
>||
S   UID   PID  PPID  C PRI  NI   RSS    SZ WCHAN  TTY          TIME CMD
S     0 16801     1  0  80   0 28804 115104 -     ?        00:00:00 php-fpm7.2
S    33 20281 16801  0  80   0 39456 117998 -     ?        00:00:00 php-fpm7.2
S    33 20284 16801  0  80   0 39548 117999 -     ?        00:00:00 php-fpm7.2
S    33 20285 16801  0  80   0 39568 117998 -     ?        00:00:00 php-fpm7.2
S    33 20242 16801  0  80   0 39620 118034 -     ?        00:00:01 php-fpm7.2
S    33 20277 16801  0  80   0 39632 117998 -     ?        00:00:00 php-fpm7.2
S    33 20141 16801  0  80   0 39720 118064 -     ?        00:00:01 php-fpm7.2
S    33 20139 16801  0  80   0 39728 118064 -     ?        00:00:01 php-fpm7.2
S    33 20120 16801  0  80   0 39908 118097 -     ?        00:00:02 php-fpm7.2
S    33 20117 16801  0  80   0 39936 118097 -     ?        00:00:02 php-fpm7.2
S    33 20114 16801  0  80   0 39952 118097 -     ?        00:00:02 php-fpm7.2
S    33 20118 16801  0  80   0 40032 118097 -     ?        00:00:02 php-fpm7.2
S    33 20278 16801  0  80   0 42800 118071 -     ?        00:00:00 php-fpm7.2
S    33 20140 16801  0  80   0 43020 118138 -     ?        00:00:01 php-fpm7.2

この平均を以下のコマンドで計算する

$ ps --no-headers -o "rss,cmd" -C php-fpm7.2 | awk '{ sum+=$1 } END { printf ("%d%s\n", sum/NR/1024,"M") }'

その結果プロセスの平均メモリ使用量が38MBとわかった。

[参考]
Adjusting child processes for PHP-FPM (Nginx) · GitHub

※ ちなみにPHPのmemory_limitを元に計算する方法もありかも。
これなら最大値で計算できる。
[参考]
[PHP] PHP-FPMのチューニングをするときに考えたことと行ったこと - Qiita

3)適切な設定値を計算

pm.max_childrenの値は上記で出した値を用いて、以下のように計算する。

pm.max_children = 使用可能メモリ量 / プロセスの平均メモリ使用量

pm.max_children = 1300MB / 38MB = 34.210526316 = 34

その他の項目は以下のサイトさんの指標に従うと・・・
Finding the correct pm.max_children settings for PHP-FPM - Chris Moore

pm.start_servers = [25% of max_children]
pm.min_spare_servers = [25% of max_children]
pm.max_spare_servers = [75% of max_children]

pm.start_servers = 34 × 0.25 = 8.5 = 8
pm.min_spare_servers = 34 × 0.25 = 8.5 = 8
pm.max_spare_servers = 34 × 0.75 = 25.5 = 25

結果以下の設定を行うに至った。
/etc/php/7.2/fpm/pool.d/www.conf

pm.max_children = 34
pm.start_servers = 8
pm.min_spare_servers = 8
pm.max_spare_servers = 25

※ちなみに以下の計算機も便利。
PHP-FPM Process Caluculator

4)ApacheBenchでどれぐらいまでのアクセスが許容可能かは把握

Macにはデフォルトで「ab」コマンドが入っているので試してみた。
thoames.hatenadiary.jp

例)100ユーザが同時に1リクエストを(合計100リクエスト)を行う負荷テスト

ab -n 100 -c 100 [テストするページのURL]

現在の環境に場合120以上のユーザが同時に1リクエストずつアクセスするとログにエラーが表示されたので、この辺がこのサーバのパフォーマンスということなのだろうか。

アクセスが増えてくるようならサーバ増強を行う必要があるだろう。

[その他参考]
nginxに変更したらメモリ不足なったので、php-fpmを設定を見直し | ex1-lab
[PHP] PHP-FPMのチューニングをするときに考えたことと行ったこと - Qiita