1. 性能优化原则
IIS 性能优化应遵循先监控后调优的原则,通过性能计数器和日志分析定位瓶颈,再有针对性地调整配置。
常见性能瓶颈
- CPU 瓶颈:应用程序计算密集、死循环、正则表达式低效
- 内存瓶颈:内存泄漏、缓存未释放、大文件上传
- 磁盘 I/O:日志写入频繁、静态文件读取慢
- 网络带宽:大文件下载、未启用压缩
2. 应用程序池优化
1
选择应用程序池 → 右侧"高级设置"
2
常规设置:
- 启动模式:AlwaysRunning(常驻运行,减少冷启动延迟)
- 队列长度:1000 → 5000(增大请求队列)
3
进程模型设置:
- 空闲超时:0(禁用,常驻运行)
- 最大工作进程:根据 CPU 核心数调整(Web Garden)
4
回收设置:
- 固定时间间隔:0(禁用定时回收,改用内存触发)
- 专用内存限制:500000(500MB 触发回收)
PowerShell - 应用程序池优化
# 设置常驻运行
Set-ItemProperty -Path "IIS:\AppPools\MyWebAppPool" `
-Name "startMode" -Value "AlwaysRunning"
# 禁用空闲超时
Set-ItemProperty -Path "IIS:\AppPools\MyWebAppPool" `
-Name "processModel.idleTimeout" -Value "00:00:00"
# 增大请求队列
Set-ItemProperty -Path "IIS:\AppPools\MyWebAppPool" `
-Name "queueLength" -Value 5000
# 设置内存限制触发回收
Set-ItemProperty -Path "IIS:\AppPools\MyWebAppPool" `
-Name "recycling.periodicRestart.privateMemory" -Value 524288
# 禁用定时回收
Set-ItemProperty -Path "IIS:\AppPools\MyWebAppPool" `
-Name "recycling.periodicRestart.time" -Value "00:00:00"
3. 输出缓存
PowerShell - 配置输出缓存
# 启用内核缓存(性能最佳)
Set-WebConfigurationProperty -PSPath "IIS:\Sites\MyWebSite" `
-Filter "system.webServer/caching" `
-Name "enabled" -Value $true
# 添加静态文件缓存规则
Add-WebConfigurationProperty -PSPath "IIS:\Sites\MyWebSite" `
-Filter "system.webServer/staticContent/clientCache" `
-Name "." -Value @{cacheControlMode="UseMaxAge";cacheControlMaxAge="7.00:00:00"}
# 查看缓存配置
Get-WebConfigurationProperty -PSPath "IIS:\Sites\MyWebSite" `
-Filter "system.webServer/caching" -Name "enabled"
4. 压缩配置
1
选择网站 → 双击"压缩"
2
勾选配置:
- ✅ 启用动态内容压缩:压缩 ASP.NET、PHP 等动态内容
- ✅ 启用静态内容压缩:压缩 CSS、JS、HTML 等静态文件
PowerShell - 启用压缩
# 启用动态压缩
Set-WebConfigurationProperty -PSPath "IIS:\Sites\MyWebSite" `
-Filter "system.webServer/urlCompression" `
-Name "doDynamicCompression" -Value $true
# 启用静态压缩
Set-WebConfigurationProperty -PSPath "IIS:\Sites\MyWebSite" `
-Filter "system.webServer/urlCompression" `
-Name "doStaticCompression" -Value $true
# 设置压缩级别(0-10,越高压缩率越大但CPU消耗越多)
Set-WebConfigurationProperty -PSPath "IIS:\Sites\MyWebSite" `
-Filter "system.webServer/httpCompression" `
-Name "staticCompressionLevel" -Value 7
5. 常见问题
Q1:启用压缩后 CPU 占用过高
动态压缩 CPU 开销较大,可降低 dynamicCompressionLevel 至 3-5,或仅对特定 MIME 类型启用压缩。
Q2:缓存不生效
检查响应头是否包含 Cache-Control: private 或 Vary: *,这些会阻止缓存。确保静态文件的响应头包含缓存策略。
Q3:Web Garden 模式下 Session 丢失
Web Garden 多工作进程模式下,必须将 Session 存储在外部(如 SQL Server、Redis),否则 Session 会随机丢失。