推荐 vs. 可选 CPU 指标
*.usage、*.limit、*.utilization 和 *.time 指标的定义请参阅 Instrument Naming 部分,但其中未明确其 要求级别(required、recommended、opt-in)。由于这些指标以不同形式传达重叠信息,如果没有明确的指导,实现可能会变得不一致。
本文档提供了关于语义约定不同领域中 CPU 指标要求级别的指导。
政策
- 推荐:
*.cpu.time - 可选(可选):
*.cpu.utilization、*.cpu.usage、*.cpu.limit_utilization、*.cpu.request_utilization
理由
*.cpu.time 指标是明确的,因为它们直接从操作系统或运行时测量。它们可以跨 CPU 和资源进行聚合,支持空间聚合,并且可以作为在后端或收集时(在可能的情况下为了方便)派生使用率和利用率的稳定基础。
相比之下,*.cpu.usage 和 *.cpu.utilization 是派生指标或面向展示的指标。它们的定义在不同实现中可能有所不同,尤其是在容器化和 Kubernetes 环境中,CPU 限制是为每个容器或 Pod 定义的。这导致了这些指标如何计算和报告存在歧义和不一致。虽然它们可能方便仪表板和警报使用,但应保持可选,并且仅在特定环境明确提供它们时才实施。例如,Kubelet 的 stats endpoint 提供了 *.cpu.usage 的最佳指标,可直接使用,但应视为可选,因为它源自 .cpu.time 指标,并且在其他系统(如 Docker stats API)中并非唯一实现。
实施指南
- 默认情况下,应为系统、进程容器和 k8s 资源发出
*.cpu.time。 - 应将
*.cpu.*utilization和*.cpu.usage指标通过显式配置进行控制。
后端指南
- 当有用时,应提供转换或视图来从
*.cpu.time派生利用率/使用率。 - 应将
*.cpu.time视为跨系统、容器和 k8s 资源的权威信息源。
使用 CPU 时间
累积 CPU 时间值可用于派生利用率或使用率指标。
使用率指标可以使用 rate() 函数配合给定窗口计算,除以窗口大小。CPU 使用率通常以核心秒为单位。
利用率可以通过将上述结果除以给定的 CPU 限制来计算,通常范围在 [0, 1] 之间。
有关如何使用 CPU 时间来派生使用率或利用率指标的示例,请参见下文。
CPU 时间转换为使用率
rate(system.cpu.time[5m])/(5*60),以核心秒为单位。
这是 PromQL 的等效写法。rate() 函数等同于当前值减去前一个值,而分母是经过的秒数。
CPU 时间转换为利用率
rate(system.cpu.time[5m])/(5*60),以 [0, 1] 为单位,每个核心(限制等于 1 个核心)
rate(k8s.pod.cpu.time[5m])/(5*60)/k8s.pod.cpu.limit
以上将产生 k8s.pod.cpu.limit_utilization 派生指标。
排除非idle状态的利用率
要将利用率表示为系统在非idle状态下花费时间的百分比,可以使用以下方法:
sum(rate(system.cpu.time{cpu.mode!="idle"}[5m]) without (cpu.mode))/(5*60)),以 [0, 1] 为单位,每个核心。
整个系统的总利用率
要获得整个系统的利用率,可以使用所有核心的平均值:
avg(sum(rate(system.cpu.time{cpu.mode!="idle"}[5m])) by (cpu.logical_number))/(5*60)
请注意,上述公式可能存在歧义,因此它们并未作为语义约定项目的一部分进行标准化。仅作为示例提供。
像 Prometheus Node Exporter 这样的项目都提供了计算系统利用率的公式。
k8s.*.cpu.usage 的标准化是一个例外,因为它直接从 Kubelet 的 Stats API 收集,并且是 K8s 特有的。
参考
- System CPU Utilization gist,作者:Braydon Kains (@braydonk)
- 尝试引入 可选的标准化总 CPU 利用率指标