节点导出器显示错误的空闲 CPU 时间

Ana*_*sim 0 grafana prometheus prometheus-node-exporter

我已经使用 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

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

Ali*_*ean 5

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

你得到负值的原因是因为采样。理论上,所有样本都精确到毫秒级的scrape_interval秒,并且每次抓取的网络延迟和导出器处理时间完全相同。在实践中,抓取可能会被延迟甚至跳过,网络延迟会有所不同,您的目标 VM 可能会时不时地将其 CPU 挂起(或因任何原因挂起)。

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

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