web-dev-qa-db-ja.com

PHP-FPMがメモリを消費し、多くのプールを作成する

私はnginxをphp-fpmでセットアップしました。各仮想ホストには、独自のUNIXソケットと個別のPOOLがあります。
しかし、問題はphp-fpmが/etc/php5/fpm/pool.d/で作成した構成プールごとに7つのスレッドを作成していることです。

どうして?また、VHOSTに関連するURLが表示されたときにのみプールが作成されるように定義するにはどうすればよいですか。

enter image description here

5
r004

子の数は、プール構成ファイルのプロセスマネージャー構成ディレクティブによって制御されます。現在の設定は、pm = staticpm.max_children = 6またはpm = dynamicpm.start_servers = 6のいずれかです。 1つのプロセスが制御プロセスになり、他のプロセスは要求を処理する準備ができた子になります。 6個ではなく5個の子のみを構成している場合、その最後のプロセスが何に使用されているかわからないことを告白する必要があります。大規模なハイスループットサイトでは、すぐに使用できる多くの子を含むこのような構成は理にかなっていますが、PHPスクリプトが時々実行されることを期待するメモリに制約のある(おそらく仮想)環境で、別の構成がより適切な場合があります。

これを実現するには、プール構成ファイルを編集し、 pm = ondemand を設定します。その後、リクエストを処理するためだけに子が作成されます。これは、アクティブなリクエストがない間のメモリ消費量が少ないことを意味しますが、子を作成するのにより多くの時間が必要になることもあります。合理的なpm.process_idle_timeoutを選択することで後者を減らすことができます。そのため、ユーザーがすぐに再び使用することを期待できるように、多数のphpプロセスがアイドル状態のままになります。その「健全な数」は pm.max_children によって制御されます。

注:このアドバイスはDebian 7での経験に基づいていますが、Ubuntuにも当てはまります。

9
MvG

多くの人がpm = ondemandを使用してメモリを節約することを奨励しています。ただし、Webサーバーに最近のアクセスがない場合、php-fpmモジュールはリクエストに応答する前に最初に子を作成する必要があるため、最初のバイト(またはサーバーの応答)までの時間が非常に長くなることも意味します。 pm = dynamicを使用する場合、少なくとも1人の子がクライアントリクエストに応答する準備ができていることを意味します。以下は、php-fpmを再起動した後、ユーザーごとに1つの子をロードします

pm=dynamic
pm.start_servers=1
pm.min_spare_servers=1
0