我有一台比较低配置的闲置云主机,里面运行 lxc 容器。
我今天心血来潮,看了一下内存使用情况,觉得有些不可理解。
从宿主机看:
root@ecs-yun31:~$ free -m
total used free shared buff/cache available
Mem: 1685 1027 94 167 563 307
Swap: 0 0 0
从容器里看:
user@lxc01:~$ free -m
total used free shared buff/cache available
Mem: 1685 493 835 164 355 1191
Swap: 0 0 0
是的,没有看错,宿主机内存不到 2G ,总数匹配上了。但是容器里面看到的 available 的内存是 1.2G ,而在宿主机看到的 available 的内存只有 300M 。 也就是说,感觉容器预留了几百兆的内存,这些内存没有被容器使用,但是却被预留了,从宿主机的角度看,这是不能被使用了的。 感觉这样是非常浪费的,不合理的。不知道是什么地方配置了这种行为呢?按说和宿主机一起共享内存多好,大家都有得用。
1
iBugOne 2023-12-27 18:53:23 +08:00 6
实际情况是,容器里的 available 是假的,是通过 total / used / shared / buff/cache 等算出来的,而容器里看不到容器外的进程,所以容器里看到的 used / shared / buff/cache 就比容器外要少,算出来的 available 就更多,这样就出现了偏差,因此容器里的 available (还有 free )都是绝对不能信的。
底层原因是,free 命令是读 /proc/meminfo 的,而这个古老的 procfs 接口并没有很好地兼容现代的容器技术。如果你的 lxc/lxd 够新的话,你就能看到容器里的 /proc/meminfo 是一个 fuse.lxcfs mount 在上面的,lxc 通过这个方式覆盖容器里看到的 /proc/meminfo (以及 procfs 下的其他一堆“文件”),能让容器里看到的这些系统资源使用情况更加准确。如果要看整个系统的资源使用情况,请从 host 上直接看,不要纠结容器里显示的东西。 |
3
julyclyde 360 天前
可以用 lxcfs
|