PHP-FPMとは
PHP-FPM(PHP FastCGI Process Manager)は、webサーバー上でphpを実行するツールのことです。通常はリクエストのたびにページを生成してレスポンスとしてクライアントへ返します。しかし、毎回ページを生成していては非効率なので、あらかじめプロセスを起動しておいて効率よくリクエストを処理する役割を担っています。NginxやApacheなどのWebサーバーとPHPを連携してプロセスを管理します。
FastCGIとは
PHP-FPMはFastCGIの拡張版なので、FastCGIについて簡単に解説します。
FastCGIの主な特徴として以下の4つがあります。
- パフォーマンスの向上: FastCGIは、プロセスを維持して再利用することで、プロセスの生成と破棄が繰り返されるオーバーヘッドを削減します。
- スケーラビリティ: FastCGIプロセスは、複数のリクエストを同時に処理する能力があり、負荷に応じてプロセスの数を増減させることができます。
- 言語とプラットフォームの独立性: FastCGIはPHP、Python、Perl、Rubyなど多くのプログラミング言語で使用することができ、様々なオペレーティングシステム上で動作します。
- 持続的接続: FastCGIプロセスは、長時間実行を維持することが可能で、一つのプロセスが複数のリクエストを扱うことができます。
PHP-FPMチューニングについて
PHP-FPMはリクエストを効率的に処理するのに役立ちますが、設定を誤ると逆にサーバーへの負荷を高めてしまう可能性があります。
PHP-FPMの設定ファイルは /etc/php-fpm.d/以下にあります。これより設定ファイルのパラメータについて解説していきます。
アイドルプロセス(Idle Process)とアクティブプロセス(Active Process)
プロセス制御方式(PM)
プロセス制御方式を選択します。プロセス制御方式には以下の3つがあります。今回はstatic, dynamicについて解説します。
・static
・dynamic
・ondemand
・static
static設定を使用すると、PHP-FPMはサーバーが起動する際に設定された固定数の子プロセスを生成します。この数はpm.max_childrenで指定され、その数がサーバーのライフタイム中常に維持されます。つまり、サーバーが起動してから停止するまで、常に同じ数の子プロセスが動作していることになります。
pm.max_childrenの設定方法 この数値が高いほど同時にレスポンスを処理できます。ただし、CPUの処理能力を超えて設定しても処理しきれませんし、プロセスが多くなる分メモリ使用率が高くなってしまうのでCPUのコア数の範囲で設定します。
ちなみにpm.max_childrenはIdle ProcessとActive Processの合計値です。
・dynamic
dynamic設定では、子プロセスの数が動的に調整されます。このモードでは、pm.max_children、pm.start_servers、pm.min_spare_servers、pm.max_spare_serversという複数のパラメータが関連しています。pm.start_serversは起動時に生成する子プロセスの数、pm.min_spare_serversは最小限維持すべきアイドル状態のプロセス数、pm.max_spare_serversはアイドル状態で保持する最大のプロセス数をそれぞれ指定します。
pm.max_children 最大値
staticでも解説している通りにCPUやメモリのリソースを考慮して設定する必要があります。リクエスト時に生成するプロセスの上限です。(Idle ProcessとActive Processの合計値の上限)
pm.start_servers 起動時に生成する子プロセスの数
pm.min_spare_servers 最小限維持すべきアイドル状態のプロセス数
pm.max_spare_servers アイドル状態で保持する最大のプロセス数
Active Processが終了するとIdle Processに状態が変化します。
pm.max_requests 各プロセスが処理するリクエスト数
一つの子プロセスが処理できるリクエスト数を指定します。この設定をすることでプロセスが蓄積してメモリを圧迫することを防ぐことができます。
参考記事
EC2でPHP-FPMのチューニングをする際は以下CPUのコア数スレッド数を確認する必要があります。