| MPM | 架構 | 適用場景 | Windows 支援 |
|---|---|---|---|
| prefork | 多進程、無線程 | 非執行緒安全模組 (舊版 PHP)、穩定性優先 | ❌ |
| worker | 多進程+多線程 | 高併發、記憶體效率佳、需執行緒安全模組 | ❌ |
| event | worker 改良版 | Keep-Alive 優化、現代 Linux 預設 | ❌ |
| winnt | 單進程+多線程 | Windows 專用、原生 IOCP | ✅ |
<IfModule mpm_winnt_module>
ThreadsPerChild 150 # 單一進程的工作線程數 (唯一進程)
MaxRequestsPerChild 0 # 0=無限制,建議設 10000 防記憶體洩漏
</IfModule>
<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
<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 整數倍
| MPM/配置 | 並發 | CPU% | 記憶體(MB) | Req/sec |
|---|---|---|---|---|
| Prefork (MaxClients=150) | 100 | 28.8 | 285 | 8434 |
| Prefork (MaxClients=500) | 500 | 24.9 | 417 | 7229 |
| Prefork (MaxClients=1000) | 1000 | 22.5 | 470 | 6570 |
| Worker (ThreadsPerChild=200) | 500 | 19.8 | 209 | 5708 |
| Worker (ThreadsPerChild=100) | 500 | 24.6 | 254 | 6827 |
| Worker (ThreadsPerChild=50) | 500 | 26.0 | 320 | 7141 |
# 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 必須放在最前面,否則不生效a2dismod mpm_prefork && a2enmod mpm_event)