Docker在默认情况下,容器使用的资源是不受限制的。也就是可以使用主机内核调度器所允许的最大资源。但是在容器的使用过程中,经常需要对容器可以使用的主机资源进行限制使容器之间会尽量不互相影响。
Docker内存控制OOME在linxu系统上,如果内核探测到当前宿主机已经没有可用内存使用,那么会抛出一个OOME(Out Of Memory Exception:内存异常 ),并且会开启killing去杀掉一些进程。
一旦发生OOME,任何进程都有可能被杀死,包括docker daemon在内,为此,docker特地调整了docker daemon的OOM_Odj优先级,以免他被杀掉,但容器的优先级并未被调整。经过系统内部复制的计算后,每个系统进程都会有一个OOM_Score得分,OOM_Odj越高,得分越高,(在docker run的时候可以调整OOM_Odj)得分最高的优先被kill掉,当然,也可以指定一些特定的重要的容器禁止被OMM杀掉,在启动容器时使用 –oom-kill-disable=true指定。
Docker 提供的内存限制功能有以下几点:
容器能使用的内存和交换分区大小。
容器的核心内存大小。
容器虚拟内存的交换行为。
容器内存的软性限制。
是否杀死占用过多内存的容器。
容器被杀死的优先级
一般情况下,达到内存限制的容器过段时间后就会被系统杀死。
执行docker run命令时能使用的和内存限制相关的所有选项如下。
-m,–memory 内存限制,格式是数字加单位,单位可以为 b,k,m,g。最小为 4M
–memory-swap 内存+交换分区大小总限制。格式同上。必须必-m设置的大
–memory-reservation 内存的软性限制。格式同上
–oom-kill-disable 是否阻止 OOM killer 杀死容器,默认没设置
–oom-score-adj 容器被 OOM killer 杀死的优先级,范围是[-1000, 1000],默认为 0
–memory-swappiness 用于设置容器的虚拟内存控制行为。值为 0~100 之间的整数
–kernel-memory 核心内存限制。格式同上,最小为 4M
使用Docker自带的-m操作进行内存限制时可能会由于内核限制所以出现以下提示Your kernel does not support swap limit capabilities.memory limit without swap
必须通过修改grub文件/etc/default/grub 添加:
GRUB_CMDLINE_LINUX=“cgroup_enable=memory swapaccount=1”
之后更新grub并重启可以解决
$ sudo update-grub
$ sudo reboot
–memory-swap设置
只有当–memory设置之后,–memory-swap 才会生效
1、如果–memory-swap设置为正整数,那么这两个–memory和 --memory-swap必须设置。–memory-swap表示可以使用的内存和交换总量,并–memory控制非交换内存使用的数量。因此,如果–memory="300m"和–memory-swap=“1g”,容器可以使用300m的内存和700m(1g - 300m)交换。
2、如果–memory-swap设置为0,则忽略该设置,并将该值视为未设置。
3、如果–memory-swap设置为与值相同的值–memory,并且–memory设置为正整数,则不使用swap。
4、如果–memory-swap未设置并且–memory已–memory设置,则如果主机容器配置了交换内存,则容器可以使用两倍于设置的交换。例如,如果–memory="300m"和–memory-swap未设置,容器可以使用300m的内存和600m的交换。
5、如果–memory-swap明确设置为-1,则允许容器使用无限制交换,最多可达主机系统上可用的数量。
–memory-reservation设置
Memory reservation 是一种软性限制,用于节制容器内存使用。给–memory-reservation设置一个比-m小的值后,虽然容器最多可以使用-m使用的内存大小,但在宿主机内存资源紧张时,在系统的下次内存回收时,系统会回收容器的部分内存页,强迫容器的内存占用回到–memory-reservation设置的值大小。
–oom-kill-disable设置
默认情况下,在出现 out-of-memory(OOM) 错误时,系统会杀死容器内的进程来获取更多空闲内存。这个杀死进程来节省内存的进程,我们姑且叫它 OOM killer。我们可以通过设置–oom-kill-disable选项来禁止 OOM killer 杀死容器内进程。但请确保只有在使用了-m/–memory选项时才使用–oom-kill-disable禁用 OOM killer。如果没有设置-m选项,却禁用了 OOM-killer,可能会造成出现 out-of-memory 错误时,系统通过杀死宿主机进程或获取更改内存。
–memory-swappiness设置
值为0将关闭匿名页面交换,值100将所有匿名页面设置为可交换,默认情况下,如果未设置–memory-swappiness,则值将从主机继承。