StackOverflow 的 X-Post:
https://stackoverflow.com/questions/9465123/intermittent-high-cpu-100-on-production-webserver
我们有一个包含 3 个 Web 服务器的 Web 集群,每个服务器有 24 个核心和 24GB 内存。
我们的应用程序是最新修补的 ASP.NET 4.0,带有 MVC3,在 IIS 7.5 上 - 在它自己的应用程序池中。
非常间歇性地(可能每 2/3 天一次),其中一个网络服务器将停止提供请求,并且所有 24 个核心将显示 100% CPU(内存和磁盘看起来正常)。
在 IIS 管理器没有完全冻结的少数情况下,正在运行的请求似乎没有提供任何有用的信息,并且随机分布在大量站点区域/请求中。
一旦服务器死机,我们就可以将其卸载 - 并且大概 5 分钟后不再提供请求后,CPU 活动将恢复正常 - 让我们认为这不是一个无限循环。
工作进程的内存转储(大小约为 4GB!)似乎没有在任何托管堆栈跟踪的任何地方显示我们的代码/命名空间 - 但只是 .Net 开始请求的内容(可能是我错误地使用了 WinDbg - 并且没有正确加载我们的符号 - 但堆栈跟踪没有显示任何缺失/未命名的方法调用 - 所以我很困惑)
我们的服务器通常可以顺利处理每秒 1000 个请求,所以这一切都非常奇怪。
我们在 Perfmon 中注意到一个奇怪的事情 - 争用率/秒上升到 800。我们的应用程序中没有任何花哨的多线程代码,我们唯一的锁是在我们的缓存代码中(它已经很久没有改变了)。
如能得到关于如何进一步诊断此问题的任何建议/提示,我们将不胜感激。
干杯。
答案1
Dave,我有几个想法要告诉你:
我假设是 w3wp.exe 占用了您的资源。如果不是,可能值得运行一些 PAL 报告以更好地了解服务器的整体运行状况:http://pal.codeplex.com/ 有时即使是 IIS 问题,我也会运行 PAL...PAL 可以发现各种您从未想过的问题。
检查性能监视器(在峰值之前和峰值期间)...尝试找出您的 ASP.Net 应用程序请求/秒在“慢响应”期间是否更高...我发现这是告诉您是否处理的请求多于正常情况的最快方法。
尝试找出是否有一个(或几个)页面需要较长时间加载。确保 IIS 统计信息已记录,然后查看加载时间是否增加。检查日志分析器 (http://www.iis.net/community/default.aspx?tabid=34&g=6&i=1864)。
哦,别忘了 StackExchange 迷你分析器http://code.google.com/p/mvc-mini-profiler/一旦您弄清楚了哪个 URL 导致了问题。
另外,不要忽视您已经设置的任何 .NET 错误捕获 :-)
让我们知道你看到了什么。 -克里斯
答案2
使用 DebugDiag 1.2 对转储进行分析:
https://www.microsoft.com/download/en/details.aspx?id=26798
值得注意的是,任何能够使用多个线程的进程都可以将服务器所有处理器的利用率推至 100%。这包括本机代码甚至核心操作系统组件。
当您说“最新修补”时,对我来说,这意味着使用 Windows 更新,它并没有获得针对 Windows 2008 R2 的许多更严重的错误修复。
特别是,如果应用程序正在访问远程共享上的任何文件,那么应用文件系统修补程序将是一个好主意:
Windows Server 2008 和 Windows Server 2008 R2 中文件服务技术的当前可用修补程序列表
http://support.microsoft.com/kb/2473205
答案3
检查它是否成为 HashDos 攻击的目标 - 并设置请求限制。