首先,咱們關注下 PHP-FPM 的運行方式:php
static :表示在 `php-fpm` 運行時直接 `fork` 出 `pm.max_chindren` 個子進程, dynamic:表示,運行時 `fork` 出 `start_servers` 個進程,隨着負載的狀況,動態的調整,最多不超過 `max_children` 個進程。
通常推薦用 static
。併發
優勢是不用動態的判斷負載狀況,提高性能;php-fpm
缺點是多佔用些系統內存資源。性能
PHP-FPM
子進程數量,是否是越多越好?code
固然不是,pm.max_chindren
,進程多了,增長進程管理的開銷以及上下文切換的開銷。server
更核心的是,能併發執行的 php-fpm
進程不會超過 cpu
個數。進程
如何設置,取決於你的代碼內存
若是代碼是 CPU
計算密集型的,pm.max_chindren
不能超過 CPU
的內核數。資源
若是不是,那麼將 pm.max_chindren
的值大於 CPU
的內核數,是很是明智的。requests
國外技術大拿給出這麼個公式:
在 N + 20%
和 M / m
之間。
N 是 CPU 內核數量。
M 是 PHP 能利用的內存數量。
m 是每一個 PHP 進程平均使用的內存數量。
適用於 dynamic
方式。
static
方式:M / (m * 1.2)
固然,還有一種保險的方式,來配置 max_children
。適用於 static
方式。
max_childnren
設置成一個比較大的值。php-fpm
的 status
裏的 max active processes
是多少max_children
配置比它大一些就能夠了。pm.max_requests
:指的是每一個子進程在處理了多少個請求數量以後就重啓。
這個參數,理論上能夠隨便設置,可是爲了預防內存泄漏的風險,仍是設置一個合理的數比較好。