CPU 使用率的计算方法

翻了几篇 Prometheus 的 PromQL 查询 cpu 使用率的文章,说得都不是特别透,结合一篇英文文章终于搞明白了怎么计算这个指标。

cpu 模式

一颗 cpu 要通过分时复用的方式运行于不同的模式中,可以类比为让不同的人使用 cpu,张三使一会儿,李四使一会儿。这些模式可以用 top 命令查看,包括:

  • us:用户进程使用cpu的时间
  • sy:内核进程使用cpu的时间
  • ni:用户进程空间内改变过优先级的进程使用的cpu时间
  • id:空闲(没人用)的cpu时间
  • wa:等待io的cpu时间
  • hi:硬中断的cpu时间
  • si:软中断的cpu时间
  • st:虚拟机管理程序使用的cpu时间

这些时间加在一起是总的cpu时间,这个时间又是什么意思呢?

cpu 时间

通过 node-exporter 抓取的指标中cpu相关主要是各个 node_cpu_seconds_total

# HELP node_cpu_seconds_total Seconds the cpus spent in each mode.
# TYPE node_cpu_seconds_total counter
node_cpu_seconds_total{cpu="0",mode="idle"} 230416.36
node_cpu_seconds_total{cpu="0",mode="iowait"} 3.86
node_cpu_seconds_total{cpu="0",mode="irq"} 0
node_cpu_seconds_total{cpu="0",mode="nice"} 1.05
node_cpu_seconds_total{cpu="0",mode="softirq"} 302.24
node_cpu_seconds_total{cpu="0",mode="steal"} 0
node_cpu_seconds_total{cpu="0",mode="system"} 3829.27
node_cpu_seconds_total{cpu="0",mode="user"} 4802.39
node_cpu_seconds_total{cpu="1",mode="idle"} 230389.47
node_cpu_seconds_total{cpu="1",mode="iowait"} 30.73
node_cpu_seconds_total{cpu="1",mode="irq"} 0
node_cpu_seconds_total{cpu="1",mode="nice"} 1.09
node_cpu_seconds_total{cpu="1",mode="softirq"} 486.8
node_cpu_seconds_total{cpu="1",mode="steal"} 0
node_cpu_seconds_total{cpu="1",mode="system"} 3928.86
node_cpu_seconds_total{cpu="1",mode="user"} 4919.87

每个指标就是某一核cpu的某个模式的运行时间,单位是秒。把某一核各个模式的 cpu 时间加起来的秒数就是执行 uptime
得到的系统开机以来运行的总秒数了(/proc/uptime 的第一列,第二列是各核的空闲时间和)。这就理解了为什么这些值都是单调递增的。比如node_cpu_seconds_total{cpu="0",mode="idle"} 230416.36这个值的意思是自系统开机以来到当前时点,cpu0的空闲时间是230416.36秒。用它除以 uptime 就是开机以来 cpu0 的空闲率。加入现在是5点,那你5点过5分再查一下这个值,肯定会大于等于现在这个值。

计算 cpu 使用率的公式分解

下面一步一步推导cpu使用率的计算公式:

  1. cpu0 5分钟内处于空闲状态的时间:increase(node_cpu_seconds_total{cpu="0",mode="idle"}[5m]),increase 的意思是表示增量,刚才说了 node_cpu_seconds_total 是单调递增的,这个公式的结果是当前时点的 node_cpu_seconds_total 减去5分钟之前的 node_cpu_seconds_total,也就是这5分钟之内处于idle 状态的 cpu 时间。
  2. cpu0 5分钟内处于空闲状态的时间占比:increase(node_cpu_seconds_total{cpu="0",mode="idle"}[5m]) / increase(node_cpu_seconds_total{cpu="0"}[5m]),分母其实就是5分钟=300秒。
  3. 一台主机所有 cpu 5分钟内处于空闲状态的时间占比,用 sum() 函数累加各核数值:sum (increase(node_cpu_seconds_total{mode="idle"}[5m])) / sum (increase(node_cpu_seconds_total{mode="idle"}[5m]))
  4. 如果 Prometheus 监控多台主机,要根据每台主机做 sum:sum by (instance)(increase(node_cpu_seconds_total{mode="idle"}[5m])) / sum by (instance)(increase(node_cpu_seconds_total[5m]))
  5. cpu 使用率 = 1 - cpu 空闲率:100 * (1 - sum by (instance)(increase(node_cpu_seconds_total{mode="idle"}[5m])) / sum by (instance)(increase(node_cpu_seconds_total[5m])))

PromQL 有计算比率的函数:rate()irate(),可以简化计算公式为:

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

参考连接

irate 和 rate

官方文档定义 irate() 是基于最后两个数据点计算一个时序指标在一个范围内的每秒递增率。我半天没想明白最后两个数据点是哪两个,怎么定义的,后来忽然想到它就是你所采集到的最后两个数据,这个两个数据点的间隔就是 scrape_interval。如果使用 irate(),只要方括号中查询的时间段长度大于 scrape_interval,那么在一个 scrape_interval 之内,查询不同的时间长度的结果是一样的。举个栗子:scrape_interval 设置为30s,那么方括号里面填1m、2m、5m、10m,查询的结果是不变的,只要前后两次查询在30s之内。也就是说查询的时间范围至少要大于等于 scrape_interval,以保证这个时间范围内至少有两个数据点,大于 scrape_interval 的两倍比较保险。

