Windows XP Windows 7 Windows 2003 Windows Vista Windows 綜合教學 Linux 系統教學
Windows 10 Windows 8 Windows 2008 Windows NT Windows Server 電腦軟體教學
您现在的位置: Windows教程網 >> Windows教程 >  >> 電腦軟體教學 >> 伺服器技術 >> 關於伺服器

Apache MPM 參數深度解析:ThreadsPerChild 與 MaxRequestsPerChild 配置優化

編輯:關於伺服器

MPM 模型選擇

MPM架構適用場景Windows 支援
prefork多進程、無線程非執行緒安全模組 (舊版 PHP)、穩定性優先❌
worker多進程+多線程高併發、記憶體效率佳、需執行緒安全模組❌
eventworker 改良版Keep-Alive 優化、現代 Linux 預設❌
winnt單進程+多線程Windows 專用、原生 IOCP✅

WinNT MPM 核心參數 (Windows 環境)

<IfModule mpm_winnt_module>
    ThreadsPerChild 150      # 單一進程的工作線程數 (唯一進程)
    MaxRequestsPerChild 0    # 0=無限制,建議設 10000 防記憶體洩漏
</IfModule>
  • ThreadsPerChild:Windows 下 Apache 單進程模型,此值即最大並發連線數。預設 150,高併發建議 500-1000 (視記憶體/CPU 調整)
  • MaxRequestsPerChild:進程處理請求數達標後重啟,釋放記憶體。生產環境建議 10000-50000,不可為 0

Prefork MPM 參數與優化 (Linux 傳統)

<IfModule mpm_prefork_module>
    ServerLimit 10000        # 必須在 MaxClients 之前,突破 256 限制
    StartServers 5
    MinSpareServers 5
    MaxSpareServers 10
    MaxClients 10000         # 最大並發進程數 (受限於 ServerLimit)
    MaxRequestsPerChild 10000
</IfModule>

關鍵公式:MaxClients = ServerLimit (prefork 下)。
記憶體估算:MaxClients × 進程記憶體 ≈ 總記憶體 × 0.8

Worker MPM 參數與優化 (Linux 高併發)

<IfModule mpm_worker_module>
    ServerLimit 25           # 最大子進程數 (預設 16)
    ThreadLimit 200          # 每進程最大線程數 (預設 64)
    StartServers 3
    MaxClients 2000          # 總最大並發 = ServerLimit × ThreadsPerChild
    MinSpareThreads 50
    MaxSpareThreads 200
    ThreadsPerChild 100      # 每進程固定線程數
    MaxRequestsPerChild 10000
</IfModule>

約束條件:
MaxClients ≤ ServerLimit × ThreadsPerChild
MaxClients 必須是 ThreadsPerChild 整數倍

實測效能對比 (2 CPU / 2GB RAM / 6 bytes 靜態頁)

MPM/配置並發CPU%記憶體(MB)Req/sec
Prefork (MaxClients=150)10028.82858434
Prefork (MaxClients=500)50024.94177229
Prefork (MaxClients=1000)100022.54706570
Worker (ThreadsPerChild=200)50019.82095708
Worker (ThreadsPerChild=100)50024.62546827
Worker (ThreadsPerChild=50)50026.03207141

優化決策樹

  1. 計算單一請求記憶體佔用 (含 PHP/模組)
  2. 扣除系統/資料庫/快取記憶體,得可用於 Apache 記憶體
  3. 估算峰值 QPS,反推所需並發數
  4. 選擇 MPM:
    • Windows → winnt (唯一選擇)
    • Linux + PHP-FPM (proxy) → event (最佳)
    • Linux + mod_php → prefork (相容性)
    • 高併發靜態/代理 → worker/event
  5. 設定參數 → 壓測 (ab/wrk/jmeter) → 觀察 CPU/記憶體/錯誤率 → 微調

完整 httpd-mpm.conf 範本 (Apache 2.4)

# Prefork
<IfModule mpm_prefork_module>
    StartServers 5
    MinSpareServers 5
    MaxSpareServers 10
    MaxRequestWorkers 150
    MaxConnectionsPerChild 10000
</IfModule>

# Worker
<IfModule mpm_worker_module>
    StartServers 2
    MinSpareThreads 25
    MaxSpareThreads 75
    ThreadsPerChild 25
    MaxRequestWorkers 150
    MaxConnectionsPerChild 10000
</IfModule>

# Event (推薦現代 Linux)
<IfModule mpm_event_module>
    StartServers 2
    MinSpareThreads 25
    MaxSpareThreads 75
    ThreadsPerChild 25
    MaxRequestWorkers 150
    MaxConnectionsPerChild 10000
</IfModule>

# WinNT
<IfModule mpm_winnt_module>
    ThreadsPerChild 150
    MaxConnectionsPerChild 10000
</IfModule>

避坑提醒

  • MaxClients 在 2.4 重命名為 MaxRequestWorkers (相容舊名)
  • ServerLimit 必須放在最前面,否則不生效
  • 修改 MPM 需重新編譯或切換模組 (a2dismod mpm_prefork && a2enmod mpm_event)
  • PHP 使用 mod_php 強制 prefork;改用 PHP-FPM 可釋放 MPM 選擇彈性
Copyright © Windows教程網 All Rights Reserved