我正在尝试监视安装以及哪些进程使用 CPU 最多,以查看是否对其施加了过多的负载。
目前,我正在使用以下方式监控安装性能监视器,使用计数器
\Processor(_Total)\% Processor Time
(总体使用情况)\Process(*)\% Processor Time
(每个过程的使用情况)。
让我不爽的是,当我将日志输出到 CSV 时,
\Processor(_Total)\% Processor Time
!=Process(_Total)\% Processor Time
\Process(_Total)\% Processor Time
\Process(x)\% Processor Time
!=所有正在运行的进程的总和(x
)
我究竟做错了什么?
答案1
使用的总处理器时间 ( \Processor(_Total)\% Processor Time ) 与进程总 CPU 时间 ( Process(_Total)\% Processor Time \Process(_Total)\% Processor Time ) 之间的差异可能是由于在升高的 IRQL 上花费的时间所致。这在 PerfMon 中显示为“% 中断时间”和“% DPC 时间”。
中断时间是花在中断服务例程上的时间,或与中断服务例程一起序列化的时间;此类代码在 IRQL 3 及以上级别运行。DPC 时间是花在“DPC 例程”上的时间,或与中断服务例程一起序列化的代码;此类代码在 IRQL 2 级别运行。DPC 例程主要用于处理由中断触发的工作,但不必在与 ISR 相同的序列化上下文中完成。
存在差异是因为在 DPC 级别或更高级别上花费的 CPU 时间确实包含在总处理器时间中,但不包含在任何线程或进程的 CPU 时间中。这是因为此类代码不一定与当前线程的活动相关,因此没有必要为该时间“收取”当前线程的费用。
\Process(_Total)\% Processor Time 与所有正在运行的进程的 \Process(x)\% Processor Time 总和之间的细微差异很可能是由于 PerfMon 中的数据收集问题造成的。您会发现,没有名为“_Total”的进程对象,也没有与该概念相匹配的 CPU 使用率计数器集。PerfMon 计算此总数的方法是简单地将收集时存在的每个进程的 CPU 时间相加。同样,所有进程的 CPU 时间百分比也不是同时收集的。因此,PerfMon 观察到的总数与将显示屏上看到的所有计数器相加后得到的总数之间可能会出现轻微的“偏差”。