PromQL技术咨询:如何查询实例7天最大CPU使用率及识别低利用率实例
你的PromQL问题解析与正确实现
先直接说结论:你给出的两个查询都有问题,核心问题是没对非idle的CPU mode求和,而且第一个查询的rate窗口用错了。
先分析你两个查询的问题
第一个查询:
max(rate(node_cpu_seconds_total{service="x",mode!="idle"}[7d]) *100 ) by (instance)rate(node_cpu_seconds_total[7d])完全错误:rate是计算短时间窗口内的平均速率,用7天窗口会把整个7天的CPU使用拉成一个平均值,根本反映不了峰值。- 没有对
mode!="idle"的指标求和:node_cpu_seconds_total按mode拆分(比如user、system、nice等),你现在取的是单个mode的最大值,不是实例的总CPU使用率。
第二个查询:
max( max_over_time(rate(node_cpu_seconds_total{service="x",mode!="idle"}[5m])[7d:])*100) by (instance)- 同样没对非idle mode求和:结果是单个mode的峰值,不是总CPU使用率。
- 外层的
max by (instance)多余:max_over_time已经是针对每个时间序列(每个instance+mode)取7天内的最大值,你需要的是把同一实例的所有非idle mode加总后再取峰值。
正确的查询实现
要实现“每个实例过去7天的最大CPU使用率,再过滤出峰值从未超过20%的实例”,正确的查询应该是:
max_over_time( sum by (instance) ( rate(node_cpu_seconds_total{service="x", mode!="idle"}[5m]) )[7d:] ) * 100 <= 20
拆解说明
sum by (instance):把user、system、iowait等所有非idle的CPU时间指标加总,得到该实例的总CPU使用率(0到1之间的数值)。rate(node_cpu_seconds_total[5m]):计算5分钟窗口内的平均CPU使用速率,这个窗口长度可以根据你的监控采集间隔调整(比如1m或10m),避免瞬时噪声影响结果。max_over_time([7d:]):取过去7天内,每个5分钟窗口计算出的CPU使用率的最大值,也就是该实例7天内的峰值CPU使用率。*100:把0-1的数值转成百分比,方便和20%做比较。<=20:过滤出过去7天内峰值CPU使用率从未超过20%的低利用率实例。
可选优化
如果想先看到所有实例的7天峰值CPU使用率,再手动筛选,可以去掉最后的<=20:
max_over_time( sum by (instance) ( rate(node_cpu_seconds_total{service="x", mode!="idle"}[5m]) )[7d:] ) * 100
内容的提问来源于stack exchange,提问作者Laxmikant
相关产品推荐
相关产品推荐

