IIS 管理員常遇 w3wp.exe(應用程式集區背景程序)佔用 CPU 100%。本文系統性分析六大常見成因與四階段解決策略。
w3wp.exe 角色定位
- 全名:
IIS Application Pool Process
- 每個應用程式集區對應一個 w3wp.exe 執行個體
- 負責處理 HTTP 請求、執行 ASP.NET 程式碼、分配系統資源
六大常見成因
- Web 訪問量大、高併發:Requests Current 過高,大量運算與頁面生成佔滿 CPU
- 動態頁面邏輯過於複雜:巢狀 Repeater、大量字串處理、資料綁定,高併發下放大 CPU 壓力
- 程式碼死迴圈/效能殺手:低流量下 CPU 仍高,多為邏輯錯誤
- HTTP 下載站點:大量檔案傳輸觸發持續高 CPU
- 資源未釋放:流量尖峰後 CPU 佔用不降,應用程式集區回收機制失效
- IIS 日誌分析/匯入資料庫:定時任務佔用大量 CPU
四階段解決策略
階段一:快速定位問題站點
- CMD 執行
iisapp -a 列出所有 w3wp.exe PID 與對應應用程式集區名稱
- 建議:每個站點獨立應用程式集區,集區名稱 = 站點名稱
- 工作管理員 → 處理程序頁籤 → 找 CPU 高的 w3wp.exe PID → 對照 iisapp 結果鎖定站點
階段二:緊急重啟 IIS / 應用程式集區(治標)
- 有負載平衡(NLB):將節點下線 → 重啟 → 上線
- 無 NLB:接受 10 秒服務中斷,重啟 IIS(
iisreset)或回收特定集區
階段三:啟用頁面級輸出快取(治本·效能)
ASP.NET 頁面加入:
<%@ OutputCache Duration="10" VaryByParam="none" %>
- 優點:記憶體直接服務頁面、回應極快、大幅降低 CPU/DB 壓力
- 注意:解決 OutputCache 導致頁面下載問題(參考微軟文檔設定
VaryByCustom)
階段四:程式碼層級優化(根治)
- 低流量高 CPU → 檢查死迴圈、大量運算、遞迴、資料庫 N+1 查詢
- 使用 Profiler(如 dotTrace、ANTS、Visual Studio Profiler)定位熱點方法
- 重構演算法、引入快取、非同步處理、分頁載入
「w3wp.exe 高 CPU 不是 IIS 的錯,是你的程式碼在喊救命。定位 → 緊急止血 → 快止痛 → 手術根治,四步走。」