IIS应用池重启后启动两次应用,旧进程未正常终止问题咨询
问题描述
我的应用托管在IIS中,采用进程外托管模式,基于.NET 6框架。偶尔在应用重启后,IIS会启动两个进程,事件查看器日志如下:
10:41:57 应用程序'/LM/W3SVC/2/ROOT'成功启动进程'14564',进程'14564'正在端口'40701'监听。
10:41:57 向ID为'14564'的进程发送关闭HTTP消息,并收到HTTP状态码'202'。
10:41:57 物理根目录为'XXX'的应用程序'/LM/W3SVC/2/ROOT'关闭了在端口'40701'监听的ID为'14564'的进程。
10:42:04 应用程序'/LM/W3SVC/2/ROOT'成功启动进程'12184',进程'12184'正在端口'47678'监听。
问题在于,尽管日志显示进程14564已被关闭,但该进程仍在运行。已检查所有应用池设置均无异常,且无法100%复现该问题,求可能的原因。
可能的原因及排查方向
- 进程未正确响应关闭信号:HTTP 202状态码仅代表IIS的关闭请求被接收,但进程可能在执行退出清理逻辑时卡住——比如存在未完成的后台任务、资源释放死锁,或是第三方组件阻塞了退出流程。在.NET 6进程外模式下,应用需正确监听
Microsoft.AspNetCore.Hosting.Server.Shutdown信号并执行清理,若清理逻辑耗时过长或出错,进程可能无法正常退出。 - IIS进程回收的竞态条件:应用重启时,IIS可能在旧进程未完全退出前就启动新进程,若旧进程处理关闭信号超时,IIS会标记其为已关闭,但实际进程仍在后台运行。可检查应用池的关闭超时时间(默认90秒),若应用清理逻辑超过该时长,IIS会尝试强制终止进程,但若进程处于不可中断状态,就会残留。
- .NET运行时或IIS模块兼容性问题:特定版本的.NET 6或IIS AspNetCore模块可能存在进程退出的bug。建议升级.NET 6到最新补丁版本,或更新IIS的AspNetCore模块,排查是否为已知问题导致。
- 后台线程或资源占用阻止退出:旧进程可能持有未释放的系统资源(如文件句柄、数据库连接),或是存在未设置为
Background模式的后台线程,这些都会阻止进程正常关闭。 - 权限不足导致无法强制终止:应用池标识的账户可能没有足够权限强制终止进程,导致发送关闭信号后,进程无法被彻底杀死。可检查应用池账户的权限,确认其拥有终止自身进程的权限。
内容的提问来源于stack exchange,提问作者KSitnik
相关产品推荐
相关产品推荐

