首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 相關知識

Apache 核心指令參考手冊:MaxRequestsPerChild、MaxSpareServers、MinSpareServers 完整解析

     編輯:PHP 相關知識

MaxRequestsPerChild 指令:子進程生命週期控制

屬性說明
語法MaxRequestsPerChild number
預設值MaxRequestsPerChild 0 (永不退出)
作用域server config
狀態core

核心機制

設定單個子進程處理請求數的上限。達到上限後,子進程優雅退出,由父進程重新衍生新子進程取代。

設為非零值的雙重效益

  1. 抑制記憶體洩漏:第三方模組 (如舊版 mod_php、mod_perl) 或擴充套件可能存在緩慢記憶體洩漏。定期重啟子進程強制釋放記憶體,防止單進程無限膨脹佔盡 RAM。
  2. 平滑縮容:負載下降時,閒置子進程自然達到上限退出,父進程不再補充,實現進程數自動下降,釋放系統資源。

關鍵細節

  • KeepAlive 請求計數規則:僅第一個請求計入 此限制。實際效果等同「限制每個子進程的最大連線數」。
  • Win32 平台無效:Windows 下 Apache 使用單進程多執行緒架構,此指令被忽略。
  • 預設 0 = 永久存活:生產環境強烈建議設定非零值 (如 10000),除非確認無任何記憶體洩漏風險。

建議值參考

場景建議值理由
通用 PHP (mod_php)10000 - 50000平衡效能與記憶體安全,PHP 請求級隔離天然抗洩漏
mod_perl / 舊版模組1000 - 5000高洩漏風險,頻繁回收
純靜態/代理0 或極大值核心模組極穩定,無洩漏風險

MaxSpareServers 指令:最大閒置子進程數上限

屬性說明
語法MaxSpareServers number
預設值MaxSpareServers 10
作用域server config
狀態core

運作邏輯

定義閒置子進程 (不處理請求) 的期望最大值。若閒置數 > 此值,父進程殺掉多餘進程。

調優原則

  • 極少需調整:僅極高流量站點 (數萬 QPS) 才需微調
  • 設大反害:過大值導致大量閒置進程常駐記憶體,平時浪費資源,尖峰時也未必比動態衍生快
  • Win32 無效:同 MaxRequestsPerChild

關聯指令

需配合 MinSpareServers、StartServers 共同構建「閒置池動態平衡」機制。


MinSpareServers 指令:最小閒置子進程數保證

屬性說明
語法MinSpareServers number
預設值MinSpareServers 5
作用域server config
狀態core

運作邏輯

定義閒置子進程 的期望最小值。若閒置數 < 此值,父進程以每秒最多 1 個 的速率衍生新子進程,直到達標。

「每秒 1 個」的設計考量

  • 避免「驚群效應」:突發流量時一次衍生大量進程會瞬間耗盡 CPU/記憶體,導致系統凍結
  • 平滑擴容:漸進式增加處理能力,配合 StartServers 預熱

三指令協作模型:Prefork MPM 進程池動態平衡

配置範例 (中型流量 PHP 站點):
StartServers         10      # 啟動時預熱 10 個子進程
MinSpareServers      10      # 保證至少 10 個閒置,應對突發
MaxSpareServers      20      # 閒置上限 20,防止資源浪費
MaxRequestsPerChild  10000   # 每進程處理 1 萬請求後重生,防洩漏
ServerLimit          256     # 硬性上限 (需在 MaxClients 前設定)
MaxClients           200     # 最大並發子進程數 (同 MaxRequestWorkers)

狀態轉換圖解

```mermaid graph LR A[父進程啟動] --> B[衍生 StartServers 個子進程] B --> C{閒置數 < MinSpareServers?} C -- 是 --> D[每秒衍生 1 個] D --> C C -- 否 --> E{閒置數 > MaxSpareServers?} E -- 是 --> F[殺掉多餘閒置進程] F --> E E -- 否 --> G[穩態運行] G --> H[請求到達] H --> I[閒置進程處理] I --> J{請求數 >= MaxRequestsPerChild?} J -- 是 --> K[子進程退出] K --> C J -- 否 --> G ```

實戰調優清單

  1. 確認 MPM 模式:apachectl -V | grep MPM → 必須為 prefork (本文指令僅適用 prefork)
  2. 基線測量:ab -n 10000 -c 100 https://site/ 觀察進程數、記憶體、回應時間
  3. 調整順序:MaxRequestsPerChild (防洩漏) → Min/MaxSpareServers (響應速度) → StartServers (啟動預熱) → MaxClients (並發上限)
  4. 監控指標:ps aux | grep httpd | wc -l (進程數)、free -h (記憶體)、mod_status (詳細狀態)

現代替代方案提示

Apache 2.4+ 推薦使用 Event MPM (單進程多執行緒 + 非阻塞 I/O) 配合 PHP-FPM。此架構下:

  • Apache 僅處理靜態/代理/SSL 終結,進程數極少 (配置 ThreadsPerChild、AsyncRequestWorkerFactor)
  • PHP 運算完全移至獨立 PHP-FPM 池,由 pm.max_children、pm.start_servers、pm.max_requests 控制,邏輯更清晰、擴展性更強

若仍堅持 Prefork + mod_php,本文三指令為核心調優把手。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved