首页 > 解决方案 > 当线程阻塞等待事件时,SysInternals 的进程监视器可以记录吗?

问题描述

我需要诊断无法达到最佳性能的服务器。CPU 使用率在大约 500 毫秒内降至零,然后在尝试处理排队的请求时飙升至 100%,这种模式在几个小时内重复,之后操作再次变得平滑(操作多年来一直很平滑)

这向我表明,工作线程在等待外部事件发生时处于空闲状态。该应用程序很复杂,我们无法查明罪魁祸首。

可以将进程监视器配置为每次线程休眠等待某个事件时记录吗? 如果可能,该事件是否与特定的堆栈跟踪相关?

如果上述情况可行,也许我可以将 CPU 下降与等待事件相关联并找出罪魁祸首。

我之前已经成功地使用 Windbg 来诊断这类问题,但是在这种情况下,等待非常短暂,我不确定我是否可以在处理器空闲时让调试器完全中断。

标签: windowswindbgprocmon

解决方案


Windbg 和 ProcMon 不是这项工作的正确工具。在开发人员设备上安装Windows 性能工具包,它是Windows 10 SDK的一部分。

在此处输入图像描述

现在将文件夹复制C:\Program Files (x86)\Windows Kits\10\Windows Performance Toolkit到服务器,cmd.exe以管理员身份打开并运行wpr.exe -start CPU && timeout -1 && wpr.exe -stop C:\Hang.etl,现在最小化 cmd。

挂起后,切换回 cmd 并按一个键停止记录。

将 Hang.etl + NGENPDB 文件夹移动到开发 PC,Hang.etl使用Windows 性能分析器( WPA.exe) 打开,加载调试符号并通过将 CPU(精确)添加到分析窗格来开始查找挂起

在此处输入图像描述

让你看到 NewProcess、NewThreadId、NewStack、ReadyingProcess、ReadyingThreadId、ReadyingStack、Waits(us) 列。单击Waits(us)以查看最长的顶部。现在用一个小的 Count 查找很长时间(如此小的操作需要很长时间,而不是很多操作)并检查调用堆栈以了解发生了什么。


推荐阅读