Zabbix 监控windows cpu利用率不准?
Zabbix system.cpu.util 的底层原理
使用的性能计数器
Zabbix Agent 在 Windows 上启动采集进程时,会先判断服务器的 CPU 架构,会根据系统配置自动选择不同的性能计数器:
情况一:逻辑处理器 ≤ 64 且处理器组数量 = 1(绝大多数服务器)
\Processor(_Total)\% Processor Time
\Processor(0)\% Processor Time
\Processor(1)\% Processor Time
...
\Processor(N-1)\% Processor Time
情况二:逻辑处理器 > 64 或处理器组数量 > 1(大型 NUMA 服务器)
\Processor Information(_Total)\% Processor Time
\Processor Information(0,0)\% Processor Time
...
\Processor Information(G-1,N-1)\% Processor Time
核心问题:用的是 % Processor Time,不是 % Processor Utility
无论哪种情况,Zabbix 使用的都是 % Processor Time(处理器时间百分比),这是一个基于时间的计数器。
它的计算逻辑是:
在采样间隔内,CPU 处于非空闲状态的时间占比。
公式为:(1 - 空闲时间增量 / 总时间增量) × 100
它不考虑 CPU 频率变化。 也就是说:
-
CPU 以 100% 时间忙碌,但频率降到了基准频率的 50%(如节能模式)→ 显示 100%
-
CPU 以 100% 时间忙碌,且 Turbo Boost 超频到基准频率的 150% → 仍然显示 100%
Windows 任务管理器cpu利用率原理
Windows 7 及更早版本
任务管理器使用的是基于时间的性能计数器:
-
\Processor Information(_Total)\% Processor Time(处理器时间百分比) -
\Processor Information(_Total)\% Privileged Time(特权时间百分比)
这类计数器只测量处理器忙碌的时间百分比,不考虑 CPU 频率变化。
Windows 8 及之后版本(包括 Windows 10/11)
微软改变了计算方式,任务管理器改为使用基于实用工具(Utility)的性能计数器:
-
\Processor Information(_Total)\% Processor Utility(处理器实用工具百分比) -
\Processor Information(_Total)\% Privileged Utility(特权实用工具百分比)
两种计数器的对比
两者没有绝对的“谁更准确”,只是测量维度不同——前者衡量“CPU 有没有在干活”,后者衡量“CPU 干了多少活”。
| 对比维度 | % Processor Time(Zabbix 默认) | % Processor Utility(Win8+ 任务管理器) |
|---|---|---|
| 核心定义 | CPU 忙碌的时间占比 | CPU 实际完成的工作量占比 |
| 是否考虑 CPU 频率 | 不考虑,仅统计时间 | 考虑,基于基准频率折算 |
| 睿频场景数值上限 | 最高 100% | 可超过 100% |
| 降频/节能场景表现 | 仍显示高利用率,与满频无差异 | 数值同步降低,反映真实负载 |
| 系统兼容性 | 全版本 Windows 支持,行业通用标准 | Windows 8 / Server 2012 及以上支持 |
| 适用判断场景 | CPU 调度争抢、线程拥堵、空闲程度 | 业务实际计算量、CPU 性能发挥程度 |
简单来说:
-
Zabbix 告诉你:“CPU 在过去 1 秒里有 100% 的时间没闲着。”
-
任务管理器告诉你:“CPU 在过去 1 秒里完成的工作量,相当于基准频率下满载工作量的 120%(如果开启了 Turbo Boost)或 60%(如果节能降频)。”
为什么做这个改变
举个例子:一个 CPU 以 100% 时间运行但频率降到了 50%,另一个 CPU 以 100% 时间运行在满频。旧计数器会显示两者都是 100%,但实际上前者只完成了后者一半的工作量。新计数器能更准确地反映 CPU 真正完成了多少工作,因此当 Intel Turbo Boost 将处理器频率提升到超过标称频率时,任务管理器中的 CPU 使用率甚至可能超过 100%。
💡 如果你需要在性能监视器(PerfMon)中复现任务管理器的 CPU 使用率数值,在 Windows 8 及以上系统中应添加
% Processor Utility计数器,而非传统的% Processor Time。
如何让监控真正反映 CPU 利用率
根据监控目标选择合适的指标
方向一:想要与任务管理器一致(反映实际工作量)
在 Zabbix Agent 配置文件中,通过 PerfCounter 或 PerfCounterEn 参数添加 % Processor Utility 计数器:
# zabbix_agentd.conf
PerfCounterEn=cpu_utility,"\Processor Information(_Total)\% Processor Utility",30
然后创建一个监控项,key 为 cpu_utility,即可获取与任务管理器一致的 CPU 利用率。
⚠️ 注意:使用
% Processor Utility时,如果 CPU 开启了 Turbo Boost,数值可能超过 100%,这是正常现象,表示 CPU 实际工作量超过了基准频率下的满载工作量。
方向二:保持 % Processor Time,但补充频率信息
如果你更关心"CPU 时间维度上的忙碌程度"(例如判断是否存在 CPU 争抢),可以保留默认的 system.cpu.util,同时额外监控 CPU 频率:
# 监控 CPU 当前频率(MHz)
PerfCounterEn=cpu_freq,"\Processor Information(_Total)\% Processor Frequency",30
这样可以结合两个指标综合判断:
-
system.cpu.util高 + 频率低 → CPU 忙碌但被降频,可能存在散热/电源策略问题 -
system.cpu.util高 + 频率正常 → 真实的计算密集型负载
方向三:使用行业标准公式(推荐)
Windows 11 24H2 更新后,任务管理器统一使用了以下行业标准公式:
CPU % = Δ进程CPU时间 ÷ (Δ经过时间 × 逻辑处理器数)
这与 % Processor Time 本质相同,也是 Zabbix 默认使用的逻辑。所以如果你的目标是与 PerfMon、PowerShell Get-Counter、WMI 以及第三方监控工具保持一致,Zabbix 默认的 system.cpu.util 已经是正确的选择。
📌 总结建议
| 场景 | 推荐方案 |
|---|---|
| 与任务管理器数值一致 | 使用 PerfCounterEn 添加 % Processor Utility |
| 与 PerfMon/WMI/行业标准一致 | 保持默认 system.cpu.util 即可 |
| 全面监控 CPU 状态 | 同时监控 % Processor Time + % Processor Utility + CPU 频率 |
对于大多数生产环境的告警和趋势分析,Zabbix 默认的 system.cpu.util 已经足够。只有在需要精确评估 CPU 实际做功能力(例如在虚拟化环境中评估资源超配,或在超频/降频场景下)时,才需要切换到 % Processor Utility。

浙公网安备 33010602011771号