Docker 资源限制的必要性

默认情况下,docker container 在运行时,只要系统分配多少资源,那么这个容器就会使用多少。

控制的维度,只有内存和 CPU,并且内存是非可压缩的,但是 CPU 是可压缩的。

并且资源的限制依赖于 capabilities 这个 capabilities 是在内核中进行资源限制的功能模块。

OOME

一旦发生 OOME,任何进程都有可能被杀死,包括 docker daemon 在内。

为此,Docker 特地调整了 docker daemon 的 OOM 优选级,以免被内核杀死,但是容器的优选级并未被调整。

可压缩与非可压缩资源

内存的资源是非可压缩的,因为内存本身就是一个缓存,所以并不可以压缩,如果内存负载过大,会造成 OOM。

CPU 的资源是可压缩的,并且 CPU 资源也有队列一说,所以当 CPU 负载过大时会导致进程进入阻塞状态,也就是进入等待处理的状态。

限制的范围

可以达到的效果

可以限制内存的使用量

可以限制内存的使用率,就是通过内存的使用率进行划分

通过限制 CPU 的核心数进行限制,限制核心数时,会将资源公平分配。

通过 CPU 绑定限制固定进程的核心数,绑定核心数时会只让单个或指定核心数运行此容器,其他核心数不会使用。(使用此绑定方法时,不要使用 cpu0)因为系统的默认就是 cpu0,如果将容器绑定到 cpu0,那么会导致 CPU 超载。

禁止 OOM 也就是让进程不会因为内存的满载而删除该容器,但是其他容器还是会删除,也可以通过优先级进行限制不让内存删除

可以通过软限制和硬限制进行限制容器的运行,软限制是限制容器的运行占用情况,硬限制会直接限制容器运行占用的资源,容器可以超过软限制,但是不能超过硬限制。

通过内存进行限制

-m ,–memory=

容器可以使用的最大物理内存量,硬限制,此选项最小允许值为 4m (4 MB),此项较常用

–memory-swap *

允许此容器交换到磁盘的内存量,必须先用-m 对内存限制才可以使用

–memory-swappiness

设置容器使用交换分区的倾向性,值越高表示越倾向于使用swap分区,范围为0-100,0为能不用就不用,100为能用就用

–memory-reservation

允许指定小于 –memory 的软限制 ,当 Docker 检测到主机上的争用或内存不足时会激活该限制,如果使– memory-reservation,则必须将其设置为低于 –memory 才能使其优先生效。 因为它是软限制,所以不能保证容器不超过限制

–kernel-memory

容器可以使用的最大内核内存量,最小为 4m,由于内核内存与用户空间内存隔离,因此无法与用户空间内存直接交换,因此内核内存不足的容器可能会阻塞宿主机资源,这会对主机和其他容器或者其他服务进程产生影响,因此不要设置内核内存大小

–oom-kill-disable

默认情况下,如果发生内存不足(OOM)错误,则内核将终止容器中的进程。要更改此行为,请使用该 –oom-kill-disable 选项。仅在设置了该 -m/–memory 选项的容器上禁用OOM。如果 -m 未设置该标志,则主机可能会用完内存,内核可能需要终止主机系统的进程以释放内存

通过 CPU 进行限制

–cpus=

指定一个容器可以使用多少个可用的CPU核心资源。例如,如果主机有两个CPU,如果设置了 –cpus=”1.5” ,则可以保证容器最多使用1.5个的CPU(如果是4核CPU,那么还可以是4核心上每核用一点,但是总计是1.5核心的CPU)。这相当于设置 –cpu-period=”100000” 和 –cpu-quota=”150000” 。此设置可在Docker 1.13及更高版本中可用,目的是替代–cpu-period和–cpu-quota两个参数,从而使配置更简单,但是最大不能超出宿主机的CPU总核心数(在操作系统看到的CPU超线程后的数值),此项较常用

–cpu-period=

指定CPU CFS调度程序周期,必须与 –cpu-quota 一起使用 。默认为100微秒。大多数用户不会更改默认设置。如果使用Docker 1.13或更高版本,请改用 –cpus

–cpu-quota=

在容器上添加 CPU CFS 配额,计算方式为 cpu-quota / cpu-period的结果值,docker1.13 及以上版本通常使用–cpus 设置此值

–cpuset-cpus 用于指定容器运行的 CPU 编号,也就是所谓的CPU绑定。如果一个或多个CPU,则容器可以使用逗号分隔的列表或用连字符分隔的CPU范围。第一个CPU的编号为0。有效值可能是 0-3 (使用第一,第二,第三和第四CPU)或1,3 (使用第二和第四CPU)

–cpu-shares

用于设置 cfs 中调度的相对最大比例权重,cpu-share 的值越高的容器,将会分得更多的时间片(宿主机多核 CPU 总数为 100%,假如容器 A 为1024,容器 B为 2048,那么容器 B 将最大是容器 A 的可用 CPU 的两倍 ),默认的时间片1024,最大 262144。这是一个软限制。