请教一个 lxc 容器的内存使用问题

317 天前
 zhwguest

我有一台比较低配置的闲置云主机,里面运行 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 。 也就是说,感觉容器预留了几百兆的内存,这些内存没有被容器使用,但是却被预留了,从宿主机的角度看,这是不能被使用了的。 感觉这样是非常浪费的,不合理的。不知道是什么地方配置了这种行为呢?按说和宿主机一起共享内存多好,大家都有得用。

1386 次点击
所在节点    云计算
3 条回复
iBugOne
317 天前
实际情况是,容器里的 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 上直接看,不要纠结容器里显示的东西。
zhwguest
317 天前
@iBugOne 太感谢了~~~
julyclyde
312 天前
可以用 lxcfs

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://www.v2ex.com/t/1003909

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX