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

Pat*_*uff 12 performance windows-server-2008-r2 cpu-usage

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

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

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

这是正常的吗?如果没有,有没有办法确定哪些进程正在使用该逻辑 CPU?除了确定 CPU 处于 100% 之外,Windows PerfMon、ResMon、任务管理器和进程资源管理器没有任何帮助。

Eva*_*son 23

在“任务管理器”的“详细信息”选项卡上显示“CPU 时间”列,并查找 CPU 时间计数稳步增加的进程。这就是你的楔子过程。它应该持续使用大约 4.17% 的 CPU。


Rya*_*ies 11

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

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

Get-Process | Select Name, PrivilegedProcessorTime | `
Sort-Object PrivilegedProcessorTime -Descending
Run Code Online (Sandbox Code Playgroud)

列表顶部的进程是当前使用最多内核模式 CPU 时间的进程。如果该进程不是“系统”,那么您就已经知道是哪个用户模式进程导致了这种 CPU 使用。如果具有最高特权处理器时间的进程是系统(我怀疑是),那么它会稍微复杂一些。

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

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

xperf -on PROC_THREAD+LOADER+DPC+INTERRUPT
Run Code Online (Sandbox Code Playgroud)

并停止录制 xperf -d logfile.etl

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

当 CPU 在内核模式下工作时,它主要运行中断服务例程。(ISRs) 当中断发生时,用户模式的工作在那个处理器上暂停,CPU 运行注册到那个中断的 ISR。如果您发现您的 CPU 在这些中断上花费了过多的时间,这通常表明设备驱动程序有问题,需要更新。

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


Mic*_*elZ 10

似乎都是内核时间,可能是中断,它们可能只能由单个 CPU 处理。

  • 这难道不是驱动程序错误或与驱动程序交互而没有错误恢复的坏硬件吗?或者也许软件在一个紧密的循环中调用内核。 (6认同)

Mas*_*imo 6

寻找 CPU 利用率恒定为 ~4%(= 可用 CPU 总量的 1/24)的进程。那应该是持续占用单个 CPU 的那个。