解决对Docker容器内存限制警告或未实际限制的问题
WARNING: Your kernel does not support swap limit capabilities or the cgroup is not mounted. Memory limited without swap.
a229353897850843206a76458307a37eaeb3c8e1adf0e58e458b9ed10790cfa8
当试图在启动docker容器时使用–memory指令时可能会出现此类警告。
场景
笔者的场景是试图在一个2G内存服务器上加入RabbitMQ,但是内存已所剩无几。为了防止种种问题,需要进行限制。一个想法是在启动容器时使用–memory指令限制其内存大小。但启动成功后笔者收到文章上述警告。
含义
这意味着笔者服务器的Linux 内核当前没有启用对 swap 限制的支持,或者 cgroup 没有正确挂载。而cgroup(Control Group)是 Linux 内核中的一个功能,用于限制、控制和监视进程组的资源使用,如 CPU、内存、磁盘 I/O 等。cgroup 允许系统管理员将一组进程组织在一起,并为它们分配资源。如果你没有正确挂载cgorup,在这种情况下,虽然你指定了 --memory
限制,但无法限制容器的 swap 内存使用。
解决方案
步骤 1:更新 GRUB 配置
- 编辑 GRUB 配置文件:
sudo nano /etc/default/grub
- 在
GRUB_CMDLINE_LINUX_DEFAULT
行中添加cgroup_enable=memory swapaccount=1
:
GRUB_CMDLINE_LINUX_DEFAULT="quiet splash cgroup_enable=memory swapaccount=1"
这行将引导加载程序的默认内核命令行参数,以下是具体参数释义:
quiet
: 启动时禁用大多数内核启动信息的显示,使启动过程更加简洁。
splash
: 启用启动时显示图形启动画面(Splash Screen),通常用于显示启动时的厂商标志或进度条。
cgroup_enable=memory
: 启用内核的 cgroup 内存子系统,允许使用 cgroup 来管理和限制内存资源。
swapaccount=1
: 启用 swap 账户统计。这个参数使 cgroup 能够跟踪和管理交换空间(swap)的使用情况。
- 保存并退出编辑器
步骤 2:更新 GRUB 并重启
-
更新 GRUB 配置:
sudo update-grub
-
重启系统:
sudo reboot
验证
通过以下命令检验容器是否真的将memory进行了限制。比如,验证RabbitMQ的内存是否被限制在350mb以内:
sudo docker stats rabbitmq
得到如下输出结果:
CONTAINER ID NAME CPU % MEM USAGE / LIMIT MEM % NET I/O BLOCK I/O PIDS
7e38b33cd7f7 rabbitmq 0.16% 135.3MiB / 350MiB 67.65% 1.2kB / 0B 56.9MB / 598kB 29
可以发现在limit一列中,的确将RabbitMQ的内存限制在350mb以内。