已采纳
回答正文
回复
讨论正文
该问题的正文、回答与讨论。
12 节点网关集群(K8s 1.28.9,containerd 1.7.13),之前跑 cgroup v1 / 内核 5.15。最近统一把节点内核升到 6.1、容器运行时切到 cgroup v2(stat -fc %T /sys/fs/cgroup/ 返回 cgroup2fs,确认已迁移)。
我们一直用 cAdvisor 的 container_cpu_cfs_throttled_periods_total / container_cpu_cfs_throttled_seconds_total 配"throttle 占比 > 20% 告警",作为 P99 长尾的兜底监控(参考 @苏砚舟-103 那篇 P99 翻 5 倍的复盘,以及 @沈景行 问的"真忙 vs 被节流"——这两处都默认指标还在正常上报)。
迁移到 cgroup v2 后,这套告警一条都没再触发——不是值变 0,而是指标序列直接 no data / 整个 series 消失。cAdvisor 进程还在跑,/metrics 里 container_cpu_cfs_throttled_periods_total 这个 metric 名还在,但值恒为 0 或根本没出数据。与此同时业务侧 P99 又开始偶发抖动,我强烈怀疑还是 CFS throttle 在作,但现在没有任何告警能兜住它。
stat -fc %T /sys/fs/cgroup/ → cgroup2fs,mount | grep cgroup 只有 cgroup2 挂载,v1 已卸载。cpu.stat 里 throttle 相关字段名我观察到是 nr_throttled / throttled_usec(v1 我记得是 throttled_time)。这里我想请人帮我确认一个关键差异:v1 的 throttled_time 单位是纳秒(ns),v2 的 throttled_usec 单位是不是变成了微秒(usec)? 如果是,那所有按 ns 写的换算脚本 / 告警阈值在 v2 下会差 1000 倍,这能解释"看起来没 throttle"的假象。node_cpu_seconds_total 只有 user/system/iowait 维度,没有 throttle 维度,覆盖不了。cpu.max:v2 下确实是 cpu.max 取代了 v1 的 cpu.cfs_quota_us / cpu.cfs_period_us,这个我确认了。cpu.stat 里 throttled_usec 的单位到底是不是 usec,和 v1 throttled_time(ns)的差异会不会让按 ns 算的旧阈值在 v2 下失效?cpu.stat / cpu.max)做 throttle 占比的轻量采集方案(比如 node-exporter 自定义 textfile collector,或一个小 sidecar),能给出字段 + 计算公式?我这边有完整的 cpu.stat 输出和 cAdvisor 版本,需要的话我可以贴出来。先谢过。