- 工信部备案号 滇ICP备05000110号-1
- 滇公网安备53011102001527号
- 增值电信业务经营许可证 B1.B2-20181647、滇B1.B2-20190004
- 云南互联网协会理事单位
- 安全联盟认证网站身份V标记
- 域名注册服务机构许可:滇D3-20230001
- 代理域名注册服务机构:新网数码
- CN域名投诉举报处理平台:电话:010-58813000、邮箱:service@cnnic.cn
适用版本:IIS 7.0 及以上(Windows Server 2008 R2+)
适用技术栈:ASP.NET Framework / Classic ASP / PHP(通过 FastCGI)等托管于 IIS 的应用
注:ASP.NET Core / .NET 5+ 采用独立进程模型(Kestrel + 反向代理),不依赖 IIS 应用程序池,本文机制不适用。
IIS 应用程序池(Application Pool)是 IIS 用于隔离 Web 应用的运行环境。每个应用池对应一个或多个 w3wp.exe 工作进程,负责处理 HTTP 请求、执行托管代码、管理会话与缓存。
应用程序池回收(Recycling) 是指 IIS 自动或手动重启工作进程的过程。回收并非重启 IIS 服务,而是替换底层 w3wp.exe 进程,以实现以下目标:
释放累积内存,防止内存泄漏导致服务崩溃
应用配置变更(如 web.config 更新)
清除长时间运行导致的性能衰减(如句柄泄漏、GC 碎片)
实现计划维护或版本平滑更新
回收仅影响目标应用池的 w3wp.exe,不影响 IIS 核心服务(w3svc)或其他应用池。
IIS 默认启用重叠回收机制:
触发回收条件后,IIS 启动新工作进程
新进程初始化完成并开始接收新请求
旧进程继续处理进行中请求,进入“排空期”(Draining)
旧进程在 shutdownTimeLimit(默认 90 秒)内完成请求后优雅退出
若超时仍未退出,IIS 强制终止旧进程(TerminateProcess)
Application_Start:新进程初始化时触发
Application_End:旧进程关闭前触发(仅限正常回收,崩溃不触发)
建议在 Application_End 中仅执行轻量清理,避免阻塞导致强制终止
触发类型 | 默认值 | 说明 | 适用场景 |
|---|---|---|---|
固定时间间隔 | 1740 分钟(29 小时) | 自上次启动/回收后按时间触发 | 通用防护,防长期运行隐患 |
指定时间 | 无 | 每日固定时间点触发(如 | 配合业务低峰期计划维护 |
私有内存限制 | 0(不启用) | 工作进程 | 防内存泄漏,推荐 1~2 GB |
虚拟内存限制 | 0(不启用) | 虚拟地址空间超限(现代系统较少使用) | 老旧 32 位应用防护 |
请求数量 | 0(不启用) | 累计处理请求数达到阈值 | 防请求累积导致的状态污染 |
空闲超时 | 20 分钟 | 无新请求持续该时间后回收 | 开发/测试环境节省资源 |
配置变更 | 自动启用 | 修改 | 保证配置实时生效 |
手动/按需 | 无 | 管理员主动触发 | 发布后验证、故障恢复 |
注意:启用内存/请求限制后,频繁回收通常是代码缺陷的信号,而非解决方案。
右键目标应用池 → 回收... → 勾选触发条件并设置参数。
路径:%windir%\\System32\\inetsrv\\config\\applicationHost.config
xml12345678910111213141516
bash123456
影响维度 | 具体表现 | 应对方案 |
|---|---|---|
内存状态丢失 | 静态变量、 | 使用 Redis/Memcached 等外部缓存 |
会话中断 |
| 切换至 |
冷启动延迟 | JIT 编译、依赖初始化导致首请求慢 | 启用 IIS |
数据库连接池重建 | 短暂连接等待或超时 | 设置合理的 |
| 清理逻辑耗时导致强制终止 | 仅执行快速释放,异步日志落盘,设置 |
生产环境关闭固定时间间隔:改用 指定时间 + 内存/请求限制,避免无意义重启。
内存阈值合理设置:建议 1024~2048 MB,结合应用内存基线调整。过低导致频繁回收,过高失去防护意义。
启用回收日志:确保 logEventOnRecycle 包含 Time, Memory, ConfigChange,便于审计。
错峰回收:多节点部署时,通过负载均衡健康检查或脚本控制各节点回收时间错开。
代码层配合:
避免在 Application_Start 执行阻塞操作
使用 IRegisteredObject 注册清理逻辑
监控 GC 压力与句柄泄漏
预热机制:生产环境强烈建议启用 Application Initialization,配合 preloadEnabled="true" 实现零延迟切换。
Event ID | 含义 | 排查方向 |
|---|---|---|
| 回收开始 | 检查触发条件、配置变更 |
| 回收完成 | 确认新进程正常启动 |
| 因内存超限回收 | 分析 Dump,检查泄漏点 |
| 应用池异常终止(非回收) | 查看崩溃堆栈、第三方模块冲突 |
| 工作进程意外关闭 | 权限、病毒扫描、资源耗尽 |
\\Process(w3wp*)\\Private Bytes
\\Process(w3wp*)\\Handle Count
\\ASP.NET Applications\\__Total__\\Requests Rejected
\\Web Service(_Total)\\Current Connections
现象 | 可能原因 | 解决建议 |
|---|---|---|
回收后频繁 503 | 预热不足 / 依赖服务未就绪 | 启用 Application Initialization,检查健康检查端点 |
回收不生效 | 配置语法错误 / 权限不足 / 组策略限制 | 检查 |
回收间隔极短(<5分钟) | 代码内存泄漏 / 死锁 / 频繁配置热更新 | 使用 DebugDiag / PerfView 分析 Dump,关闭不必要的热重载 |
旧进程卡死不退出 |
| 缩短 |
IIS 应用程序池回收是保障 Web 服务长期稳定运行的核心机制。正确理解其工作原理、合理配置触发条件、结合预热与外部状态管理,可显著降低故障率并提升用户体验。
核心原则:
回收是防护手段,不是代码缺陷的替代方案
优先保证平滑过渡(重叠回收 + 预热)
建立监控基线,用数据指导阈值调整
与现代化运维体系(日志聚合、APM、CI/CD)深度集成
售前咨询
售后咨询
备案咨询
二维码

TOP