在我们的应用程序中,有更多的2000页面部署在prod服务器中。有时当用户浏览某个URL时,CPU峰值超过70%。我找不到它何时发生以及哪个URL创建它。因此,任何人都可以告诉我最好的开源工具来监视和创建W3WP.exe处理CPU利用率的日志,并在CPU峰值超过50%时请求URL。
答案 0 :(得分:2)
有一个名为procdump的sysinternals工具,可以在cpu超过阈值时自动创建进程的内存转储以进行分析。
从命令行用法:
-c CPU threshold at which to create a dump of the process.
进行进程转储后,您需要将其加载到windbg中,以便分析占用所有cpu周期的内容。覆盖windbg非常重要,但简要介绍一下你需要做什么:
!runaway
命令获取长时间运行的线程列表!clrstack
命令有很多关于使用windbg的博客。这是one示例。分析这些类型问题的一个很好的资源是Tess Ferrandez的blog。
Perfmon可以帮助您查看问题是否与导致垃圾回收的高内存分配率有关。您可以查看CPU的w3wp以及进程的分配率和发生的Gen 2集合的数量。 Gen 2集合意味着Gen 1和0也被收集,这意味着它可能是一项昂贵的操作。计数器看:
# Gen 2 Collections
% Time in GC
Allocated Bytes/second
如果你看到一些非常高的分配率,你仍然需要一个内存转储(procdump)和windbg来分析根本原因是什么。 再一次 - Tess Ferrandez在这种高cpu风格上发表了blog帖子。在这篇文章中,问题是将大对象分配到堆上。
我自己没有尝试过,但理论上它应该有效,并且比其他选项更简单 - 尽管不会产生相同水平的细节。您可以在cpu上为w3wp.exe配置perfmon alerts。可以将警报配置为运行任务。您可以创建一个运行appcmd IIS工具的批处理文件,并告诉它转储所有正在运行的请求:
appcmd list requests > c:\temp\high-cpu-requests.txt
这样,当cpu很高时,你会得到一个长时间运行的请求列表,并希望能够从那里找出有问题的页面。
答案 1 :(得分:0)
IIS Advanced Logging可以帮到你。
虽然它不会为每个请求提供CPU利用率,但它通常可以记录CPU利用率。您可以做的是尝试将这些峰值与之前的请求相匹配。