IIS 效能不佳多源於預設值不適合生產負載或開發習慣移植到伺服器。以下十大禁忌與對應最佳實務:
ArrayPool<T>、MemoryPool、大型物件堆 (LOH) 避免碎片。啟用 gcServer=true (ASP.NET Core) / `struct 取代 class 減少指標追蹤、避免 false sharing([ThreadStatic] 或 ThreadLocal<T>)。程式碼空間局部性優於時間局部性,編譯器優化選「大小」而非「速度」。IMemoryCache 設定 SizeLimit、ExpirationTokens、定期 Compact()。快取命中率 < 80% 即檢視移除策略。ThreadPool 自動調節、MaxConcurrentRequestsPerCPU (ASP.NET) / MaxConcurrentRequests (Core) 設定合理上限。Context Switch 成本極高,且汙染 L1/L2/L3 快取。system.webServer/httpProtocol 允許 Keep-Alive。可提升 15~20% 輸送量。<httpCompression directory="%SystemDrive%\inetpub\temp\IIS Temporary Compressed Files"> 啟用 dynamicCompressionBeforeCache="true"、staticTypes 包含 js/css/json/svg/woff2、dynamicTypes 包含 application/json。可減 60~80% 傳輸量。<compilation debug="false">、<httpRuntime fcnMode="Disabled">、移除 trace.axd、elmah.axd 等偵錯端點。ApplicationPoolIdentity、.NET CLR 版本隔離、啟用「快速失敗保護」(rapidFailProtection="true" failureInterval="00:05:00" maxFailures="5")。| 設定 | 建議值 |
|---|---|
| 應用程式集區佇列長度 | 5000~10000 |
| CPU 限制 | 0 (不限制) / 依授權核心數設定 |
| 私用記憶體限制 | 0 (不限制) / 視實體 RAM 留 20% 給 OS |
| 閒置逾時 | 0 (不回收) / 固定排程回收 (如 03:00) |
| 定期回收 | 1740 分鐘 (29 小時) 錯峰避開固定時段 |
調校後必跑負載測試 (wrk、k6、JMeter、NBomber) 比較 Before/After:RPS、P99 延遲、錯誤率、CPU/記憶體曲線。