运行我们的应用程序时,总系统cpu利用率很好,但24个CUP中的一个与100%挂钩:
编辑:这是此时系统进程的PerfMon数据,以及具有高利用率的处理器:
这是正常的吗?如果没有,有没有办法确定哪个进程正在使用该逻辑cpu?除了确定cpu为100%之外,Windows PerfMon,ResMon,任务管理器和Process Explorer一直没有帮助.
以管理员身份运行Powershell,键入:
Get-Process | Select Name,PrivilegedProcessorTime | ` Sort-Object PrivilegedProcessorTime -Descending
列表顶部的进程是当前使用最内核模式cpu时间的进程.如果该进程不是“系统”,那么您只是想出了导致此cpu使用率的用户模式进程.如果具有最高特权处理器时间的进程是系统,我怀疑它是,那么它有点复杂.
打开Process Explorer. (可选)设置符号服务器.确保以完整的UAC提升运行.右键单击系统“进程”,然后转到“属性”.然后转到“线程”选项卡.按cpu使用情况对线程进行排序.导致所有这些内核模式工作的线程应该在这里.如果查看“起始地址”下列出的模块,它应该为您提供有关工作相关内容的线索.例如,如果它是NDIS.sys,那就是网络接口驱动程序.如果设置符号服务器,您应该看到模块中函数的名称(除非模块是非Microsoft的),否则您只会看到模块起始地址的数字偏移量.
或者,使用Windows性能工具包中的Xperf来分析中断,DPC等.
xperf -on PROC_THREAD+LOADER+DPC+INTERRUPT
并使用xperf -d logfile.etl停止录制
Xperf取代了旧的Kernrate工具,可以为您提供一些非常详细的数据.
当cpu在内核模式下工作时,它主要运行中断服务程序. (ISR)当发生中断时,用户模式工作在该处理器上暂停,并且cpu运行注册到该中断的ISR.如果您发现cpu在这些中断上花费了过多的时间,则通常表示需要更新的故障设备驱动程序.
关于这个场景的问题是什么(没有双关语)但是看起来好像这样做的内核线程似乎与那个核心相关联.我想知道为什么调度程序似乎只是安排线程在那个看似随意的核心上运行.所以我有一种感觉,我们需要找到谁编写这个设备驱动程序并向他们展示如何进行线程DPC,而不是在内核线程上明确设置关联性等.