为何父Cgroup的memory.usage_in_bytes值与子Cgroup内存使用总和不一致
两者数值不一致主要有以下几类原因:
- 父Cgroup自身归属进程的内存占用:父Cgroup本身可以直接挂载进程,这部分进程的内存消耗只会统计到父Cgroup的
memory.usage_in_bytes中,不会计入任何子Cgroup的统计值,这是最常见的差异来源。 - 遗漏了嵌套层级的子Cgroup:你使用的
ls -dltrh /sys/fs/cgroup/memory/*/命令只会统计根memory Cgroup下的一级子Cgroup,如果存在多级嵌套的子Cgroup,深层子Cgroup的内存消耗会被计入父层级的统计但不会被你的统计脚本覆盖,导致总和偏低。 - 内核元数据开销:Cgroup内存管理所需的内核元数据(包括页表项、Cgroup控制结构、slab分配器中归属父Cgroup上下文的内存等)会被统计到父Cgroup的内存使用量中,这部分开销不会分摊到子Cgroup的统计值里。
- 统计瞬态误差:内核的Cgroup内存统计使用percpu计数器做批量更新,不是实时强一致的,读取父和子Cgroup统计值的时间差、以及内存分配释放的并发操作都可能带来临时的数值偏差。
- 共享内存类资源的计算逻辑:如果父Cgroup自身持有共享内存、页缓存、tmpfs文件内容,这部分内存会统计到父Cgroup的使用量中,不会计入子Cgroup;另外跨Cgroup的共享内存如果归属父Cgroup的分配上下文,也不会出现在子Cgroup的统计里。
你可以通过以下操作快速定位原因:
- 执行
cat /sys/fs/cgroup/memory/cgroup.procs查看直接归属父Cgroup的进程列表,确认是否存在未归入子Cgroup的运行进程 - 用
find /sys/fs/cgroup/memory/ -type d -mindepth 1递归列出所有层级的子Cgroup,重新统计所有子Cgroup的内存总和
内容的提问来源于stack exchange,提问作者Akheel K M
相关产品推荐
相关产品推荐

