下記のようなエラーがでたので、php-fpmの設定を調整します。
[pool www-data] server reached pm.max_children setting (5), consider raising it [pool www-data] seems busy (you may need to increase pm.start_servers, or pm.min/max_spare_servers), spawning 16 children, there are 0 idle, and 7 total children
設定ファイルの場所
私はphpbrewを使っているので、下記でした。
$ phpbrew fpm which/opt/phpbrew/php/php-7.1.4/sbin/php-fpm $ vim /opt/phpbrew/php/php-7.1.4/etc/php-fpm.d/www.conf
各設定の意味
ここに説明があります。
pm.max_children
pm が static の場合は作成される子プロセスの数、 pm が dynamic の場合は作成される子プロセスの最大数。 このオプションは必須です。
このオプションは、同時に処理できるリクエストの最大数を設定します。
pm.start_servers
起動時に作成される子プロセスの数。pm が dynamic の場合にのみ使います。デフォルト値: min_spare_servers + (max_spare_servers - min_spare_servers) / 2
pm.min_spare_servers
アイドル状態のサーバープロセス数の最小値。 pm が dynamic の場合にのみ使います。 また、この場合には必須となります。
pm.max_spare_servers
アイドル状態のサーバープロセス数の最大値。 pm が dynamic の場合にのみ使います。 また、この場合には必須となります。
pm.max_requests
各子プロセスが、再起動するまでに実行するリクエスト数。 サードパーティのライブラリにおけるメモリリークの回避策として便利です。 再起動せずにずっとリクエストを処理させる場合は '0' を指定します。 PHP_FCGI_MAX_REQUESTS と同じです。デフォルト値: 0
適正値は?
めっちゃ詳しい記事みつけた。 PHP BLT #6 でphp-fpmのチューニングについてお話しました #phpblt
なるほどー。pmはstaticで、max_childrenは、コア数の2倍くらいがいいのか。ところで、自分のコア数は何だったかな?と思ったら1だった。。2コアくらいだと設定変えてもほとんど意味ないらしい。とりあえず2コアにするか。。
検証してみる
でもこの記事だと、CPU1でも10プロセスくらいに上げると良くなるとか書いてあるので、やっぱり自分でも試してみたいと思います。
とりあえず、下記をやってみた。
pm = static
pm.max_children = 10
pm.max_requests = 500
$ ab -l -n 1000 -c 1 https://xxx.com
全然終わらなくてうける。1秒1アクセスみたいな感じだから、1万秒かかるわ。2.8時間。
$ ab -l -n 1000 -c 50 https://xxx.com
徐々に同時接続数のcを上げていったけど、一応Requests per secondは、順調にcを上げるほど上がっていった。 最初は、1くらいだったけど、正比例する感じで、上がっていき、cを30にしたら、23くらいになって、c50だと、32だった。c50のとき、cpuは70%くらい使ってた。 まあ、これでいいか。。一応max_childrenを20にしてみようかな。
max_childrenを20にしたら、c50の場合に、28になった。下がった。じゃあmax_children5にしてみようかな。 max_childrenを5にして、c10の場合、11になった。変わらない。 c50だと、26になった。あんまり変わらない。cpuは変わらず70%くらい最大で使ってた。 要するにやっぱり設定を変えてもあんまり変わらないってことかな。。
とりあえず、下記にすることにした。
pm = static
pm.max_children = 10
pm.max_requests = 500
RPS
Request Per Secondはrpsと略すらしい。分だとrpm。ちなみに、googleのrpsはどうなんだろうかと思った。
$ ab -n 1000 -c 50 https://google.com/
rpsは、236でした。あんまり高くないような。。