我有一个 DAG 设置,其中在三台服务器上运行 Server 2012 R2 和 Exchange 2013,另外还有另一台服务器用于滞后副本。
我们似乎在所有服务器上都存在句柄泄漏,无论它们是否托管数据库似乎都无关紧要。然而,让我感到奇怪的是,句柄泄漏似乎并没有占用大量资源,例如,它并没有随着句柄的增加而使用大量内存,即使其中一个服务器的句柄达到 261076 个峰值,它的内存使用量也没有真正增加很多。
句柄泄漏者是 Windows 进程 LSASS,这也是一个令人头疼的问题,因为虽然我使用 Perfmon 进行监控,并且使用了 RAMmap、Process Explorer 等,但事实证明,这是一个很难排除故障的问题,因为 LSASS 本身不是原因,无论是“使用”LSASS 才是问题所在。
我对性能故障排除相当了解,但只使用.NET 等进行内部编码。这个盒子上的所有东西都是微软的。
所以我想我的问题是:
句柄泄漏和内存泄漏有什么区别?在没有内存泄漏的情况下,是否存在句柄泄漏?如果存在,那么纯句柄泄漏的危险性是什么?
我还能做什么来解决这个问题?我本来打算安装 SDK 并使用 UMDH 和 Gflags 来拍摄内存快照,但速度不是很快,所以这会有点痛苦。
获取了大量信息但不确定哪些是相关的,因此您需要询问的任何信息我都可以提供。
谢谢,
查尔斯
答案1
句柄泄漏是内存泄漏的一种特殊情况。您正在泄漏一个定义狭窄的池中的内存:一组可用句柄。通常,句柄是一个内存指针,在 64 位机器上占用 8 个字节。因此,261076 个句柄乘以 8 个字节等于 2039kB,略低于 2meg。这对现代机器来说只是一笔小钱。
但你需要注意的问题是:当句柄用完时会发生什么?你的应用程序会如何降级?是否有硬性限制,还是在达到最大值之前就开始出现故障?当句柄数量超过某个点时,你可以绘制句柄数量图表并重新启动服务吗?有没有办法改变句柄数量的限制来缓解这个问题?重新启动服务可以解决问题吗,还是需要重新启动?