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

Apache 最大併發連接數與 TCP 參數深度配置指南

編輯:關於伺服器

MPM 架構選擇

編譯時指定:./configure --with-mpm=prefork|worker|event
查看當前:httpd -l | grep mpm

Prefork MPM 參數詳解 (傳統、穩定、記憶體大)

<IfModule mpm_prefork_module>
    ServerLimit 10000        # 突破 256 硬性限制,必須在 MaxRequestWorkers 前
    StartServers 5           # 啟動初始進程數
    MinSpareServers 5        # 最小閒置進程
    MaxSpareServers 10       # 最大閒置進程
    MaxRequestWorkers 10000  # 最大並發進程數 (舊名 MaxClients)
    MaxConnectionsPerChild 10000  # 進程生命周期請求數,防記憶體洩漏
</IfModule>

Prefork 運作機制

  • 主控制進程維持 MinSpareServers 閒置進程
  • 需求增加時:指數級產生進程 (1→2→4→8... 每秒最多 32 個) 直到滿足
  • 閒置超過 MaxSpareServers 時殺掉多餘進程
  • 記憶體模型:每進程獨立記憶體空間,PHP 模組載入於進程內

關鍵調優邏輯

  1. 測單進程記憶體:ps -ylC httpd --sort:rss | awk '{sum+=$8} END {print sum/NR/1024 " MB"}'
  2. 可用記憶體 = 總記憶體 - 系統 - 資料庫 - 快取 - 預留
  3. MaxRequestWorkers = 可用記憶體 / 單進程記憶體
  4. 同步設定 ServerLimit = MaxRequestWorkers

Worker MPM 參數詳解 (高併發、記憶體效率)

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

Worker 關鍵約束

  • MaxRequestWorkers ≤ ServerLimit × ThreadsPerChild
  • MaxRequestWorkers 必須是 ThreadsPerChild 整數倍
  • ThreadLimit 突破 64 限制 (需重編譯或 2.4+ 動態載入)

Event MPM (現代 Linux 預設、Keep-Alive 優化)

參數同 Worker,但引入 Listener Thread 專責 Keep-Alive 連線管理,釋放 Worker Thread 處理新請求。
強烈推薦 Apache 2.4+ 生產環境使用 Event MPM。

WinNT MPM (Windows 專用)

<IfModule mpm_winnt_module>
    ThreadsPerChild 500         # 單進程線程數 = 最大並發
    MaxConnectionsPerChild 10000
    ThreadStackSize 8388608     # 8MB 堆疊,防 PHP 深度遞迴棧溢位
</IfModule>

實測效能數據 (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

TCP 核心參數優化 (系統層面,/etc/sysctl.conf)

# 連線佇列
net.core.somaxconn = 65535
net.ipv4.tcp_max_syn_backlog = 65535

# TIME_WAIT 快速回收 (高併發短連線必調)
net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1  # 注意:NAT 環境慎用
net.ipv4.tcp_fin_timeout = 10

# 緩衝區
net.core.rmem_max = 16777216
net.core.wmem_max = 16777216
net.ipv4.tcp_rmem = 4096 87380 16777216
net.ipv4.tcp_wmem = 4096 65536 16777216

# 其他
net.ipv4.tcp_max_tw_buckets = 200000
net.ipv4.tcp_slow_start_after_idle = 0

# 套用
sysctl -p

完整 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 (推薦)
<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>

避坑總結

  • Prefork 下 MaxRequestWorkers > 256 **必須** 設 ServerLimit
  • Worker/Event 下 ThreadsPerChild > 64 **必須** 設 ThreadLimit
  • PHP 使用 mod_php → 強制 Prefork;改用 PHP-FPM → 可用 Event (最佳)
  • 修改 MPM 需切換模組:a2dismod mpm_prefork && a2enmod mpm_event
  • 壓測工具:ab (簡易)、wrk (高效能)、jmeter (功能完整)
Copyright © Windows教程網 All Rights Reserved