rate() 是计算一个时序指标在一个范围内的每秒平均递增率,它仅使用第一个和最后一个数据点。如果查询的时间范围内仅有两个数据点,那么它的查询结果就等于 irate()。它的图像更平滑,更适合用于告警。

参考连接

Prometheus 查询语言 PromQL 的 CPU 使用率计算方法相关推荐

  1. Prometheus节点失联后CPU使用率不准确

    现象 测试节点失联自恢的程序时发现一个异常现象,失联的节点cpu使用率超过60%,实际上测试节点什么程序都没跑,cpu使用率接近0. 原因 该节点每分钟刮取一次监控数据,5分钟取得5个数据点,计算CP ...

  2. CPU使用率的计算方法

    Windows下,大家可以使用任务理器来查看系统的各种资源使用情况,我们常常比较关心的就是CPU使用率,在Linux,同样有这样可视化的软件,但是大家可能会好奇那些不断变化的数字是怎样计算出来的? 下 ...

  3. 【prometheus】计算CPU使用率

    prometheus版本 版本信息: 2.19 prometheus版本不一样,语法会有些区别,注意查看官方文档: https://prometheus.io/docs/prometheus/late ...

  4. 计算CPU使用率【prometheus】

    1.CPU使用率公式 我们知道 CPU的使用率 = (所有非空闲状态CPU使用时间总和 )/(所有状态CPU时间总和) 由下列公式: CPU使用时间总和 = 所有非空闲状态CPU使用时间总和 + 所有 ...

  5. 【Prometheus】PromQL 万字详解

    在上一文当中,通过Node Exporter暴露的HTTP服务,Prometheus可以采集到当前主机所有监控指标的样本数据.例如: # HELP node_cpu Seconds the cpus ...

  6. prometheus cAdvisor 监控docker CPU利用率 教程

    一.方案 1. 背景 promethus,原理是获取所有全量标签,然后按需过滤 监控Docker容器,Prometheus提供了几种方法来监控Docker,包括一些自定义exporter. 然而,这些 ...

  7. java 线程 cpu_java程序中线程cpu使用率计算

    最近确实遇到题目上的刚需,也是花了一段时间来思考这个问题. cpu使用率如何计算 计算使用率在上学那会就经常算,不过往往计算的是整个程序执行的时间段,现在突然要实时计算还真有点无奈,时间段如何选择是个 ...

  8. 单片机里面的CPU使用率是什么鬼?

    打开电脑的任务管理器,看着跳动的CPU使用率,发现很舒服.每一个线程占用了多少CPU清清楚楚,也就能针对性的确认为啥你的电脑跑的慢了. 今天这篇笔记不讲每个任务(或线程)CPU的使用情况,而是单片机整 ...

  9. cpu使用率_漫话性能:CPU使用率

    序言 CPU 使用率是最直观和最常用的系统性能指标,更是我们在排查性能问题时,通常会关注的第一个指标. 节拍率 为了维护 CPU 时间,Linux 通过事先定义的节拍率(内核中表示为 HZ),触发时间 ...

最新文章

  1. pandoc文档书写
  2. JavaScript获取样式值的几种方法学习总结
  3. idea从mapper接口跳到xml文件
  4. 最近QQ联系我解决问题的郁闷
  5. android表格自动刷新,Android SwipeRefreshLayout 自动刷新
  6. python做基本的图像处理
  7. spring5.x cxf3.4.x 服务端和客户端 非maven版本
  8. caffe新手常遇到的三个问题
  9. 华为云服务产品之精华问题大集烩(四)
  10. Codeforces Round #284 (Div. 2): D. Name That Tune(概率DP)
  11. SQL按字段分组取最大(小)值记录(重复记录)
  12. 自从阿里拿下 Flink 以后, 你还不懂 Flink 就 out 了
  13. 【十五分钟Talkshow】如何理解并优化.NET应用程序对内存的使用
  14. [生活] 2015年终总结,2016开篇计划
  15. vue分割开的tab组件效果
  16. 简单整蛊室友,只需几行bat病毒代码
  17. 推荐5款你用过之后不舍得卸载的小众软件
  18. java类库详解_【Java系列-4】Java常用类库_详解
  19. python中sinxcosy_编培笔记 | Python:第四班车
  20. 2018-12-16【训练日记】

热门文章

  1. 8.10 第七场 Smzzl with Tropical Taste
  2. svn 禁止访问的问题
  3. 神鬼世界更新完了为什么显示与服务器断开连接,全新服务器构架 神鬼世界6月23日数据互通公告...
  4. Trajectory Generation of a Quadrotor Transporting a Bulky Payload in the Cluttered Environments 论文解析
  5. VS2019许可证过期解决办法
  6. Unity中实现使用Gizmo绘制出攻击范围
  7. TTE系统容错设计(2) ——COM/MON机制
  8. Bosch SMI810 IMU传感器芯片驱动
  9. 对未来计算机的期盼,表达怀念过去期待未来的句子
  10. 【编写自己的RTOS】搞定任务调度