我有一台 HP ProLiant DL380 G7 系统,使用 2 个 6 核 CPU,启用超线程,总共有 24 个逻辑 CPU(Windows 所见)。
运行我们的应用程序时,系统总体 CPU 利用率良好,但 24 个 CUP 中有一个固定在 100%:
编辑:这是此时间段内系统进程以及利用率较高的处理器的 PerfMon 数据:
这是正常的吗?如果不是,有没有办法确定哪些进程正在使用该逻辑 CPU?除了确定 CPU 为 100% 之外,Windows PerfMon、ResMon、任务管理器和 Process Explorer 没有任何帮助。
答案1
正如其他人已经指出的那样,我们可以从该屏幕截图中看到,工作如此努力的 CPU 将其所有时间都花在内核模式上。(红色。)
以管理员身份运行 Powershell,输入:
Get-Process | Select Name, PrivilegedProcessorTime | `
Sort-Object PrivilegedProcessorTime -Descending
列表顶部的进程是当前使用最多内核模式 CPU 时间的进程。如果该进程是不是“系统”,那么您刚刚弄清楚了哪个用户模式进程导致了此 CPU 使用率。如果特权处理器时间最高的进程是系统(我怀疑是系统),那么事情就稍微复杂一些了。
打开进程资源管理器。(可选)设置符号服务器。确保您正在以完全 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,而不是明确设置内核线程的亲和性等。
答案2
在“任务管理器”的“详细信息”选项卡上显示“CPU 时间”列,并查找 CPU 时间计数稳步增加的进程。这就是您的楔入进程。它应该持续使用大约 4.17% 的 CPU。
答案3
这似乎都是内核时间,可能是中断,它们可能只由单个 CPU 处理。
答案4
查找 CPU 利用率恒定为 ~4%(= 总可用 CPU 的 1/24)的进程。该进程应该是持续占用单个 CPU 的进程。