負荷試験時に行ったnginxとphp-fpmのパラメータ調整
直近携わった負荷試験にて、nginx + php-fpmのパラメータ設定を行ったので一部調整した内容を記載します。
負荷試験怖い人向けの基本概要の記事もありますので興味ありましたら。
nginx
worker_processess auto;
nginxのworkerプロセスの数です。autoだとCPUコア数に合わせてくれます。
特段CPU数を限定するつもりがないならautoで良いでしょう。
worker_rlimit_nofile 100000;
workerプロセスが開く最大ファイル数
events {
worker_connections 4096;
multi_accept on;
use epoll;
}
- worker_connections:1workerプロセスの最大コネクション数。worker_rlimit_nofileより少なくする必要がある。
- multi_accept on:複数のリクエストを同時に受け付ける。
- use:コネクションの処理方法。Linux2.6以上ではepollが最適らしい
http://nginx.org/en/docs/events.html
epoll
— efficient method used on Linux 2.6+.
sendfile on;
tcp_nopush on;
- sendfile:sendfileを使用してレスポンスを行う。
- tcp_nopush on:レスポンスヘッダとファイル内容をまとめて送信する。少ないパケットで効率が良くなる。
fast_cgi_pass unix:/var/run/php-fpm/php-fpm.sock;
php-fpmへの接続はドメインソケット化。TCPよりは速いでしょう。
ソケットの権限は注意。(後述のphp-fpm側の設定で調整)
その他、nginxではgzip圧縮関連の設定も行ったのですが
設定値を控えてなかったのでここでは割愛します(退職済のため参照できない(´;ω;`)
php-fpm
listen = /var/run/php-fpm/php-fpm.sock
listen.mode = 0666
listen:デフォルトは127.0.0.1:9000になってたものをソケットに。
listen.mode:ソケットの権限設定。0666でnginxからも読み取れるように。
pm = dynamic
pm.max_children = 16
pm.start_servers = 4
pm.min_spare_servers = 4
pm.max_spare_servers = 12
プロセス数の制御を行うパラメータ類です。
pmをdynamicに設定することで、動的にプロセス数が変動します。
各パラメータ設定は下記の意味を持ちます。
- pm.max_children:最大子プロセス数
- pm.start_servers:php-fpm起動時のプロセス数
- pm.min_spare_servers:アイドル時(サーバが暇なとき)に立ち上げておく子プロセスの最小値
- pm.max_spare_servers:アイドル時に立ち上げておく子プロセスの最大値
start_serversがmin_spare_servers未満だったり、max_childrenを超過していると矛盾した設定になるのでエラーになります。
例示の数値は実際にvCPU * 8のマシンで負荷試験を行い、最終的に最もパフォーマンスを出せたものです。
ひとつ設定した際の基準として
- start_servers:max_childrenの25%設定
- min_spare_servers:max_childrenの25%設定
- max_spare_servers:max_childrenの75%設定
という基準を設けました。
そこからmax_childrenを試験毎に調整し、最もパフォーマンスが出た16に合わせて調整した形になります。
24(vcpu8 の3倍)や32(vcpu8 の 4倍)なども試してみたのですが
プロセスが増やせば単純にパフォーマンス向上するかというとそうでもないようでした。
絶対的な正解はないので、繰り返し計測してアプリケーションごとの最適解を出すことになるでしょう。
例示はあくまで一つの例として捉えてください。
php-fpmはまだまだお友達レベルまで仲良くはなれてないので、機会あればまた知見深めたいところです。
Discussion