Logicky BLOG

Logickyの開発ブログです

  • Javascript
  • Python
  • PHP
  • Go
  • OS・サーバ
  • 機械学習
  • つくったもの
  • 数学
  • アルゴリズム
  • Logicky

php-fpmの設定

下記のようなエラーがでたので、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でした。あんまり高くないような。。

  • Javascript
  • Python
  • PHP
  • Go
  • OS・サーバ
  • 機械学習
  • つくったもの
  • 数学
  • アルゴリズム
  • Logicky