为什么我的24个CPU中有1个固定为100%?


12

我有一个HP ProLiant DL380 G7系统,该系统使用2个6核CPU,并且启用了超线程,总共有24个逻辑CPU(如Windows所示)。

运行我们的应用程序时,系统的总CPU利用率很好,但是24个CUP之一被固定为100%: 在此处输入图片说明

编辑:这是这段时间内系统进程以及具有高利用率的处理器的PerfMon数据: 在此处输入图片说明

这正常吗?如果不是,是否有办法识别正在使用该逻辑CPU的进程?Windows PerfMon,ResMon,任务管理器和进程资源管理器没有任何帮助,只能识别出CPU为100%。


29
我的猜测是它正在使用中,因为某个进程正在使用它。
HopelessN00b 2014年

1
您知道您可以将鼠标悬停在图形上并获得提示,告诉您哪个进程占用该处理器上的CPU最多?
Lieven Keersmaekers 2014年

我会怀疑10万个中断增量。您应该发布一个Process Explorer进程列表屏幕截图,从中可以看到它对系统,DPC,中断之类的内容的提示。
加布2014年

@RyanRies; 我们的“应用程序”由几个.Net WCF服务,WebSphere MQ和一些第三方监控软件组成。
Patrick Cuff 2014年

2
与将进程从一个CPU调度到另一个CPU相比,将一个进程从一个CPU迁移到另一个CPU相对昂贵,因此,如果一个进程确实需要CPU,则OS通常会倾向于不移动它。
迈克尔·汉普顿

Answers:


11

正如其他人已经指出的那样,我们可以从该屏幕截图中看到,工作如此努力的CPU一直将所有时间都花在内核模式上。(红色。)

以管理员身份运行Powershell,输入:

Get-Process | Select Name, PrivilegedProcessorTime | `
Sort-Object PrivilegedProcessorTime -Descending

列表顶部的进程是当前使用最多内核模式CPU时间的进程。如果该进程不是 “系统”,则您已经找出导致此CPU使用率的用户模式进程。如果“特权处理器时间”最长的进程是“系统”(我怀疑是“系统”,那么它会稍微复杂一些)。

打开进程资源管理器。(可选)设置符号服务器。确保您以完整的UAC海拔高度运行。右键单击系统“进程”,然后转到“属性”。然后转到“线程”选项卡。按CPU使用率对线程进行排序。导致所有这种内核模式工作的线程应该在这里。如果您查看“起始地址”下列出的模块,它应该为您提供与工作有关的线索。例如,如果是NDIS.sys,则它是网络接口驱动程序。如果设置了符号服务器,则应该看到模块中的函数名称(除非该模块不是Microsoft,否则),您只会看到与模块起始地址的数字偏移量。

或者,使用Windows Performance Toolkit中的Xperf来分析中断,DPC等。

xperf -on PROC_THREAD+LOADER+DPC+INTERRUPT

然后停止录制 xperf -d logfile.etl

Xperf替代了旧的Kernrate工具,可以为您提供一些非常详细的数据。

当CPU在内核模式下工作时,它主要运行中断服务程序。(ISR)发生中断时,该处理器上的用户模式工作被挂起,并且CPU运行注册到该中断的ISR。如果您发现CPU在这些中断上花费了过多的时间,则通常表明设备驱动程序有故障,需要对其进行更新。

什么错误我(没有双关语意)有关此方案是,它虽然看起来好像什么内核线程是这样做似乎affinitized到一个核心。我想知道为什么调度程序似乎只调度线程在那个看似任意的内核上运行。因此,我有一种感觉,我们需要找到编写此设备驱动程序的人,并向他们展示如何执行线程DPC,而不是显式设置内核线程等。


IIRC,对于操作系统来说,仅使用单个CPU来处理硬件中断是非常标准的行为……
Massimo 2014年

1
@Massimo对于旧的操作系统可能是这种情况,但现在不再如此。每个CPU都有自己的中断描述符表,每个处理器都有自己的IRQL。如果一个CPU由于某种原因(例如已经在处理中断)停留在较高的IRQL上,则它无法接收相同或较低级别的中断,因此Windows会将中断提供给另一个处理器,或者仅保留该中断直到CPU可用。甚至计时器(以前臭名昭著的仅在CPU0上运行的对象)现在也具有处理器选择算法。
Ryan Ries 2014年

但是,是的,这就像运行遗留关系差的旧版或写得不好的应用程序一样简单,并随后进行大量的系统调用。中断通常需要在调用它们的同一个CPU上开始和结束...但是通常即使是单线程应用程序,在运行时也会在内核之间达到“负载平衡” ...这似乎有些奇怪亲和力。
Ryan Ries 2014年

@RyanRies; 我在系统上安装了Windows Performance Toolkit,并使用了Windows Performance Recorder。上面的xperf命令不断给出错误。高CPU看起来像是来自:进程-系统;模块-ntoskrnl.exe; 线程-Phase1Initialize; 功能-KeZeroPages。它仅在应用程序运行时发生,因此,我认为(希望)我有足够的能力回馈给开发人员,但我也对您可能拥有的任何想法感兴趣。
Patrick Cuff 2014年

23

在“任务管理器”的“详细信息”选项卡上显示“ CPU时间”列,并查找CPU时间计数稳定增长的进程​​。那就是你的过程。它应该经常使用约4.17%的CPU。


10

这似乎是所有内核时间,可能是中断,它们可能仅由单个CPU处理。


+1-确实看起来像内核时间,不是吗。
Evan Anderson

那会出现在“系统”过程中吗?我们在测试运行期间收集的PerfMon数据的“系统”进程具有100%的CPU。
Patrick Cuff 2014年

是的,我认为这应该归于系统内(如果有列出...)
MichelZ 2014年

6
难道不是驱动程序错误或与驱动程序交互而没有错误恢复的不良硬件吗?或者,可能是软件在紧密的循环中调用了内核。
Zan Lynx 2014年

1
@MichelZ,一个进行一系列系统调用(其中包括任何I / O)的用户进程看起来像这样。
reirab 2014年

6

寻找一个恒定CPU使用率约为4%(等于总可用CPU的1/24)的进程。那应该是连续占用一个CPU的那个。

By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.