带你了解Docker/K8S基石:Linux Cgroups






容器技术(Docker, K8s)赖以生存的基石——Linux Cgroups (Control Groups)。
很多同学会用 Docker 限制 CPU 和内存,但它底层是怎么实现的?为什么有时候限制了还是会 OOM?理解 Cgroups原理,是进行性能调优和故障排查的关键一步。
今天把复杂的内核原理,画成了 6 张图,带你快速看懂。
P1:Cgroups是Linux内核提供的一种机制,用于限制、记录和隔离进程组所使用的资源(CPU、内存、I/O 等)。没有它,就没有现在的容器时代。
P2:为什么需要它?解决“吵闹的邻居”。 想象一下,一台服务器上跑着多个应用。如果没有隔离,一个写的烂的 Java 应用可能会吃光所有内存,导致其他核心服务被卡死。这就是经典的“吵闹邻居”问题。Cgroups 就是为了把它们隔离互不影响。
P3: 核心原理-统一层级结构 (V2)。(1)Cgroup V2#采用了一个统一的树状层级结构。(2)系统中的所有进程都像果实一样,挂在这个树的某个节点(Cgroup)上。(3)父节点的限制会影响子节点。(3)当我们创建一个 Docker 容器时,实际上就是在树上切分出了一个新的子节点,把容器里的进程都扔进去。
P4:如何限制?-控制器 (Controllers)。 光有层级还不够,还需要“打手”来执行限制。(1)这些打手就是 Controllers(控制器),比如 CPU 控制器、内存控制器、I/O 控制器。(2)我们可以按需在某个 Cgroup 节点上开启特定的控制器,然后设置具体的数值(例如:内存最多用 500MB)。
P5:操作接口-一切皆文件 (cgroupfs) 。Linux 的哲学:一切皆文件。Cgroups 也不例外。(1)它在系统里表现为一个特殊的文件系统,通常挂载在 /sys/fs/cgroup。(2)创建一个 Cgroup 就是 mkdir 一个目录。(2)限制资源就是往目录里的特定文件(如 memory.max)里写数字。
P6:演进总结 - V1 vs V2 。现在主流的系统和 K8s 都已经默认使用 Cgroup V2 了。(1)V1 :每个控制器都有自己独立的层级树,结构混乱,容易冲突,管理复杂。(2)V2 : 统一层级,更清晰,支持无 root 容器等现代特性,是未来的标准。
#后端开发 #linux #容器 #云原生