ASP.NET 性能计数器暂时降至零

ASP.NET 性能计数器暂时降至零

VM 映像存在一些性能问题(我无法访问 VM 主机,只能访问客户操作系统)。

尝试确定为什么在 10 到 60 秒的时间段内服务器会停止发出任何请求。

在执行此操作时,我运行了几个性能计数器,但我注意到一些非常奇怪的事情,在这些“死区”开始后不久,我的所有 ASP.NET 应用程序计数器(活动会话、管道实例计数、正在执行的请求)都降至零,然后在我们摆脱“死区”后立即回升至正常水平。参见此处的图表:

在此处输入图片描述

我 100% 肯定,即使这些会话从计数器统计中删除,但它们在整个时间段内仍然正常运行。

以前有人见过计数器的这种行为吗?是否有可能是某种 VM 资源匮乏导致这些计数器行为异常,甚至可能导致死机期?

答案1

我们刚刚遇到了这个问题 - 这让我很抓狂,还引发了很多其他问题。在那个低谷期间,请求会停滞,BeginRequest或者MapRequestHandler- 然后它们会在 10 多秒后突然再次开始进入状态。

根本原因是 IIS 应用程序正在其自己的 /bin 目录中写入文件。IIS 检测到它并发出软回收,暂时将监听工作程序的数量减少到 0(由Pipeline Instance Count和我发现这个问题的原因所示)。然而,这并没有在任何其他工具中显示为新进程或类似内容。

我们通过使用以下方法对所有 IIS 进程进行小型转储来找到它调试诊断2在一次速度变慢时,MS 发出警告,这是通过使用 Fiddler ping 一个小端点发现的。DebugDiag 有一个 CrashHangAnalysis 报告。该报告中有很多信息 - 花了一段时间才找到包含和的HttpRuntime Shutdown Report堆栈跟踪。System.Web.DirectoryMonitor.FireNotificationsSystem.Web.Compilation.BuildManager.OnWebHashFileChange

这让我查看了 prod bin 目录,发现那里写入了一个错误的电子邮件日志,导致 IIS 回收了该应用程序。这尤其奇怪,因为 New Relic 中应用程序的内存图只显示了看似稳定的内存泄漏,但实际上整个应用程序正在重新启动(有点)并且只是增加了现有内存。它看起来不像是正常的回收,PID 保持不变。不知道 IIS 试图做什么魔术。

此外,将 IIS AppPool 高级设置更改Disable Recycling for Configuration Changes为 并True不能阻止此问题,如另一个问题。我们必须更改并重新部署二进制文件来修复它。

相关内容