【问题标题】:Can SysInternals' Process Monitor log when a thread blocks awaiting for an event?当线程阻塞等待事件时,SysInternals 的进程监视器可以记录吗?
【发布时间】:2026-01-16 04:40:01
【问题描述】:

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

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

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

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

我之前曾成功使用 Windbg 诊断过这类问题,但在这种情况下,等待时间很短,我不确定能否在处理器空闲时让调试器完全中断。

【问题讨论】:

标签: windows windbg procmon


【解决方案1】:

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,使用 Windows 性能分析器 (WPA.exe) 打开 Hang.etl,加载 debug symbols 并添加 finding the hang CPU(精确)到分析窗格

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

【讨论】: