Windows Server 2003 + IIS 6.0 環境下,w3wp.exe (Worker Process) 內存持續增長、CPU 長期高佔用、定期重啟才能緩解,是典型的「應用層資源洩漏 + 基礎設施配置缺失」雙重問題。本文從代碼、配置、架構三個維度給出系統級治理方案。
| 指標 | 異常表現 | 典型誤區 |
|---|---|---|
| 內存 | 啟動 40MB → 2-3 天漲至 180-300MB/進程,物理內存耗盡觸發交換,響應極慢 | 單純加內存/加服務器,不解決洩漏根因 |
| CPU | 周期性飆升至 80-100%,持續數分鐘不降 | 認為是流量大,未排查死循環/低效查詢/GC 風暴 |
| SQL Server | 同步增長至 200-400MB,大量 Sleeping 連接佔用內存 | 未限制 SQL Server 最大內存,導致與 w3wp 搶佔物理內存 |
Dispose/ReleaseComObject;# 每站點獨立應用程序池 (隔離故障域)
# 回收設置 (根據內存增長曲線校準)
- 定時回收: 03:00 (業務低峰)
- 內存限制回收: 虛擬內存 > 800MB / 私有內存 > 500MB → 回收
- 請求限制回收: 10000 請求 (防請求級洩漏)
- 固定間隔回收: 1740 分鐘 (默認) → 改為 2880 分鐘 (48h) 配合內存限制
# CPU 保護
- CPU 限制: 25% (4核) / 15% (8核) - 超過觸發動作: KillW3wp / Throttle / ThrottleUnderLoad
- 刷新間隔: 1 分鐘
# 快速失敗保護
- 快速失敗保護: 5 分鐘內 5 次失敗 → 禁用應用程序池 (防惡意循環重啟)
# 啟用 32 位應用程序 (若運行舊 ASP/COM 組件)
cscript iisapp.vbs (或 iisapp) → 輸出 PID -> 應用程序池名稱 映射;DebugDiag 2/Procdump 捕獲高內存/高 CPU 轉儲文件;WinDbg + SOS 分析托管堆、GC 根、大對象、線程堆棧;PerfView / dotMemory / ANTS Memory Profiler 可視化內存保留鏈路;AppInsights / New Relic / SkyWalking APM 綁定業務請求鏈路。| 階段 | 動作 | 產出 | 驗收 |
|---|---|---|---|
| 止血 (1天) | 啟用應用程序池內存/CPU 回收、限制 SQL 最大內存、加物理內存至 4GB+ | 配置變更單、監控儀表板 | 無 OOM 重啟、CPU 尖峰 < 5min、響應 < 2s |
| 診斷 (1周) | 抓取轉儲、APM 埋點、代碼靜態掃描、負載測試復現 | 根因報告 (具體類/方法/配置項) | 研發確認、產品經理排期 |
| 重構 (1-3月) | Session→Redis/StateServer、Cache→策略化(滑動過期/依賴/標記)、分頁優化、非托管資源 Dispose、異步處理長任務 | 重構代碼、自動化測試覆蓋 | 壓測 2x 峰值流量 2h 內存平穩、CPU < 30% |
| 長效 (持續) | CI/CD 門禁: 內存/CPU 基線測試、靜態分析規則、APM 告警基線、季度架構評審 | 工程化治理體系 | 零非計劃重啟、MTTR < 15min |
結語: w3wp.exe 暴漲不是 IIS 的錯,而是「應用架構未適應長運行環境」的投影。應用程序池隔離+回收機制是止血帶,代碼級資源管理是手術刀,系統資源規劃是營養基礎。三位一體、持續演進,才能讓 IIS 6.0 這個經典平台在遷移前平穩服役。