本文发布于Cylon的收藏册,转载请著名原文链接~

默认情况下,容器没有任何资源限制,因此几乎耗尽docker主机之上,内核可分配给当前容器的所有资源。可以使用主机内核调度程序允许的尽可能多的给定资源。在此基础上Docker provides提供了控制容器可以使用多少内存,CPU或块IO的方法,设置docker run命令的运行时配置标志。

容器得以实现主要依赖于内核中的两个属性namespace cgroup。其中许多功能都要求您的内核支持Linux功能。要检查支持,可以使用docker info命令。

Memory OOME

在Linux主机上,如果内核检测到没有足够的内存来执行重要的系统功能,它会抛出OOME或Out of Memory Exception异常,并开始终止进程以释放内存资源。一旦发生OOME,任何进程都有可能被杀死,包括docker daemon自身在内。为此,Docker特地调整了docker daemon的OOM优选级,以免它被内核“正法”,但容器的优选级并未被调整。

工作逻辑为

在宿主机上跑有很多容器并包括系统级进程。系统级进程也包括docke daemon自身。当内核执行系统管理操作,如内核需要使用内存,发现可以内存已经为空,会启动评估操作,评估谁占用内存高。我们认为哪个资源占用内存高就该将其kill来释放内存空间。(需要注意的是占用内存高的进程也不一定被kill掉。A进程分配10G已使用5G,进程B分配1G已使用1G。A只使用50%内存,而B已经耗尽所有内存)。内核会提供这些进程进行评分,按照优先级逆序强制kill,直至可使用内存空间足够。此时内核就可以使用内存资源创建其他进程。

每一个进程被计算之后会有一个oom scores,得分越高就会被优先kill。得分是由内存申请分配空间等一系列复杂计算得知。当进程得分最高也不能被kill掉时,如docker daemon,此时需要调整优先级。每一个进程有一个oom.adj的参数,将优先级调整越低,计算的分数就越少。

在docker run时可以直接调整容器的OOM.adj参数。如果想限制容器能使用多少内存资源、或CPU资源,有专门的选项可以实现。非常重要的容器化应用需要在启动容器时调整其OOM.adj,还可以定义容器的策略,一旦被kill直接restart

Limit a container’s resources

限制一个容器能使用多少内存资源或CPU资源docker有专门的选项来实现

-m 限制容器可用RAM空间。选项参数可以使用KB M G等作为接受单位使用。可单独使用。

--memory-swap 设置容器可用交换分区大小。使用swap允许容器在容器耗尽可用的所有RAM时将多余的内存需求写入磁盘。--memory-swap是一个修饰符标志,只有在设置了–memorys时才有意义。

--memory-swap

--memory-swap --memory 功能
正数S 正数 M    容器可用总空间为S,其中可用ram为M
0 正数 M相当于未设置swap(unset)
unset(未设置) 正数 M 若主机(Docker Host)启用了swap,则容器的可用swap为 2*M
-1 正数M 若主机(Docker Host)启用了swap,则容器可使用交换分区总空间大小为宿主机上的所有swap空间的swap资源
注意:在容器内使用free命令可以看到的swap空间并不具有其所展现出的空间指示意义。

–memory-swappiness

用来限定容器使用交换分区的倾向性。

–memory-reservation

预留的内存空间

–oom-kill-disable

禁止oom被kill掉

默认情况下,每个容器对主机CPU周期的访问权限是不受限制的。可以设置各种约束来限制给定容器访问主机的CPU周期。大多数用户使用和配置默认CFS调度程序。在Docker 1.13及更高版本中,还可以配置实时调度程序。 CPU Limit a container’s resources

内核中进程管理子系统当中最重要的组件为进程角度器scheduler,非实时优先级,有效范围为100-139[-20,19]。因此每个进程的默认优先级为120。实时优先级0-99。调度100-139之间的进程有个非常重要的调度器CFS scheduler(完全公平调度器),公平调度每一个进程在需要执行时,去分配scores到这个进程上。

在各容器之间分配CPU资源选项:

参数 说明
–cpu-shares 限制CPU使用个数的参数按比例切分当前系统上可用cpu资源。
例如:当前系统上运行2各容器,第一个为1024,第二个为512。这两个容器都尽可能多个使用CPU,会将CPU资源分3份,1024占2份,第二个容器占1份。可随时按比例调整CPU资源。
–cups 指定容器可以使用的可用CPU资源量。例如,如果主机有两个CPU并且已设置–cpus=“1.5”,则容器最多保证1.5个CPU。例如:4核CPU,4个使用总量为1.5而不是0使用100%,1使用50%。
–cpuset-cpus 限制CPU使用范围的参数。限制容器可以使用的特定CPU或核心。当有多个CPU,则容器可以使用的以逗号分隔的列表或连字符分隔的CPU范围。第一个CPU编号为0.有效值可能是0-3 1,3使用第二个和第四个CPU。

docker pull lorel/docker-stress-ng

本文发布于Cylon的收藏册,转载请著名原文链接~

链接:https://www.oomkill.com/2018/06/container-limit/

版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」 许可协议进行许可。