docker限制内存及cpu占用
默认情况下容器使用的资源是不受限制的。也就是可以使用主机内核调度器所允许的最大资源。
但是在容器的使用过程中,经常需要对容器可以使用的主机资源进行限制
为什么限制
为什么要限制容器对内存的使用?
限制容器不能过多的使用主机的内存是非常重要的。对于 linux 主机来说,一旦内核检测到没有足够的内存可以分配,就会扔出 OOME(Out Of Memmory Exception),并开始杀死一些进程用于释放内存空间。糟糕的是任何进程都可能成为内核猎杀的对象,包括 docker daemon 和其它一些重要的程序。
针对这个问题,docker 尝试通过调整 docker daemon 的 OOM 优先级来进行缓解。内核在选择要杀死的进程时会对所有的进程打分,直接杀死得分最高的进程,接着是下一个。当 docker daemon 的 OOM 优先级被降低后(注意容器进程的 OOM 优先级并没有被调整),docker daemon 进程的得分不仅会低于容器进程的得分,还会低于其它一些进程的得分。这样 docker daemon 进程就安全多了。
下面的脚本直观的看一下当前系统中所有进程的得分情况
1 | #!/bin/bash |
内存限制
-m(--memory=)
选项可以完成这样的配置
1 | docker run -it -m 300M --memory-swap -1 --name con1 u-stress /bin/bash |
-m 选项限制容器使用的内存上限为 300M。同时设置 memory-swap 值为 -1,它表示容器程序使用内存的受限,而可以使用的 swap 空间使用不受限制(宿主机有多少 swap 容器就可以使用多少)。
docker stats 命令查看实际情况
CPU限制
可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间
1 | docker run -it --cpu-period=50000 --cpu-quota=25000 ubuntu:16.04 /bin/bash |
将 CFS 调度的周期设为 50000,将容器在每个周期内的 CPU 配额设置为 25000,表示该容器每 50ms 可以得到 50% 的 CPU 运行时间。
还有很多其他设置,可以参考Docker(二十)-Docker容器CPU、memory资源限制