我已使用Prometheus,AWS EC2 Auto发现和节点导出程序设置了监视系统。使用以下公式获取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
除少数实例外,这些指标对我所有实例均正常运行。知道发生了什么事吗?
答案 0 :(得分:1)
您看到的那些“大指数值”是累积的。即自启动虚拟机以来,CPU(或所有CPU内核?)已闲置1000多个小时(4.25e6 / 3600),因此它们看起来非常合理。
获得负值的原因是由于采样。从理论上讲,所有样本的间隔均为 scrape_interval 秒,精确到毫秒,并且每次刮擦的网络延迟和导出器处理时间都完全相同。实际上,抓取可能会延迟甚至被跳过,网络延迟会有所不同,并且目标VM可能会不时地钉住CPU(或由于任何原因而挂起)。
意思是node_cpu_seconds_total
的一个样本完全有可能在(名义上)时间V
处有值T
,在(名义上)时间V + 1
处有值T + 10s
,从而导致闲置率为110%。或您想提出的任何价值。 irate
加剧了这个问题,因为它总是查看两个连续的样本,从而增加了相对测量误差(相对于样本之间时间的误差)。
对此您无能为力,只能接受它不是一个完美的测量方法,并在其上拍一个clamp_min(<your_expression>, 0)
。使用rate
代替irate
也可以减少错误,并且通常是一个好主意,除非您要以全分辨率查看数据。