php-fpm の設定でサイトのパフォーマンスを向上させる

 NginxでPHPを利用する際には、php-fpmを利用することが多いと思いますが、php-fpmの設定によって、Webサイトのパフォーマンスは左右されます。

この記事では、そんな php-fpm の設定の最適化方法について解説していきたいと思います。

php-fpmの役割と特徴

 WordPress などの動的サイトは、Webサーバーがクライアントからリクエストを受けると、サーバー上でPHPを実行して動的にページを生成し、生成したページをレスポンスとしてクライアントに返します。

この、サーバー上でPHPを実行する仕組みがphp-fpmです。
php-fpmでは、リクエストのたびにプロセスを生成するのではなく、あらかじめ1つないし複数のワーカープロセス(以下、「プロセス」と書きます)を起動しておき、サーバーに届いたリクエストの処理に割り当てます。
このプロセスの集まりのことを、プールと言います。

起動しているプロセスの数によって、サーバーの同時接続可能数やリソース使用量(CPU、メモリ、ディスク等)が変動します。多くのプロセスが起動していれば、それだけ多くの接続を一度に捌くことができますが、リソース消費は増大します。

プロセス数の制御

設定した数を常に起動しておく方法(static

プロセスの起動に伴うオーバーヘッドがないという利点があります。

起動数を動的に変更する方法(dynamic)

通常時はある程度の数のプロセスをあらかじめ起動しておきます。
同時接続数が増え、プロセス数が足りなくなった時だけ、設定した範囲でプロセスが追加で起動されます。

php-fpm の設定を最適化する

 php-fpmの設定を調整することで、サーバーのピーク性能を最大化しつつ、通常時のメモリ消費を抑えることができます。

設定ファイルは、/etc/php-fpm.d 配下にあります。
ファイル名はサーバーによって異なるので、適宜読み替えてください。

プロセスの最大起動数(pm.max_children)

同時に起動するプロセスの最大数です。この数値が、サーバーの同時接続可能数を決定します。プロセス数制御がstaticの場合、常にここで指定された数のプロセスを起動します。この数値を超える同時接続があった場合、超えた分のリクエストは、他のリクエストの処理後に処理されるので、レスポンスタイムが悪化します。

ただし、この数値は無闇に増やすのではなく、サーバーのリソースで賄い切れる範囲内で最大の値を設定するべきです。(CPUのコア数を超えるプロセス数を起動しても同時に実行することはできません。また、メモリ消費量が多すぎるとswap領域を使うようになり、かえって逆効果になります。)

最適な値の求め方

プロセスの最大起動数は、最もボトルネックとなっているリソースに合わせて決定します。

CPUは1プロセスあたり1コア、メモリは1プロセスあたり数十MBとして計算します。(正確な1プロセスあたりのメモリ使用量は、サーバーごとに異なるのでpsコマンドを使って調べてください。)
今回の例では、コア数と同じ2を設定します。

また、今回は同時起動数が少ないので、プロセス制御はstaticを使用します。

vi /etc/php-fpm.d/www.conf

#該当部分のみ抜粋
pm = static
pm.max_children = 2

修正したら、Nginxとphp-fpmを再起動して終わりです。

systemctl restart nginx
systemctl restart php-fpm