当线程阻塞等待事件时,SysInternals 的 Process Monitor 可以记录吗?

Can SysInternals' Process Monitor log when a thread blocks awaiting for an event?

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

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

Process Monitor 是否可以配置为在线程每次休眠等待某个事件时进行记录? 如果可能,该事件是否可以与特定堆栈跟踪相关?

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

我之前已经成功地使用 Windbg 来诊断这些类型的问题,但是在这种情况下,等待时间非常短,我不确定我能否在处理器空闲时让调试器恰好中断。

Windbg 和 ProcMon 不是这项工作的正确工具。在您的开发者设备上安装 Windows Performance Toolkit,它是 Windows 10 SDK 的一部分。

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

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

将 Hang.etl + NGENPDB 文件夹移动到开发 PC,使用 Windows 性能分析器 打开 Hang.etlWPA.exe),通过将 CPU(精确)添加到分析窗格

来加载 debug symbols and start finding the hang

你会看到列 NewProcess、NewThreadId、NewStack、ReadyingProcess、ReadyingThreadId、ReadyingStack、Waits(us)。单击 Waits(us) 可在顶部查看最长的内容。现在寻找长时间,使用小计数(如此小的操作需要很长时间,操作不多)并检查调用堆栈以了解发生了什么。