Grafana如何使用PromQL表示CPU利用率

324 阅读2分钟

在最近的工作当中,使用到了Grafana对系统进行监控,比如说最基本的指标就是CPU,内存的使用情况,Grafana使用的是PromQL语句对指标进行查询,接下来详细介绍如何表示CPU的利用率

CPU的指标数据

  • {name="node_cpu_seconds_total", cpu="0", endpoint="https", instance="3", mode="steal"}
  • {name="node_cpu_seconds_total", cpu="0", endpoint="https", instance="3", mode="system"}
  • {name="node_cpu_seconds_total", cpu="0", endpoint="https", instance="3", mode="user"}
  • {name="node_cpu_seconds_total", cpu="1", endpoint="https", instance="1", mode="idle"}
  • {name="node_cpu_seconds_total", cpu="1", endpoint="https", instance="1", mode="iowait"}
  • {name="node_cpu_seconds_total", cpu="1", endpoint="https", instance="1", mode="irq"}
  • {name="node_cpu_seconds_total", cpu="1", endpoint="https", instance="1", mode="nice"}
  • {name="node_cpu_seconds_total", cpu="1", endpoint="https", instance="1",mode="softirq"}
  • steal:表示 CPU 被虚拟化环境中的其他虚拟机或容器“偷走”的时间,即 CPU 时间被其他实体占用的时间。
  • system:表示 CPU 在执行操作系统内核代码时的时间。
  • user:表示 CPU 在执行用户进程代码时的时间。
  • idle:表示 CPU 处于空闲状态的时间,即没有执行任何任务的时间。
  • iowait:表示 CPU 在等待 I/O 操作完成时的时间。
  • irq:表示 CPU 在处理硬件中断时的时间。
  • nice:表示 CPU 在执行优先级较低的用户进程代码时的时间。
  • softirq:表示 CPU 在处理软件中断时的时间。

在数据当中可以看出来,对应的mode表示此模式占用的时间,如果要计算CPU的利用率的话,可以选择idel模式来进行计算

计算公式的推导

increase(node_cpu_seconds_total{cpu="0",mode="idle"}[5m]) 首先是increase的定义,increase代表着这段时间选择的指标的增量,也就是最后一个数据点减去第一个数据点所对应的值,因为node_cpu_seconds_total是递增的,代表这段时间占用CPU的总时间。

{cpu = "0"}代表的就是CPU编号

{mode = "idle"}代表的就是CPU所处的模式

[5m]代表的是5分钟的区间 那么表示CPU的空闲时间最近五分钟的时间就是increase(node_cpu_seconds_total{cpu="0",mode="idle"}[5m]),increase(node_cpu_seconds_total{cpu="0",mode="idle"} 如果要表示所有的CPU的时间的话:sum(increase(node_cpu_seconds_total{cpu="0"}[5m])),如果要表示所有核的话:sum(increase(node_cpu_seconds_total[5m]))

如果要分每个主机进行求和的话sum by (instance)(increase(node_cpu_seconds_total{mode="idle"}) 空闲率推导公式为:sum by (instance)(increase(node_cpu_seconds_total{mode="idle"}[5m])) / sum by (instance)(increase(node_cpu_seconds_total[5m]))

那么就能推出使用率公式: 100 * (1 - sum by (instance)(increase(node_cpu_seconds_total{mode="idle"}[5m])) / sum by (instance)(increase(node_cpu_seconds_total[5m])))