我有一台服务器,它正在积累系统进程(又名 c:\windows\system32\ntoskrnl.exe)上的句柄。句柄在一天内达到 18,000 个,并且以这种速度不断增加。该服务器正在运行 Postgresql 9.0.3、插入数据库的 asp.net web 服务以及查询数据库的 asp.net 网站。通过 gSOAP 从 Linux 和 Windows 测试机器访问 web 服务。我在系统进程上运行了 Process Explorer,额外的句柄被列为 Type Key。我在 regiet 中找到它们。以下是从 regedit 导出的两个示例。
1.
Key Name: HKEY_LOCAL_MACHINE\SOFTWARE\Wow6432Node\Classes\CLSID\{2e167ea7- 85e3-4395-995a-77af9875d79a}\InprocServer32
Class Name: <NO CLASS>
Last Write Time: 7/13/2009 - 10:53 PM
Value 0
Name: <NO NAME>
Type: REG_EXPAND_SZ
Data: %systemroot%\system32\colbact.dll
Value 1
Name: ThreadingModel
Type: REG_SZ
Data: Both
2.
Key Name: HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{91162401-6E6B-478A-A7FF-994EBA35B9C3}
Class Name: <NO CLASS>
Last Write Time: 7/13/2009 - 10:54 PM
Value 0
Name: <NO NAME>
Type: REG_SZ
Data: PSFactoryBuffer
Key Name: HKEY_CLASSES_ROOT\Wow6432Node\CLSID\{91162401-6E6B-478A-A7FF-994EBA35B9C3}\InProcServer32
Class Name: <NO CLASS>
Last Write Time: 7/13/2009 - 10:54 PM
Value 0
Name: <NO NAME>
Type: REG_EXPAND_SZ
Data: %SystemRoot%\system32\ime\shared\imeapis.dll
Value 1
Name: ThreadingModel
Type: REG_SZ
Data: Both
插入数据库的 Web 服务全天执行约 130,000 次。插入包括在内联网上运行 Windows 或 Linux 的虚拟机使用测试结果数据通过 gSOAP 调用 Web 服务函数。数据是字符串和数字。Web 服务打开数据库连接,将数据插入数据库并关闭连接。所讨论的数据库有 150 GB 大。我已经检查了数据库使用代码,顺便说一下,它是 C#,据我所知,每个数据库连接都在关闭。除了句柄累积之外,服务器功能运行良好。
当句柄数达到大约 150,000 时,网站开始出现异常,我必须重新启动,这是有问题的,因为测试机器正在用测试结果轰炸网络服务。
是什么原因导致句柄累积?任何帮助都将不胜感激。谢谢。
答案1
事实证明,句柄泄漏来自 SaferNet Inc. 开发的许可证管理器程序中的驱动程序。SmartBear 软件的 AQTime 使用此许可证管理器,这就是我们遇到的问题。我正在与 SmartBear 合作解决这个问题。
我能够使用 Sysinternals 中的进程监视器精确定位未关闭的注册表打开。然后我查看了相关句柄的调用堆栈,发现 SaferNet 的驱动程序调用了 ntoskrnl。
最终,该问题与 IIS、gSOAP 或 postgresql 无关。
SmartBear 的工作人员提供了较新的许可证管理器。我将其安装在旧许可证管理器上,漏洞就消失了。