Alibaba Cloud Linux 3中容器里的内存使用高于宿主机系统中的内存

Alibaba Cloud Linux 3系统中,通过free命令查看容器里的内存使用高于宿主机系统中的内存。本文介绍这种情况的可能原因和解决方案。

问题描述

查看Alibaba Cloud Linux 3镜像的容器中的内存使用,发现其高于Alibaba Cloud Linux 3系统宿主机的内存,该情况与理论预期不符。

问题原因

当前使用的内存计算公式为mem_used = kb_main_total - kb_main_free - kb_main_cached - kb_main_buffers,由于没有正确处理共享内存(shmem),导致容器中的内存使用计算不准确。具体原因说明:

当前内存计算公式说明

  • mem_used:系统中实际使用的内存大小。

  • kb_main_total:系统中所有可用的内存大小。

  • kb_main_free:系统中未被使用的空闲内存大小。

  • kb_main_cached:系统中被缓存的内存大小。通常用于加速数据访问,例如文件系统缓存。

  • kb_main_buffers:系统中被用作缓冲区的内存大小。通常用于临时存储数据,例如网络数据包。

共享内存(shmem)作为一种内存区域,具有匿名页(Anonymous Pages)和Page Cache的性质,在未配置Swap空间时无法被当作闲置内存回收,应该将shmem视为已使用的内存,而不是闲置内存,因此计算mem_used时,不应该被减去,这样可以更准确地反映系统中实际使用的内存情况。

解决方案

在宿主机上,执行以下命令,将procps-ng版本更新至3.3.15-14.0.3.al8或更高版本。

sudo yum update procps-ng 
说明

通过更新procps-ng版本使内存计算公式调整生效,确保上述问题已修复。如需了解procps的更多信息,请参见procps-ng>procps