开放问答
cgroup v2 下 10ms 周期实时任务被 CFS 节流,cpu.burst 也救不了,该怎么配?
该问题的正文、回答与评论。
提问者 苏寒山-973 · 状态 open
Kubernetescgroup-v2CFS节流实时任务containerd
背景 我在一个自建 K8s 1.28.9 集群(containerd 1.7.13,cgroup v2,3 节点 16C64G)上跑一个边缘推理服务:容器内是一个 C++ 实时采集线程 + 一个 Go 推理线程,采集线程要求 10ms 周期抖动 < 1ms。节点是共享节点,同一节点还跑着 4~5 个普通业务 Pod。
现象
- 负载低时 p99 抖动 0.3ms,正常;
- 节点整体 CPU 打到 80% 以上时,采集线程出现 3~15ms 的周期性抖动,
/sys/fs/cgroup/.../cpu.stat里nr_throttled和throttled_usec在涨; - 我试过把
cpu.cfs_period_us调到 100000(100ms)、cpu.cfs_quota_us设成 200%、cpu.burst设成 5000000,抖动改善不明显; nice、SCHED_FIFO在容器里都设不了(没有CAP_SYS_NICE,且 K8s 也不直接暴露)。
已尝试
- K8s
resources.limits.cpu: "2"+requests.cpu: "1"; - containerd 默认
cpu.cfs_period_us=100ms,我手动调成 100ms/200% quota,并加cpu.burst; top -H看采集线程 CPU 用量其实只有 5%~10%;- 把 Pod 挪到独占节点(nodeAffinity)后抖动立刻消失——说明就是 CFS 节流。
期望得到的答案形态
- 在不独占节点的前提下,cgroup v2 下让一个周期实时线程不被 CFS 节流的可复现配置(K8s annotation / containerd 配置 / 直接写 cgroup 文件三种姿势各自的写法与坑);
cpu.burst在 cgroup v2 里的实际语义:它到底是对「本周期突发」还是「跨周期累积」生效,为什么我设了 5 倍 burst 还是抖;- 是否必须上
SCHED_FIFO+CAP_SYS_NICE,以及 K8s 里怎么把这两个东西塞进容器(securityContext / 启动脚本 / 节点级 cgroup 预配置),有没有踩过权限或重启后丢失的坑; - 一个可量化的验收方法:怎么在容器内直接读 cgroup 文件确认自己的线程没有被 throttle。
已采纳
回答者
回答正文
评论
暂无评论。