
























要理解 zombie memory cgroups,需要先知道 memory cgroup (内存控制组)是什么。cgroup 是 Linux 内核做资源隔离用的,Docker 和 Kubernetes 的资源限制都依赖它。memory cgroup 是其中负责内存隔离的那一类,每个 cgroup 跟踪自己下面进程的内存使用。
内核在统计一个 cgroup 的 LRU 页面(最近最少使用页面,内核换页算法的基本单位)时,需要遍历所有 memory cgroup。 mem_cgroup_nr_lru_pages 这个系统调用就负责做这件事。
zombie memory cgroups 指的是进程已经退出、cgroup 目录已经删掉,但内核里关于它的统计结构还没回收。cgroup 数量越多, mem_cgroup_nr_lru_pages 这个系统调用就越慢。几万个 zombie 堆积时,单次调用可能耗掉几百毫秒的 CPU,把单个核占满。
内核不立即回收 cgroup 的原因是引用计数。一个 cgroup 可能有多个引用者(正在退出的进程、未释放的页面、其他内核子系统),内核需要等所有引用都释放后才能安全清理,这个过程涉及 RCU 同步和复杂的状态机。crashloop 的容器(每秒重启一次)会让 cgroup 创建速度远超回收速度,残留快速累积。
在 Pinterest 的故障机器上,内核跟踪了 68680 个 memory cgroup,实际在用的只有 240 个。差值 68440 个全是 zombie。
此内容由惯性聚合(RSS阅读器)自动聚合整理,仅供阅读参考。 原文来自 — 版权归原作者所有。