web-dev-qa-db-ja.com

pm.max_childrenのチューニングを正しく理解する

私はいくつかの調査を行い、これがpm.max_children値を計算および調整するためにこれを見つけました

https://myshell.co.uk/blog/2012/07/adjusting-child-processes-for-php-fpm-nginx/

しかし、例えば:

  • サーバーに8Gbあります
  • 30のウェブサイトをホストしています
  • php-fpmの平均プロセスサイズは約40MB
  • php-fpmの最大プロセスサイズは約80MB
  • 最大5Gbのメモリをphp-fpmプロセスに割り当てたい

これを適用すると:

pm.max_children = Total RAM Webサーバー専用/最大子プロセスサイズ

だから私の場合:

pm.max_children = 5120/80 = 64

しかし、各php-fpm Webサイトのconfファイルにpm.max_children = 64を追加すると、すべてのWebサイトが64個の子プロセスX1プロセスのサイズ(ex 40mb)= 2560Mb

そして、同時に、30のすべてのWebサイトがpm.max_children値に達したと想像すると、次のようになります。2560Mb(Webサイトあたりの最大数) x30Webサイト=76 800Mb

私は正しいですか?

そうです、これは多くのWebサイトが同じサーバーでホストされている場合、計算の結果を分割する必要があることを意味しますpm.max_children = 5120/80= 64ホストされているWebサイトの数(ここでは30)。

したがって、64/30 = 2,1およびpm.max_children = 2Webサイトごと

正しいですか?

ありがとう

5
TooNetCreation

あなたの計算は私が集めたものから正しいです。

同じサーバー上に多くのWebを配置することは、すべてのWebが同時にすべての使用可能なリソースを使用するわけではない場合にのみ機能します。これは、人々が通常オーバープロビジョニングと呼ぶものです。

ただし、使用可能なRAMを中心に単純にpm.max_childrenを計算するのではなく、Webが適切に機能するために実際に必要なワーカーの数を計算することをお勧めします。より低いものから始めて、php-fpm.logを監視します。 max_children設定に達した場合は、ログでそれを見つけ、増やすことができます。

また、PHPワーカーは必要なだけ存続することを確認してください。たとえば、次の構成では、プールで最大32 PHPリクエストのバーストがありますが、各ワーカーは非アクティブ状態が3秒続くと終了し、貴重なRAMを解放します。

pm = ondemand
pm.max_children = 32
pm.process_idle_timeout = 3s

RAMが少ない場合は、ondemandプロセスマネージャを使用します。 dynamic pmより少し遅いですが、非アクティブなWebサイトのRAMを無駄にしません。

PHPプロセスの総数を制御したい場合は、process.maxphp-fpm.confという設定があります。私はこれを使用したことがありませんが、私には思われますこれを使用して、プールの構成方法に関係なく、ワーカーの数が特定の数を超えないようにすることができます。

ちなみに、別のユーザーに属する別のWebには別のプールを使用することをお勧めします。これにより、ユーザー権限や他のWebからキャッシュされたデータに問題が発生しなくなります。

5
Oliver

私たちの経験に基づいたアドバイスしかできません。

リソース(CPUとRAM)を共有するために実行されているPHP-FPMプールは1つだけです。

複数のプールは、異なるユーザーアカウント(www-data1、www-data2など)を許可し、アクセスを制限するのに役立ちます。さらに、必要に応じて、CPUとRAM消費量)に異なる値を割り当てることができます。

ただし、次の例では1つのプールのみを使用しています。

; www.conf
;
; set pool management to have a fixed number of php workers
pm = static
; number of php processes (6 processes per CPU core)
pm.max_children = 48

静的プール管理の使用をお勧めします。つまり、PHPワーカーの数は常に一定です。

; www.conf
;
; redirect worker stdout and stderr into main error log
catch_workers_output = yes

これは、アプリケーションでエラーが発生した場合に役立ちます。

; php-fpm.conf
;
emergency_restart_threshold = 10
emergency_restart_interval = 1m
process_control_timeout = 10s

これは、実行中のPHPワーカーの基本的なライフモニタリングです。

これらの変更後、PHP-FPMサービスを再起動することを忘れないでください。

1
Jens Bradler