我需要诊断无法达到峰值性能的服务器。在尝试处理排队的请求时,CPU使用率下降为零(大约500毫秒),然后激增至100%,这种模式会在数小时内重复出现,此后操作再次变得平稳(运行已经平稳了多年)
这向我表明,在等待外部事件发生时,工作线程正在空闲。该应用程序很复杂,我们无法查明罪魁祸首。
是否可以将进程监视器配置为在每次线程休眠等待某些事件时记录日志? 如果可能,该事件是否可以与特定的堆栈跟踪相关?
如果上述情况可行,也许我可以将CPU下降与等待事件相关联,并查明罪魁祸首。
我已经成功地使用Windbg来诊断这些类型的问题,但是,在这种情况下,等待时间非常短,并且我不确定在处理器空闲时能否使调试器完全中断。
答案 0 :(得分:2)
Windbg和ProcMon不是适合此作业的工具。在开发人员设备上安装 Windows Performance Toolkit (属于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 Performance Analyzer (Hang.etl
)打开WPA.exe
,加载debug symbols并开始finding the hang通过将CPU(精确)添加到分析窗格
使您看到的列包括NewProcess,NewThreadId,NewStack,ReadyingProcess,ReadyingThreadId,ReadyingStack和Waits(us)。点击Waits(us)
可以看到最长的标题。现在,用一个小Count(这样的小操作需要很长时间,而没有很多操作)来寻找很长一段时间,并检查调用堆栈以了解发生什么情况。