我所有的网站都托管在 IIS 中,并配置了一个应用程序池。该应用程序池包含 10 个正在运行的网站。
直到今天它工作正常,但突然间我观察到 CPU 使用率突然上升和下降。我无法找出问题所在。
有没有办法检查应用程序池中哪个网站负载很大?
性能计数器、任务管理器和本机代码分析工具只能说明部分情况。要更深入地了解 ASP.NET 应用程序内部发生的情况,您需要使用 WinDBG、SOS 和 ADPlus。
Tess Ferrandez有一系列很棒的文章来追查这里的责任:
这是一个真实世界的例子:
您可能希望将您的站点分成单独的应用程序池,以便您可以识别和隔离导致高 CPU 的站点(但看起来您已经有了嫌疑人,所以我会隔离那个)。从那时起,您可以按照苔丝的建议和指导来追查原因。
您还应该查看日志,看看您是否遇到了意外的高峰或流量增加。也许有一个行为不端的搜索引擎站点索引器钉住了该站点。如果是这种情况,那么您可能需要(如果您还没有这样做)创建一个robots.txt
以防止爬虫索引网站中不需要索引的部分。最重要的是,如果某些爬虫过于滥交,那么就禁止它们。或许可以考虑为谷歌提供一个站点地图来驯服和调整其活动。
如果您的服务器已达到其最大容量,您将看到 CPU 不规律地上升和下降,因为 GC 将开始尝试恢复资源(缓存..等),这反过来会导致您的站点更加努力地工作。这是一个无限循环。
您是否一直在监控性能计数器?您知道您网站的正常容量是多少吗?如果你不能回答这些问题,我建议你尽快收集一些性能数据。
我的经验法则是始终先测量,然后进行必要的更改。
大多数时候,性能瓶颈并不在您认为的位置。
实际上没有性能计数器可以说明,因为 CPU 计数器处于进程级别。您最好的选择是与事件日志中的其他事件和 .NET/ASP.NET 计数器进行时间关联,以进行垃圾收集、请求等。
如果您真的想成为硬核,您可以使用 SysInternals 工具集随时间拍摄您的应用程序池的快照,然后进行后期分析以找出在峰值发生时执行了哪些代码。这是来自 Mark Russinovich 博客的相关示例 - http://blogs.technet.com/b/markrussinovich/archive/2008/04/07/3031251.aspx。