我的所有网站都托管在IIS中,并配置了一个应用程序池。此应用程序池由10个正在运行的网站组成。
直到今天,它都工作得很好,但是突然我发现CPU使用率有一个突然的上升和下降。我找不到问题所在。
有没有办法检查应用程序池中的所有网站中哪个网站的负载较大?
发布于 2011-04-16 19:59:33
性能计数器、任务管理器和本机代码分析工具只说明了故事的一部分。为了更深入地了解你的ASP.NET应用程序内部发生了什么,你需要使用WinDBG,SOS和ADPlus。
Tess Ferrandez有一系列很棒的文章来追踪这里的罪魁祸首:
.NET Debugging Demos Lab 4: High CPU Hang - Review
这是一个真实的例子:
您可能希望将您的站点分离到单独的应用程序池中,以便识别和隔离导致高CPU的站点(但看起来您已经有了一个可疑的站点,所以我将其隔离)。从那时起,你就可以按照Tess的建议和指导来追查原因了。
您还应该查看日志,看看您是否遇到了意外的流量激增或增加。也许有一个行为不端的搜索引擎网站索引器钉住了网站。如果是这种情况,那么您可能需要(如果您还没有这样做)创建一个robots.txt,以防止爬虫对站点中不需要索引的部分进行索引。最重要的是,如果某些爬虫过于放荡,那么就禁止它们。也许可以考虑一个sitemap,让google来驯服和调整它的活动。
发布于 2011-04-16 13:04:49
如果您的服务器已达到其最大容量,您将看到CPU不稳定地上升和下降,因为GC将开始尝试恢复资源(cache..etc),这反过来会导致您的站点更加努力地工作。这是一个无尽的循环。
您是否一直在监控您的性能计数器?你知道你的网站的正常容量是多少吗?如果你不能回答这些问题,我建议你尽快收集一些性能数据。
我的经验法则是总是先测量,然后进行必要的改变。
大多数情况下,性能瓶颈并不是您所认为的那样。
发布于 2011-04-16 14:24:33
实际上没有性能计数器的方法可以判断,因为CPU计数器处于进程级别。最好的办法是与事件日志和.NET/ASP.NET计数器中的其他事件建立时间关联,以便进行垃圾收集、请求等。
如果你真的想成为硬核,你可以使用SysInternals工具集来拍摄你的应用程序池的快照,然后进行后期分析,找出峰值发生时执行了哪些代码。这里有一个来自Mark Russinovich的博客- http://blogs.technet.com/b/markrussinovich/archive/2008/04/07/3031251.aspx的相关例子。
https://stackoverflow.com/questions/5680332
复制相似问题