docker - 安装警告:No swap limit support

引言

通过 docker info 或者 systemctl status docker,有如下警告 WARNING: No swap limit support

示意图

实操

通过 vi /etc/default/grub 打开文件,在 GRUB_CMDLINE_LINUX 项尾部新增 swapaccount=1(原本的东西保持不动)

1
GRUB_CMDLINE_LINUX="net.ifnames=0 biosdevname=0 console=ttyS0,115200 console=tty0 panic=5 crashkernel=384M-1800M:128M,1800M-8G:256M,8G-16G:512M,16G-:768M intel_idle.max_cstate=1 intel_pstate=disable processor.max_cstate=1 amd_iommu=on iommu=pt swapaccount=1"

然后通过 update-grub,重新生成启动配置,最后通过 reboot 重启机器即可。此次再查看,发现没有警告了

示意图

理论

参考资料:已解决!docker警告WARING:No swap limit support-CSDN博客

文中提到了 cgroup_enable=memoryswapaccount=1,两者解释如下

  • cgroup_enable=memory:启用内存控制组功能,使容器能够限制和管理内存(属于控制组的一个子集,控制组允许将一组进程进行分组,并为该组内的进程设定资源限制)
  • swapaccount=1:在 Linux 系统中,当 内存控制组(memory cgroup) 被启用时,默认情况下,交换空间并不受控制组的限制。如果启用了 swapaccount=1,那么交换空间就可以被纳入到内存控制组的管理之中

那么,如何确定操作系统是否开启了内存控制组功能?如何确定交换分区是否纳入了内存控制组管理?如下

  • 如何确定内存控制组是否开启?内存控制组通过 cgroup 文件系统 挂载到 /sys/fs/cgroup 目录。如果该目录下有 memory 子目录,说明 内存控制组 已启用
  • 如何确定内存控制组下交换分区是否管控?内存控制组通过 cgroup 文件系统 挂载到 /sys/fs/cgroup 目录。如果该目录下有 memory 子目录,子目录下有 memory.memsw.xxx,说明 内存控制组 已管控交换分区
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
# 配置 `swapaccount=1` 之前
root@VM-16-11-debian:/sys/fs/cgroup/memory# ls
cgroup.clone_children memory.force_empty memory.kmem.tcp.limit_in_bytes memory.move_charge_at_immigrate memory.swappiness tasks
cgroup.event_control memory.kmem.failcnt memory.kmem.tcp.max_usage_in_bytes memory.numa_stat memory.usage_in_bytes user.slice
cgroup.procs memory.kmem.limit_in_bytes memory.kmem.tcp.usage_in_bytes memory.oom_control memory.use_hierarchy YunJing
cgroup.sane_behavior memory.kmem.max_usage_in_bytes memory.kmem.usage_in_bytes memory.pressure_level notify_on_release
init.scope memory.kmem.slabinfo memory.limit_in_bytes memory.soft_limit_in_bytes release_agent
memory.failcnt memory.kmem.tcp.failcnt memory.max_usage_in_bytes memory.stat system.slice

# 配置 `swapaccount=1` 之后
root@VM-16-11-debian:/sys/fs/cgroup/memory# ls
cgroup.clone_children memory.kmem.max_usage_in_bytes memory.max_usage_in_bytes memory.pressure_level system.slice
cgroup.event_control memory.kmem.slabinfo memory.memsw.failcnt memory.soft_limit_in_bytes tasks
cgroup.procs memory.kmem.tcp.failcnt memory.memsw.limit_in_bytes memory.stat user.slice
cgroup.sane_behavior memory.kmem.tcp.limit_in_bytes memory.memsw.max_usage_in_bytes memory.swappiness YunJing
memory.failcnt memory.kmem.tcp.max_usage_in_bytes memory.memsw.usage_in_bytes memory.usage_in_bytes
memory.force_empty memory.kmem.tcp.usage_in_bytes memory.move_charge_at_immigrate memory.use_hierarchy
memory.kmem.failcnt memory.kmem.usage_in_bytes memory.numa_stat notify_on_release
memory.kmem.limit_in_bytes memory.limit_in_bytes memory.oom_control release_agent

# 差异点如下,很明显说明新增了对swap的管理
- init.scope
+ memory.memsw.failcnt
+ memory.memsw.limit_in_bytes
+ memory.memsw.max_usage_in_bytes
+ memory.memsw.usage_in_bytes