【从零造容器】Cgroups v2:让容器不能吃掉整台机器

💡 原文中文,约17600字,阅读约需42分钟。
📝

内容提要

本文讨论了Linux中的控制组(Cgroups)v2,强调其统一层级结构的优势,解决了v1的设计缺陷。介绍了创建Cgroup、设置资源限制(CPU、内存、IO)及监控和调试的方法,特别指出内存的软限制(memory.high)和硬限制(memory.max)的重要性,以及有效管理OOM(内存溢出)事件。最后提到Cgroups与容器运行时的关系,强调合理配置资源在容器管理中的重要性。

🎯

关键要点

  • Cgroups v2 统一层级结构解决了 v1 的设计缺陷,简化了资源管理。
  • Cgroups v2 通过文件系统接口创建和管理控制组,使用 mkdir 和 echo 命令。
  • CPU 控制通过 cpu.max 和 cpu.weight 设置,前者为硬限制,后者为相对权重。
  • 内存控制使用 memory.max(硬限制)和 memory.high(软限制),后者在达到限制时减缓内存分配。
  • IO 控制通过 io.max 和 io.weight 设置,解决了 v1 中对 buffered IO 的限制无效问题。
  • Cgroups v2 与容器运行时(如 Docker 和 Kubernetes)紧密集成,合理配置资源对容器管理至关重要。
  • 内存溢出(OOM)事件管理通过 memory.oom.group 选项实现,确保整个 cgroup 一起被杀死。
  • Cgroups v2 的设计避免了竞争条件和复杂性,提升了系统稳定性和可预测性。

延伸问答

Cgroups v2 的主要优势是什么?

Cgroups v2 通过统一层级结构解决了 v1 的设计缺陷,简化了资源管理,避免了竞争条件和复杂性,提升了系统稳定性和可预测性。

如何在 Cgroups v2 中设置 CPU 资源限制?

在 Cgroups v2 中,可以通过设置 cpu.max 和 cpu.weight 来限制 CPU 资源,cpu.max 设置硬限制,cpu.weight 设置相对权重。

Cgroups v2 中的内存软限制和硬限制有什么区别?

内存硬限制(memory.max)一旦超过会触发 OOM killer,而内存软限制(memory.high)则在达到限制时减缓内存分配,避免进程被杀。

如何监控 Cgroups v2 中的资源使用情况?

可以通过读取 cgroup 目录下的控制文件,如 memory.current 和 cpu.stat,来监控资源使用情况。

Cgroups v2 如何处理内存溢出事件?

Cgroups v2 通过 memory.oom.group 选项实现组杀,确保一旦触发 OOM,整个 cgroup 内的所有进程一起被杀。

Cgroups v2 与容器运行时的关系是什么?

Cgroups v2 与容器运行时(如 Docker 和 Kubernetes)紧密集成,合理配置资源对容器管理至关重要。

➡️

继续阅读