一番シンプルなPHP-FPMチューニング
こんにちは。AITPの大野です。
PHP-FPMは、PHP FastCGI Process Managerの略で、NginxなどのWebサーバーとPHPを連携するためのプロセスマネージャーです。
PHP-FPMがあらかじめ子プロセスを起動してプールさせておくので、プロセス起動のオーバーヘッドが少なかったり、メモリへの急激な過負荷を防いだりと非常に便利な仕組みになっています。
しかし適切に設定を行わないと、逆にPHP-FPMがサーバーの負荷を上げてしまう可能性もありますが、設定方法が複数あるのでパッと見複雑に見えてしまいます。
今日は設定方法のおさらいをして、その上で一番簡単な設定方法を紹介したいと思います。
TL;DR
いきなりですがほとんどの場合下記の設定で十分かと思います。
pm = static
pm.max_children = {CPUのコア数}各設定の詳細とチューニングの考え方は以下で述べます。
まずはプロセス制御方式を選ぶ
プロセス制御の方法は三つ用意されいてどれか一つを選ぶようになっています。
それぞれは以下のような特徴があります。
static
プロセス数を常に一定に固定する方法です。
プロセス数の増減がないのでCPUに優しいですが、アクセスがない時も常にプロセスがプールされているので、メモリは常に占有し続けます。
dynamic
最低プロセス数と最大プロセス数を決めておき、リクエストが増えるに従ってプールするプロセス数を増やす方式です。
プロセス数を増やす時に負荷がかかりますが、リクエストを処理し終わったプロセスは少し経つとキルされる(キル条件は指定可能)ため、処理速度をある程度満たしながらメモリの節約ができる設定です。
ondemand
dynamicと同様に最大プロセス数を決めておき、リクエストが増えるに従ってプールするプロセス数を増やす方式です。
dynamicでは作成されたプロセスがある程度使いまわされますが、ondemandでは処理が終わった時点で削除されます。
CPUに負荷がかかりやすく処理速度が落ちる可能性がありますが、プロセスがキルされることでメモリの占有率が下がることが特徴です。
どれを選べばよい?
サーバーの用途とスペックによって選択するべき方式は変わってきますが、たとえば以下のようなケースが考えられます。
単一アプリケーションのサーバー
たとえばそのサーバーでwordpressしか動かさないと決まっていて、他の処理のためにリソースを確保する必要がない場合、サーバーリソースを常に使い続けても問題ないと判断できます。
この場合はstaticを選び、メモリ性能上限までプロセス数を確保しておくことでパフォーマンスが出しやすいでしょう。
複数アプリケーションのサーバー
PHP以外にもやるべき処理があり、できるだけメモリを残しておきたいのであれば ondemand か dynamicを選ぶ方が良さそうです。
処理速度が多少落ちてもサーバーの可用性を確保しておきたいなら ondemandを、処理速度はある程度確保しつつメモリも節約するのであれば dynamic が良いでしょう。
詳細パラメーターの設定方法
php-fpmのconfファイルで詳細なパラメーターを指定でき、その値によってプロセス管理のパフォーマンスなどが変わってきます。
設定ファイルは /etc/php-fpm.d/以下にあります。
以下にプロセス制御に関わるパラメーターを解説していきます。
pm
プロセス管理方式を選択します。
static, dynamic もしくは ondemandの中から指定します。
pm.max_children
子プロセスを最大でいくつプールさせるかの設定です。
基本的にCPUのコア数に合わせる方法が楽で、かつ多くの場合にパフォーマンスが出るはずです。
これは プールされているプロセスが多くてもCPUのコア数以上のものはほとんど使われない ので、CPUのコア数を超えてプロセスを常駐させてもリソースの無駄になってしまうこと多いということです。
またプールする数が多すぎた場合、メモリスワップが発生しサーバーのレスポンスが悪化することなども考えられます。
サーバーが処理できる最低限の数に設定すると良い結果が得られるでしょう。
dynamic 固有のパラメーター群
- pm.start_servers (起動時に生成されるプロセスの数)
- pm.min_spare_servers (プールする最小プロセス数)
- pm.max_spare_servers (プールする最大プロセス数)
- pm.max_requests (各プロセスが処理するリクエスト数)
上記のパラメーターは dynamic方式を選んだ時にだけ有効になります。
dynamicを選んだ際はサーバースペックに合わせて上記も設定する必要がありますが、特に pm.max_requests は設定をしておいた方が良いです。
これを設定しないとプロセスがキルされることがなく、一度増えたプロセスが残り続けてしまうことになるので、何らかの値を設定することをお勧めします。
まとめ
色々と設定方法はあるものの、ほとんどの場合は static にして CPUのコア数に合わせて max_childrenを設定すれば十分であると思います。
特に最近のサーバーはコンテナなどで仮想化されていて単一のアプリケーションしか動かないことが多いので、dynamic設定で複雑なパラメーターを弄るケースは少ないのでは?と感じます。
以上簡単ですがphp-fpmの設定方法でした。参考になれば幸いです!