PHP-FPM設定max_chindren、max_requests

parvin發表於2019-01-19

首先,我們關注下 PHP-FPM 的執行方式:
pm = static模式:

始終保持一個固定數量的子程式,這個數由pm.max_children定義,這種方式很不靈活,也通常不是預設的。
優點是不用動態的判斷負載情況,提升效能;缺點是多佔用些系統記憶體資源。在記憶體足夠的前提下效能最強
用此模式每天需要設定固定時間重啟php
pm = dynamic模式:

啟動時,會產生固定數量的子程式(由pm.start_servers控制)可以理解成最小子程式數,而最大子程式數則由pm.max_children去控制,OK,這樣的話,子程式數會在最大和最小數範圍中變化,還沒有完,閒置的子程式數還可以由另2個配置控制,分別是pm.min_spare_servers和pm.max_spare_servers,也就是閒置的子程式也可以有最小和最大的數目,而如果閒置的子程式超出了pm.max_spare_servers,則會被殺掉。
pm = ondemand模式:

這種模式和pm = dynamic相反,把記憶體放在第一位,他的工作模式很簡單,每個閒置程式,在持續閒置了pm.process_idle_timeout秒後就會被殺掉,有了這個模式,到了伺服器低峰期記憶體自然會降下來,如果伺服器長時間沒有請求,就只會有一個php-fpm主程式,當然弊端是,遇到高峰期或者如果pm.process_idle_timeout的值太短的話,無法避免伺服器頻繁建立程式的問題,因此pm = dynamic和pm = ondemand誰更適合視實際情況而定。
PHP-FPM 子程式數量,是不是越多越好?

當然不是,pm.max_chindren,程式多了,增加程式管理的開銷以及上下文切換的開銷。

更核心的是,能併發執行的 php-fpm 程式不會超過 cpu 個數。

如何設定,取決於你的程式碼

如果程式碼是 CPU 計算密集型的,pm.max_chindren 不能超過 CPU 的核心數。
如果不是,那麼將 pm.max_chindren 的值大於 CPU 的核心數,是非常明智的。
國外技術大拿給出這麼個公式:

在 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:指的是每個子程式在處理了多少個請求數量之後就重啟。

這個引數,理論上可以隨便設定,但是為了預防記憶體洩漏的風險,還是設定一個合理的數比較好

相關文章