首页 > 解决方案 > 节点导出器显示错误的空闲 CPU 时间

问题描述

我已经使用 prometheus、AWS EC2 自动发现和节点导出器建立了一个监控系统。使用以下公式获取 CPU 利用率:

100 - (avg by (instance) (irate(node_cpu_seconds_total{instance="instancexyz" ,mode="idle"}[5m])) * 100)

但是,在一个特定的 ASG 中,我得到的 CPU 百分比是较大的负值。我打开了 instance:9100/metrics 链接,发现空闲值是大指数值。这是我得到的一个值:

node_cpu_seconds_total{cpu="0",mode="idle"} 4.25766215e+06

除少数实例外,这些指标在我的所有实例上都运行良好。知道发生了什么吗?

标签: prometheusgrafanaprometheus-node-exporter

解决方案


您看到的那些“大指数值”是累积的。即 CPU(或所有 CPU 内核?)自 VM 启动以来已空闲 1000 多个小时(4.25e6 / 3600),因此它们看起来非常合理。

你得到负值的原因是因为抽样。从理论上讲,所有样本都恰好相隔以毫秒为单位的scrape_interval秒,并且每次抓取的网络延迟和导出器处理时间完全相同。在实践中,刮擦可能会延迟甚至跳过,网络延迟会有所不同,并且您的目标 VM 可能会时不时地固定其 CPU(或因任何原因挂起)。

这意味着例如,一个样本完全有可能node_cpu_seconds_totalV(名义上)时间T和价值V + 1在(名义上)时间T + 10s,导致空闲率为 110%。或者你想提出的任何价值观。irate加剧了这个问题,因为它总是查看两个连续的样本,增加了相对测量误差(相对于样本之间时间的误差)。

对此您无能为力,除非接受它不是一个完美的测量值并在其clamp_min(<your_expression>, 0)上打一个耳光。使用rate而不是也irate可能会减少错误,并且通常是一个好主意,除非您以全分辨率查看数据。


推荐阅读