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

问题描述 投票:0回答:1

我需要诊断一台无法达到峰值性能的服务器。 CPU使用率在500ms左右下降到零,然后在处理排队请求时激增到100%,这个模式在几个小时内重复,之后操作又变得平稳(操作已经平稳了很多年)。

这说明工作线程在等待外部事件发生时处于空闲状态。 这个应用程序很复杂,我们还不能确定罪魁祸首。

能否配置Process Monitor来记录每次线程睡眠等待某个事件发生的情况?如果可以的话,是否可以将该事件与某个特定的堆栈跟踪相关联?

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

我以前曾成功地使用Windbg诊断过这类问题,然而在这种情况下,等待的时间非常短暂,我没有信心能让调试器正好在处理器空闲时中断。

windows windbg procmon
1个回答
2
投票

Windbg和ProcMon不是这个工作的正确工具。安装 Windows性能工具箱 属于 Windows 10 SDK 在你的开发者设备上。

enter image description here

现在将文件夹复制到 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。

得到hang后,切换回cmd,按一键停止记录。

将Hang.etal + NGENPDB文件夹移到开发电脑上,打开Hang.etal文件夹。Hang.etlWindows性能分析器 (WPA.exe),加载 调试符号 并开始 悟性 通过在分析窗格中添加CPU(精确)来实现。

enter image description here

并使酸你看到NewProcess、NewThreadId、NewStack、ReadyingProcess、ReadyingThreadId、ReadyingStack、Waits(us)这几列。点击 Waits(us) 来看最长的在上面。现在看时间长,Count小(所以小操作,需要的时间长,操作不多),检查callstack有什么线索发生。

© www.soinside.com 2019 - 2024. All rights reserved.