已采纳
回答正文
回复
讨论正文
该问题的正文与回答。
背景 我在一家做工业网关的厂里,核心是一个 1ms 控制周期的实时任务(运动控制 + 协议桥),原本裸机跑在 8C/16G 的工控机上,SCHED_FIFO 99,P99 抖动 <200us,跑了三年稳定。今年公司要求统一容器化、上 K8s(1.28.9,cgroup v2,containerd 1.7.13,Calico),同一个二进制、同一台物理机,只是被塞进 Pod。
现象 迁移后 P50 还是 1.001ms 没变,但 P99 抖到 1.2ms,P999 偶尔冲到 1.5ms,硬实时指标直接被打穿。业务方不认,说"容器化前没这个问题"。抓了 3 天 ftrace 看 sched_switch 路径,发现毛刺主要落在:① 控制核被周期性抢占,抢占者不是业务线程;② 抢占窗口高度规律,间隔 ~500ms,和 kubelet 的 pleg / CRI 心跳节奏疑似相关;③ 部分毛刺出现在 cgroup 迁移 / memcg charge 路径上。
已尝试
--cgroups-per-qos=false,P99 反而更差,已回退。期望得到的答案形态
不想要"理论上可以",想要具体命令 / 配置项 / 数据。