首页 > 代码库 > 常见问题_站点出现严重的句柄泄漏问题
常见问题_站点出现严重的句柄泄漏问题
1. 句柄泄漏问题
1.1问题描述
现网正在运行的IIS虚拟目录存在严重的句柄泄漏问题,一般一周句柄会增长到1万多
1.2修复方法
(1)将.NET版本由4.0切换为2.0,并优化代码中所有非托管类型的处理
(2)将代码中的日志记录由NLog修改为Log4net
1.3问题原因
原因1:使用NLog第三方dll方式记录日志时导致FILE类型的句柄泄露。
原因2:.NET FrameWork 4.0中clr.dll存在大量线程未释放句柄,以及存在泛型导致资源未释放的问题
1.4问题分析
1.4.1现象分析
1)现网只有一个访问量非常少的站点句柄泄漏
2)现网有两种操作系统的服务器,server 2008没有句柄泄漏问题,Server 2003有句柄泄漏问题,且2003的3台服务器中,1台服务器出现泄漏的概率比较高,另外2台出现泄漏的概率比较低
推测:可能是操作系统引起的问题,可能是服务器其他软件引起的问题!但是部署在该服务器上还有其他站点,不存在句柄泄漏,可能是代码问题。
验证环境问题:确认现网ASP的小版本号是否一致,因为ASP的小版本号过低引起句柄泄漏的案例存在,确认现网小版本号是完全一致的,排除(C:\WINDOWS\Microsoft.NET\Framework)
1.4.2代码问题排查
1) 邀请外部评审进行代码走查,删除冗余代码
2) 分析现网IIS日志,删除冗余代码,确认代码中可能存在的死循环或者其他问题
3) 在测试环境进行压力测试,重新问题,并同时使用DebugDiag工具监控的dump日志,日志显示使用NLog第三方dll方式记录日志时导致FILE类型的句柄泄露、.NET FrameWork 4.0中clr.dll存在大量线程未释放句柄,以及存在泛型导致资源未释放的问题。
4)修改上述问题后重新在测试环境进行压力测试,第一阶段使用100路进行压力测试,第二阶段使用50路进行压力测试,第三阶段停止压力
数据显示随着压力减少句柄在逐渐释放
5)部署现网观察,句柄泄漏问题消失(在问题排查期间通过重启应用连接池的临时方案解决句柄数增加的问题)