Plainnotes

容器的内存限制,看到的和限制的不是一回事

2025-09-03 · 3 分钟部署

容器里 free -h 显示宿主机 64G,-m 1g 的限制看起来没生效。实际上 free 读 /proc/meminfo,而容器没有独立的 meminfo,看到的就是宿主机的。

真正的限制在 cgroup:

cat /sys/fs/cgroup/memory.max          # cgroup v2
cat /sys/fs/cgroup/memory.current
cat /sys/fs/cgroup/memory.stat | grep -E 'anon|file'

memory.current 包含 page cache。所以一个只读文件的容器,current 会慢慢涨到接近上限——这不是泄漏,是缓存,内核在压力下会回收。真正该看的是 anon(匿名页,即堆栈和堆),它才对应应用实际占用的内存。

Java 容器还有一个坑:老版本 JVM 读不到 cgroup 限制,按宿主机内存算堆大小,一启动就被 OOM kill。JDK 10 以后默认 UseContainerSupport,老版本要手动加 -XX:MaxRAMPercentage。