概述

本文档详细解释了在容器监控(尤其是使用cAdvisor/Prometheus体系)中常见的CPU相关指标。这些指标对于理解容器的CPU使用情况、性能瓶颈及资源限制至关重要。

所有指标通常以累计计数器的形式暴露,意味着其值从容器启动开始单调递增。分析时通常需要计算速率(如 per-second rate)或比率

使用量指标(Usage Metrics)

这些指标直接反映了容器对CPU时间的消耗。

CPU使用总时间

指标名称 container_cpu_usage_seconds_total
类型 Counter(累计计数器)
单位
核心说明 容器消耗的总CPU时间。这是最核心的CPU使用量指标。
详细解释 该指标统计了容器所有进程在内核态和用户态运行所花费的总CPU时间。如果容器有多个CPU核心配额,其值可能大于实际流逝的挂钟时间。
计算示例 rate(container_cpu_usage_seconds_total[5m]) 返回过去5分钟内,平均每秒消耗的CPU秒数。这个值可以直接理解为平均CPU核心使用量。例如,结果为1.2表示平均使用了1.2个CPU核心。

CPU用户态时间

指标名称 container_cpu_user_seconds_total
类型 Counter
单位
核心说明 容器在用户态消耗的CPU时间。
详细解释 指运行用户空间应用程序代码所花费的时间。通常,较高的用户态时间代表应用本身在进行计算处理。

CPU内核态时间

指标名称 container_cpu_system_seconds_total
类型 Counter
单位
核心说明 容器在内核态消耗的CPU时间。
详细解释 指代表容器执行系统调用(如文件I/O、网络I/O)时,内核运行所花费的时间。
关键关系 container_cpu_usage_seconds_totalcontainer_cpu_user_seconds_total + container_cpu_system_seconds_total

CPU限流(Throttling)指标

当容器设置了CPU限制(如Kubernetes中的limits.cpu)时,Linux内核的CFS调度器会负责执行此限制。这些指标用于判断容器是否因达到限制而被“限流”,这是性能抖动和延迟增加的常见原因。

容器CPU CFS周期总数

指标名称 container_cpu_cfs_periods_total
类型 Counter
单位 个(周期数)
核心说明 容器经历过的CFS调度周期总数
详细解释 CFS调度器以固定的周期(cfs_period_us,默认100ms)进行时间记账。此计数器记录容器自启动后经历了多少个这样的周期。

容器CPU CFS受限周期总数

指标名称 container_cpu_cfs_throttled_periods_total
类型 Counter
单位 个(周期数)
核心说明 容器被限流的周期总数
详细解释 在某个调度周期内,如果容器在周期结束前就已用尽其配额(cfs_quota_us),则该周期内剩余的时间容器将被“限流”(暂停执行),直到下一个周期开始。此计数器记录发生这种情况的周期数。

容器CPU CFS受限总时间

指标名称 container_cpu_cfs_throttled_seconds_total
类型 Counter
单位
核心说明 容器被限流的总时间
详细解释 将所有限流周期中,容器被禁止执行的时间累加起来。这是衡量性能影响最直接的量化指标。

CPU限流频率占比

核心说明 限流频率百分比衡量容器在 调度周期层面 受到CPU限制的频率,即有多少比例的CPU调度周期触发了限流机制。
单位 %
计算原理 限流频率百分比 = (被限制的周期数 ÷ 总调度周期数) × 100%
调用周期基础 Linux内核的CFS(完全公平调度器)以固定时间片(通常100ms)调度CPU资源
每个周期称为一个调度周期
触发条件 当容器在单个调度周期内使用的CPU时间超过其配额(由K8s limits设定)
该周期即被标记为限流周期该周期即被标记为限流周期
计算示例 总调度周期数:6000个周期
限流周期数:300个周期

限流频率百分比 = (300 ÷ 6000) × 100% = 5%

CPU限流时间占比

核心说明 限流时间占比衡量容器实际被暂停执行的时间比例,即因CPU限制而无法运行的时间占总时间的百分比。
单位 %
计算原理 限流时间占比 = (被限制的时间 ÷ 总运行时间) × 100%
时间维度测量
  • 不关心有多少个周期被限流,只关心总共被暂停了多久
  • 每个限流周期中,容器被暂停的时间可能不同
与频率百分比的区别
  • 场景A:10个周期中5个被限流,每个暂停20ms
    限流频率 = 50%
    限流时间 = (5×20ms)÷(10×100ms) = 10%
  • 场景B:10个周期中2个被限流,每个暂停80ms
    限流频率 = 20%
    限流时间 = (2×80ms)÷(10×100ms) = 16%
→ 场景A更频繁但时间短,场景B不频繁但暂停久
作者:叶奕珺  创建时间:2025-12-21 14:00
最后编辑:叶奕珺  更新时间:2026-01-15 14:15