prometheus - 节点导出器显示错误的空闲 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
除少数实例外,这些指标在我的所有实例上都运行良好。知道发生了什么吗?
解决方案
您看到的那些“大指数值”是累积的。即 CPU(或所有 CPU 内核?)自 VM 启动以来已空闲 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
可能会减少错误,并且通常是一个好主意,除非您以全分辨率查看数据。
推荐阅读
- c - 在 C 中使用 printf() 和 fork() 重复输出
- python - 树节点计数器算法:请逐步解释此递归
- jquery - 使用 Jquery 和 Materialize css 在 HTML 中添加选项在 laravel 刀片中不起作用
- c++ - 如何将具有十六进制值的 std::string 转换为 std::vector
- javascript - 如何从 jQuery.fn.init() 和 jQuery.fn.init 中取出特定值 [prevObject: jQuery.fn.init()]
- javascript - 在数组数组上使用 math.random 的问题
- highcharts - Highcharts 组织结构图的拖放功能
- python - 从 json 文件中提取 URL
- javascript - 如何比较两个对象数组并删除 JavaScript 中的重复项?
- javascript - 如何在我的网站上的光标上制作十字准线效果