Azure WebApps 泄漏句柄 "out of nothing"

Azure WebApps leaking handles "out of nothing"

我有 6 个 Web 应用程序(asp.net、windows)运行正在使用 Azure,它们已经 运行已使用多年。我会不时调整,但没有大的变化。

大约一周前,它们似乎都在泄漏句柄,如图所示:这只是最近 30 天,但恒定曲线会“永远”返回。现在,虽然我对一些网站做了一些小改动,但至少有 3 个网站我根本没有接触过。

但是,一周前所有站点都开始出现重大泄漏。知道是什么原因造成的吗?

我想补充一点,其中一个站点只有一个 aspx 页面,而另一个站点根本没有任何代码。它只是 运行 一个包含 letsencrypt 脚本的网络作业。这几个月都没有改变。

所以基本上,我正在寻找任何指示,但我怀疑这可能与我的代码有任何关系,因为其中 2 个站点没有我的任何代码并且仍然显示相同的症状。

看来这是 azure 的问题。以下是azure技术支持当前回复的相关部分:

==> 我们直接与 PG 团队讨论过,我们观察到,很少有其他客户也面临这个问题,因此我们的产品团队正在积极努力,以尽早解决这个问题。很有可能,修复应该会在几天内可用,除非出现意外情况并阻止我们完成补丁。 <==

将在可用时添加更多信息。

来自产品团队的最终信息:

Microsoft Azure 团队已调查您遇到的导致应用程序中句柄数量增加的问题。句柄数量过多可能会导致应用程序运行缓慢和崩溃。

经过调查,工程师发现最近升级的 Azure App Service 改进了平台监控,导致应用程序工作进程中的注册表项句柄泄漏。有问题的注册表项句柄未被平台拥有并注入到每个 Web 应用程序中的模块正确关闭。此模块确保 Azure 应用服务的各种基本功能和特性,如正确处理 HTTP headers、远程调试(如果启用和适用)、通过 load-balancers 向客户端和其他人返回正确的响应。这个模块最近得到了改进,包括在基础设施中传递的额外信息(不离开 Azure 应用服务的边界,所以提到的信息对客户不可见)。此信息包括处理每个请求的模块版本,因此当组件版本更改引起问题时,内部检测可以更容易和更快。该问题是由于在从计算机的注册表中读取版本信息时未关闭特定的注册表项句柄造成的。

作为 workaround/mitigation 万一客户发现任何问题(例如应用程序延迟增加),建议重新启动 Web 应用程序以重置所有句柄并立即清除内存中的所有泄漏。

工程师准备了一个修复程序,将在下一次定期计划的平台升级中推出。还有一个平行推出的临时修复程序,应该在 12 月 23 日前完成。推出此临时修复程序后重新启动的任何应用程序都不应再观察到该问题,因为重新启动的进程将自动选择有问题的模块的新版本。

我们正在不断采取措施改进 Azure Web App 服务和我们的流程,以确保将来不会发生此类事件,在这种情况下,它包括(但不限于): • 修复平台模块中的注册表项句柄泄漏 • 修复测试覆盖率和监控方面的差距,以确保此类回归不会在未来再次发生,并在向客户推出之前自动检测到