PHP-FPM 的 pm.max_children 設定與調校教學

pm max children optimization

什麼是 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 = staticpm = dynamic(常見於 /etc/php*/fpm/pool.d/www.conf),數值為整數,單位為『個 PHP Process』。動態模式下還需配合 pm.start_serverspm.min_spare_serverspm.max_spare_servers 一同調整,但本文嚴格聚焦於 pm.max_children

估算 pm.max_children 的公式與範例

最標準的算法如下:

pm.max_children = 可用系統記憶體 / 平均單一 PHP-FPM Process 記憶體用量

執行步驟:

  1. 先觀察伺服器可分配給 PHP-FPM 的記憶體用量(需扣除 OS、資料庫、快取等非 PHP 應用程式記憶體)。
  2. 測定實際平均每個 PHP 處理程序的佔用量。
  3. 將可用記憶體除以平均數值,即為初步 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 調整流程與實作步驟

以下提供一套穩定且建議循序漸進的調整流程:

  1. 先備份 /etc/php*/fpm/pool.d/www.conf 設定檔。
  2. 根據上節算法設定 pm.max_children,暫以偏保守值作初期觀察,並重啟 PHP-FPM。
  3. 於尖峰及日常監控 PHP-FPM 行為與記憶體消耗,觀察是否有『Max Children reached』、『Out of memory』等警告。
  4. 根據網站流量,加減調整 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

Please rate Stellar
0 / 5 5 Votes 3

Your page rank: