前言
cgroups 是Docker的两大核心之一,另一个是namespace ,在讲解网络篇时有提到。cgroups是控制群组,是linux 内核用来限制资源,如内存,磁盘,网络等。
linux 内存限制
在 Cpu 资源限制篇中有提到,linux 通过 cgroup进行cpu限制,对于内存的限制,也是通过 memory cgroup进行处理的,而这个的目录是在 /sys/fs/cgroup/memory, 主要分析几个参数, memory.limit_in_bytes, memory.oom_control 和 memory.usage_in_bytes
- memory.limit_in_bytes 限制控制组里的使用内存的最大值,那达到这个限制后,操作系统会怎么做呢?需要配合 memory.oom_control 来进行处理
- memory.oom_control 当 memory.limit_in_bytes 达到最大值后,决定要不要触发 oom killer, 如果没有设置的话,默认是 OOM Killer ,可以杀死哪些进程,通过 cgroup.procs 来决定。 当这里的值设置成 1后,那这个控制组内的进程都不会被杀掉。
- memory.usage_in_bytes 这个是一个只读,它表当前控制组里所有进程实际使用的内存总和。
当 memory.usage_in_bytes 和 memory.limit_in_bytes越接近时, OOM的风险就越高。
因为 cgroup 是树状的,父节点控制组内的 memory.limit_in_bytes 可以限制它的子节点中所有进程的内存使用。
如上面的 g1限制为 100M,即使 g3限制为 200M,也不能超过g1的100M。
当然,如果在一个控制内的进程比较多,哪个进程会被选择进行 OOM killer,也是一个计算的过程,而影响这个计算的参数是在 /proc/{pid}/oom_score_adj 的值,控制组中总的可用页面和进程的 oom_score_adj 的乘积,再加上进程已经使用的物理内存得到的最大值对应的进程,就会被系统进行 killer .
可以通过 journalctl -k 或是 查看 /var/log/message 文件查看 oom kill 的信息。
docker 设置内存限制
- 设置 docker的内存大小
- 查看指定容器的 memory cgroup
- 查看 memory.limit_in_bytes 为 10M
- 查看对应的进程列表