Docker:限度容器可用的内存

更新时间:2018-10-04 文章来源:www.leijuncn.com 责任编辑:佚名 点击数:

默许情形下容器使用的成本是不受限度的。也就是能够使用主机内核调治器所容许的最大年夜大成本。然而在容器的使用进程中,常常须要对容器能够使用的主机成本收场限度,本文先容若何限度容器能够使用的主机内存。

一、为何要限度容器对内存的使用?

限度容器不克不及过量的使用主机的内存是十分主要的。关于 linux 主机来讲,一旦内核检测到没有充实的内存能够调配,就会扔出 OOME(Out Of Memmory Exception),并开端杀死一些过程用于开释内存空间。蹩脚的是任何过程都能够成为内核猎杀的工具,包含 docker daemon 和其它一些主要的法度榜样。更迫害的是如果某个支撑体系运转的主要过程被干掉落落了,全部体系也就宕掉落落了!这里咱们考虑一个比拟常见的场景,大年夜大宗的容器把主机的内存破费殆尽,OOME 被触发后体系内核即时开端杀过程开释内存。如果内核杀死的第一个过程就是 docker daemon 会若何样?成果是一切的容器都不工作了,这是不克不及接收的!

针对这个成绩,docker 测验考试颠末过程调整 docker daemon 的 OOM 优先级来收场减缓。内核在抉摘要杀死的过程时会对一切的过程打分,间接杀死得分最高的过程,接着是下一个。当 docker daemon 的 OOM 优先级被下降后(留神容器过程的 OOM 优先级并没有被调整),docker daemon 过程的得分不但会低于容器过程的得分,还会低于其它一些过程的得分。如许 docker daemon 过程就平安多了。

咱们能够颠末过程上面的剧本直不都雅的看一下当前体系中一切过程的得分情形:

#!/bin/bash
for
 proc 
in
 $(find /proc -maxdepth 
1
 -regex 
'/proc/[0-9]+'
); 
do
 printf 
"%2d %5d %s\n"
 \
 
"$(cat $proc/oom_score)"
 \
 
"$(basename $proc)"
 \
 
"$(cat $proc/cmdline | tr '\0' ' ' | head -c 50)"
done
 
2
>
/dev/null
 | sort -nr | head -n 
40

此剧本输出得分最高的 40 个过程,并收场了排序:

Docker:限度容器可用的内存


第一列显现过程的得分,mysqld 排到的第一位。显现为 node server.js 的都是容器过程,排名广泛比拟靠前。红框中的是 docker daemon 过程,十分的靠后,都排到了 sshd 的后面。

有了上面的机制后能否就能够万事大年夜大吉了呢!不是的,docker 的官方文档中始终夸大年夜大这只是一种减缓的计划,而且为咱们供给了一些下降危险的倡议:

    颠末过程测试控制亚博比分对内存的需要保障运转容器的主机有充分的内存限度容器能够使用的内存为主机设置 swap

好了,烦琐了这么多,着实就是说:颠末过程限度容器使用的内存上限,能够下降主机内存耗尽时带来的各种危险。

二、压力测试东西 stress

为了测试容器的内存使用情形,笔者在 ubuntu 的镜像中装置了压力测试工作 stress,并新创立了镜像 u-stress。本文演示用的一切容器城市颠末过程 u-stress 镜像创立(本文运转容器的宿主机为 CentOS7)。上面是创立 u-stress 镜像的 Dockerfile:

FROM ubuntu:latest
RUN apt-
get
 update && \
 apt-
get
 install stress

创立镜像的号令为:

$ docker build -t u-stress:latest .

三、限度内存使用上限

在进入烦琐的设置细节之前咱们先实现一个大年夜略的用例:限度容器能够使用的最大年夜大内存为 300M。 -m(--memory=) 选项能够实现如许的设置:

$ docker run -it -m 
300M
 --memory-swap -
1
 --name con1 u-stress /bin/bash

上面的 stress 号令会创立一个过程并颠末过程 malloc 函数调配内存:

# stress --vm 1 --vm-bytes 500M

颠末过程 docker stats 号令审查实践情形:

Docker:限度容器可用的内存


上面的 docker run 号令中颠末过程 -m 选项限度容器使用的内存上限为 300M。同时设置 memory-swap 值为 -1,它表现容器法度榜样使用内存的受限,而能够使用的 swap 空间使用不受限度(宿主机有若干 swap 容器就能够使用若干)。

上面咱们颠末过程 top 号令来审查 stress 过程内存的实践情形:

Docker:限度容器可用的内存


上面的截图中先颠末过程 pgrep 号令盘问 stress 号令干系的过程,过程号相连大年夜大的那个是用来破费内存的过程,咱们就审查它的内存信息。VIRT 是过程虚构内存的巨细,以是它理当是 500M。RES 为实践调配的物理内存数目,咱们看到这个值就在 300M 高低浮动。看样子相貌咱们曾经胜利的限度了容器可能使用的物理内存数目。

四、限度可用的 swap 巨细

夸大年夜大一下 --memory-swap 是必需要与 --memory 一同使用的。

畸形情形下, --memory-swap 的值包括容器可用内存和可用 swap。以是 --memory="300m" --memory-swap="1g" 的含意为: 容器能够使用 300M 的物理内存,而且能够使用 700M(1G -300M) 的 swap。--memory-swap 竟然是容器能够使用的物理内存和能够使用的 swap 之和!

把 --memory-swap 设置为 0 和不设置是一样的,此时如果设置了 --memory,容器能够使用的 swap 巨细为 --memory 值的两倍。

如果 --memory-swap 的值和 --memory 雷同,则容器不克不及使用 swap。上面的 demo 演示了在没有 swap 可用的情形下向体系申请大年夜大宗内存的场景:

$ docker run -it --rm -m 
300M
 --memory-swap=
300M
 u-stress /bin/bash
# stress --vm 1 --vm-bytes 500M


Docker:限度容器可用的内存


demo 中容器的物理内存被限度在 300M,然而过程却愿望申请到 500M 的物理内存。在没有 swap 可用的情形下,过程间接被 OOM kill 了。如果有充实的 swap,法度榜样最少还能够畸形的运转。

咱们能够颠末过程 --oom-kill-disable 选项强行制止 OOM kill 的产生,然而笔者以为 OOM kill 是一种康健的行动,为何要制止它呢?

除了限度可用 swap 的巨细,还能够设置容器使用 swap 的紧急水平,这一点和主机的 swappiness 是一样的。容器默许会承袭主机的 swappiness,如果要显式的为容器设置 swappiness 值,能够使用 --memory-swappiness 选项。

五、总结

颠末过程限度容器可用的物理内存,能够防止容器内效劳异样招致大年夜大宗破费主机内存的情形(此时让容重视启是较好的计策),因而能够下降主机内存被耗尽带来的危险。

今日聚焦 热点亚博比分 观点纵横 热点事件

CopyRight©2017-2017 亚博比分版权声明 本站文章来源于网络 版权归原作者所有 如果侵犯了您的权益 请来信告知 我们会尽快删除

客服QQ:3587299 广告QQ:3587299 内容监督:Www.LeijunCn.Com

苏ICP备15024356号-7   苏公网安备 35020302001989号