已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
背景 我在一个 12 节点(4C8G,cgroup v2,K8s 1.28.9,containerd 1.7)的集群上跑一套电机控制闭环,控制周期 5ms,硬实时要求 P99 ≤ 10ms。业务 Pod 用 cpuset 静态绑定 2 核,进程走 SCHED_FIFO priority=99。节点是 dedicated 角色,没有跑其他业务负载。
现象
72h 稳定性测试,P50 稳定在 3.2ms,但 P99 偶发飙到 180~450ms,频率大约每小时 1~3 次。用 perf sched latency + trace-cmd 抓下来,延迟主要来源是:
已尝试的排查与结果
isolcpus=2,3 nohz_full=2,3 rcu_nocbs=2,3 → P99 降到 5ms 以内,有效但运维成本高(每个节点要单独维护 GRUB + systemd 配置,K8s 升级时容易丢失);cpu.weight 把实时 Pod 拉到 10000 → 对 RT 调度器无效(RT 不走 CFS,weight 只影响 CFS 组内分配);--pleg-relist-interval 从 1s 调到 10s → P99 改善约 30%,但 PLEG 本身的 /proc 遍历还是会造成瞬时中断;Storage=none、禁掉 cron → 消除了 journal/cron 来源的毛刺,但 kubelet 和 shim 的干扰仍在。卡点 isolcpus 方案能彻底解决,但运维成本很高:每个节点要单独维护内核启动参数和 systemd 配置,K8s 升级、节点漂移、镜像重建时容易丢失。而且 K8s 1.28 的 kubelet 本身没有提供"让出 CPU"或"降低自身优先级"的机制。
期望得到的答案形态
cpu.max 对 kubelet/containerd-shim 做"软限流",效果如何?有没有人实测过?)systemd-run 或 chrt 把 kubelet、containerd 进程降到 SCHED_IDLE(priority=0),配合 cpuset 隔离,效果怎么样?