
什麼是 PHP-FPM 的 pm.max_children ?
PHP-FPM(FastCGI Process Manager)是現代 WordPress、各類 PHP 網站常用的效能關鍵元件,pm.max_children 是其設定檔中最重要的參數之一,決定同時允許多少個 PHP 請求進行處理。
如果設得太低,流量高峰時會發生 502/504,大量請求被阻塞;設得太高則可能損耗大量記憶體、造成 OOM(Out Of Memory)致伺服器當機,因此,正確估算與調校 pm.max_children 對網站穩定性、效能至關重要。
pm.max_children 參數詳解
此參數僅適用於 pm = static 或 pm = dynamic(常見於 /etc/php*/fpm/pool.d/www.conf),數值為整數,單位為『個 PHP Process』。動態模式下還需配合 pm.start_servers、pm.min_spare_servers、pm.max_spare_servers 一同調整,但本文嚴格聚焦於 pm.max_children。
估算 pm.max_children 的公式與範例
最標準的算法如下:
pm.max_children = 可用系統記憶體 / 平均單一 PHP-FPM Process 記憶體用量
執行步驟:
- 先觀察伺服器可分配給 PHP-FPM 的記憶體用量(需扣除 OS、資料庫、快取等非 PHP 應用程式記憶體)。
- 測定實際平均每個 PHP 處理程序的佔用量。
- 將可用記憶體除以平均數值,即為初步
pm.max_children建議值。
實例說明:
- 假設主機共有 4GB RAM,
- 扣掉 Linux 系統、資料庫、其他應用之後剩餘 2GB 可供 PHP 使用,
- 平均一個 PHP Process(RSS)為 50MB,
- 公式計算:2GB = 2048MB,2048 / 50 = 40.96,
- 建議設為 40,並依實際情形預留 10~15% 餘裕,設定 pm.max_children = 35~38。
如何獲取實際 PHP Process 佔用量?
可於流量高峰時執行:
ps -eo pid,cmd,%cpu,%mem --sort=-%mem | grep php-fpm
觀察 %MEM 欄位,統計多個進程實際 RSS,計算平均值,建議取多個時間點(高峰/低谷各記錄),精準調校。
pm.max_children 調整流程與實作步驟
以下提供一套穩定且建議循序漸進的調整流程:
- 先備份
/etc/php*/fpm/pool.d/www.conf設定檔。 - 根據上節算法設定
pm.max_children,暫以偏保守值作初期觀察,並重啟 PHP-FPM。 - 於尖峰及日常監控 PHP-FPM 行為與記憶體消耗,觀察是否有『Max Children reached』、『Out of memory』等警告。
- 根據網站流量,加減調整
pm.max_children,每次微幅調升/調降,重複觀察。
範例調整指令流程:
# 備份現有設定
cp /etc/php/8.2/fpm/pool.d/www.conf /etc/php/8.2/fpm/pool.d/www.conf.bak
# 搜尋與確認 pm.max_children 相關設定
grep -R "pm.max_children" -n /etc/php*/fpm/pool.d/
# 編輯設定檔
nano /etc/php/8.2/fpm/pool.d/www.conf
# 修改
pm.max_children = 35
# 重新啟動服務生效
systemctl restart php8.2-fpm
# 確認 PHP-FPM 狀態
systemctl status php8.2-fpm
監控與觀察指標:如何判斷數值是否合適?
建議每日定期使用下列系統指令檢查 PHP-FPM 與伺服器運行狀態:
- 檢查 PHP-FPM process 使用情況:
ps -eo pid,cmd,%cpu,%mem --sort=-%cpu | head- 檢查 PHP-FPM 日誌是否出現警告或錯誤:
journalctl -u php8.2-fpm --since "1 hour ago" | tail -n 200- 確認 pm.max_children 設定位置:
grep -R "pm.max_children" -n /etc/php*/fpm/pool.d/- 檢查 PHP-FPM 啟動狀態、啟動異常:
systemctl status php8.2-fpm- 分析 PHP-FPM pool 配置正確性:
php-fpm8.2 -tt
常見觀察指標:
- 觀察系統 RAM 是否明顯爆滿或經常耗盡 SWAP。
- 檢查 PHP-FPM error log 是否持續出現『server reached pm.max_children』錯誤,代表實際流量超過當前設定值。
- 監控平均 request wait time,若長期過高代表 process 不敷使用。
- 平時沒有 traffic 卻有多 process,需檢查是否有遺留 zombie 或惡意攻擊造成資源耗盡。
常見錯誤與排查方式
- 設定過低: 用戶同時請求一多,server log 出現
server reached pm.max_children setting(大多 502/504),網站顯著變慢。 - 設定過高: PHP-FPM 過多 process 搶佔記憶體,swap 大量消耗,甚至 kernel OOM killer 開始終止進程,網站整體癱瘓。
- 排查: 執行下列指令,綜合判斷。
# 查看 PHP-FPM 是否被 OOM killer 或進程異常終止
journalctl -u php8.2-fpm --since "1 hour ago" | tail -n 200
# 觀察是否有異常大量 process,排查可疑 zombie/僵死進程
ps -eo pid,cmd,%cpu,%mem --sort=-%cpu | head
# 分析 PHP-FPM 配置文法無誤
php-fpm8.2 -tt
如有誤設定,建議一步步調降/調升數值後,每次更動後密切檢查主機內存佔用與 PHP-FPM 行為,並保持設定檔紀錄(可打版本註記)。
結語
透過正確估算、處處監控與有紀律的調整流程,pm.max_children 將能有效提升 WordPress 或 PHP 站台的高流量抗壓實力,配合本教學內的系統檢查指令,讓您的 PHP-FPM 配置始終處於最佳狀態。
如遇到瓶頸,首要回顧記憶體總量與單 process 實際用量,適時調整 pm.max_children,避免極端值造成效能或穩定性不良。
Photo by Land O’Lakes, Inc. on Unsplash