如何用Prometheus查询近60天15m平均CPU负载识别低利用率服务器
Prometheus 60天周期服务器低利用率判定实现方案
原有查询的准确性问题
你最初使用的max_over_time(node_load15{instance="ServerOne",job="events_prometheus"}[60d])存在两个核心偏差,无法直接用于判定:
- 指标误用:
node_load15是15分钟平均系统负载值,不是百分比口径的CPU使用率,不能直接和10%、50%阈值对比。负载和CPU核数强相关,单核心满负载对应load值为1,换算为百分比使用率需要除以实例的CPU总核数。 - 逻辑缺失:该语句仅统计周期内负载最大值,既没有做使用率口径换算,也没有覆盖负载方差的统计维度;如果直接对原始指标做
max_over_time,还会因为Prometheus原始采样间隔不固定,出现统计值偏差。
符合规则的PromQL实现
以下查询统一按15分钟步长采样计算,匹配你要的15分钟平均负载统计口径。
规则1校验:周期内CPU使用率始终低于10%
逻辑为:按15分钟步长换算对应CPU使用率,取60天窗口内的最大值,若最大值小于10%则满足规则:
max_over_time( ( node_load15{instance="ServerOne",job="events_prometheus"} / on(instance) group_left() count without(cpu, mode) (node_cpu_seconds_total{mode="idle", instance="ServerOne",job="events_prometheus"}) * 100 )[60d:15m] ) < 10
返回值为1(true)即代表该实例满足规则1。其中子查询
[60d:15m]强制按15分钟步长采样,避免原始采样间隔不一致导致的统计误差。
规则2校验:周期内CPU使用率低于50%且负载方差较低
逻辑拆分为两个同时满足的条件:
- 60天内15分钟平均CPU使用率最大值低于50%
- 60天内15分钟CPU使用率的标准差(直接反映波动程度,方差的算术平方根)低于阈值——生产环境通常可将低波动阈值设为510,对应负载波动幅度不超过5%10%,可根据自身业务基线调整。
对应查询语句:
# 使用率最大值低于50% max_over_time( ( node_load15{instance="ServerOne",job="events_prometheus"} / on(instance) group_left() count without(cpu, mode) (node_cpu_seconds_total{mode="idle", instance="ServerOne",job="events_prometheus"}) * 100 )[60d:15m] ) < 50 and # 负载标准差低于8(阈值可自行调整) stddev_over_time( ( node_load15{instance="ServerOne",job="events_prometheus"} / on(instance) group_left() count without(cpu, mode) (node_cpu_seconds_total{mode="idle", instance="ServerOne",job="events_prometheus"}) * 100 )[60d:15m] ) < 8
返回值为1(true)即代表该实例满足规则2。
落地注意事项
- 查询前先确认Prometheus的
--storage.tsdb.retention.time参数配置大于等于60天,否则会因为历史数据缺失导致判定结果不准。 - 负载方差阈值没有通用标准,建议先拉取同集群正常业务服务器的历史标准差作为基线,再确定适配自身场景的低波动阈值。
- 如需批量校验所有实例,删除语句中
instance="ServerOne"的过滤条件即可。 - 如果希望直接使用CPU使用率指标而非负载换算,可以将语句中的负载换算部分替换为
100 - avg(rate(node_cpu_seconds_total{mode="idle"}[15m])) by (instance),统计结果和负载换算口径差异极小。
内容的提问来源于stack exchange,提问作者אברגיל יעקובו
相关产品推荐
相关产品推荐

