陷阱 3:cgroups v2 与 v1 混合使用导致控制器不可用

Linux 启动时 cgroups v1 被挂载后,cgroups v2 的 subtree_control 可能不可写。多个容器运行时(Docker 用 cgroup v2,但旧版 containerd 可能还在挂载 v1)冲突时会出现 CPU 限制不生效。解决方案:统一使用 cgroups v2(在 grub 中添加 cgroup_no_v1=all 禁用 v1),检查是否有 v1 挂载残留:mount | grep cgroup1

陷阱 4:CPU 密集进程被过高 vruntime 惩罚导致饥饿

CFS 的一个长期争议:长时间运行的 CPU 密集科学计算进程与短生命周期交互进程竞争时。如果系统负载很高,CPU 密集进程在获取 CPU 前积累了大量等待时间,其 vruntime 会异常增大,导致交互进程长期被饿死。EEVDF 通过明确 deadline 机制解决了此问题:每个进程的 deadline 由其被唤醒时的时间戳加上固定延迟粒度计算,与它等待了多久无关,从根本上消除了饥饿。

14. 总结与选型决策树

Linux 调度器从 O(n) 到 EEVDF 的演进史,是内核开发者对"公平"与"效率"这两个目标的不断精确化过程:

  • CFS 用 vruntime 实现数学公平,用红黑树保证 O(log n) 选择。
  • EEVDF 保留公平性保证的同时,用显式 deadline 消除了唤醒延迟波动,成为 6.6+ 默认选择。
  • DEADLINE/RT 调度类提供不同级别的实时保证。
  • cgroups v2 + PSI 将调度器从系统级扩展到容器级精细管控。

对于后端工程师而言,理解调度器和 CPU 内存管理是排查性能异常的"第二层阶梯"——第一层是网络和 I/O(TCP/IP、io_uring),第三层是文件系统和存储。只有三层都通透,才能称得上是真正的 Linux 系统性能专家。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部