LinuxでPHP-FPMが大量のRAMを消費するのを防ぐ方法


LEMP(Linux、NGINX、MySQL/MariaDB、およびPHP)スタックをデプロイした場合は、PHP処理に(HTTPサーバーとして)NGINX内でFastCGIプロキシを使用している可能性があります。 PHP-FPM(FastCGI Process Managerの頭字語)は、広く使用されている高性能の代替PHPFastCGI実装です。

LinuxでLEMPスタックを設定するための便利なガイドは次のとおりです。

  • Ubuntu20.04でPhpMyAdminを使用してLEMPスタックをインストールする方法
  • CentOS8にLEMPサーバーをインストールする方法
  • Debian10サーバーにLEMPをインストールする方法

最近、LEMPWebサーバーの1つにあるすべてのPHPWebサイトが遅くなり、サーバーへのログイン時に応答が停止しました。次のスクリーンショットに示すように、システムのRAMが不足していることがわかりました。PHP-FPMがRAMの大部分を消費していました(概要–システム監視ツール)。

$ glances

この記事では、LinuxでPHP-FPMがシステムメモリ(RAM)を過剰に消費するのを防ぐ方法を説明します。このガイドの最後では、PHP-FPMのメモリ消費量を50%以上削減する方法を学習します。

PHP-FPMのメモリ使用量を削減

インターネットで調査を行った結果、プール構成ファイルでのPHP-FPMのメモリ消費を削減するために、PHP-FPMプロセスマネージャーとその特定の側面を再構成する必要があることがわかりました。

デフォルトのプールはwwwで、その設定ファイルは/etc/php-fpm.d/www.conf(CentOS/RHEL/Fedora上)または/etc/php/7.4/fpm/pool.d/www.conf( Ubuntu/Debian/Mintで)。

$ sudo vim /etc/php-fpm.d/www.conf             [On CentOS/RHEL/Fedora]
$ sudo vim /etc/php/7.4/fpm/pool.d/www.conf    [On Ubuntu/Debian/Mint]

次のディレクティブを見つけて、ユースケースに合わせてそれらの値を設定します。コメントアウトされているディレクティブについては、コメントを解除する必要があります。

pm = ondemand
pm.max_children = 80
pm.process_idle_timeout = 10s
pm.max_requests = 200

上記のディレクティブとその値について簡単に説明しましょう。 pmディレクティブは、プロセスマネージャーが子プロセスの数をどのように制御するかを決定します。デフォルトのメソッドは動的です。つまり、子(子プロセス)の数は、同時に生きることができる子の最大数を定義するpm.max_childrenを含む他のディレクティブに応じて動的に設定されます。

最も理想的なプロセスマネージャーは、起動時に子プロセスが作成されず、オンデマンドで生成されるオンデマンドスキームです。子プロセスは、アイドルプロセスが強制終了されるまでの秒数を定義するpm.max_childrenおよびpm.process_idle_timeoutに基づいて、新しい要求が接続される場合にのみフォークされます。

最後になりましたが、再スポーンする前に各子プロセスが実行する必要のあるリクエストの数を定義するpm.max_requestsパラメーターを設定する必要があります。このパラメータは、サードパーティライブラリのメモリリークの回避策としても使用できることに注意してください。

参照:PHP-FPMを実行するためのより良い方法。

上記の構成を行った後、サーバーでRAMの使用量が問題ないことに気付きました。このトピックや質問に関連して共有する考えはありますか?以下のフィードバックフォームからご連絡ください。