Docker管理指南(3) – 限制容器资源使用

默认一个容器没有资源限制,能使用与主机内核调度器允许的给定资源一样多的资源。Docker提供了一个控制一个容器能使用多个内存,CPU或块IO的方法,就是在docker run命令设置运行时的配置参数。本文详细介绍你什么时候应该设置这些限制和设置它们时可能存在的影响。

内存

Docker可以设置内存硬限制,只允许使用不超过用户或系统内存给定的内存数量,或者软限制,允许容器使用它所需的尽可能多的内存,除非是遇到了一些条件,如内核检测下系统处理低内存状态或一些竞争情况。当单独使用或当使用超过一个选项,这些选项中的一些会有不同的影响。
这些选项的大多数允许指定正整数,后面跟着一个后缀b,k,m,g来表示字节,千字节,兆字节或千兆字节。

  • -m or –memory=:容器可以使用的最大内存量。设置的值不能低于4m
  • –memory-swap*:允许容器交换到硬盘的最大内存量
  • –memory-swappiness:默认情况下,主机内核可以交换容器使用的匿名页面的百分比。你可以设置–memory-swappiness的值为0到100之间。
  • –memory-reservation:允许你指定一个比–memory小的软限制,在docker探测到主机低内存时激活。如果你使用–memory-reservation,必须设置一个比–memory小的值,以便软限制优先到达。因为软限制不保证容器不会超过这个限制。
  • –kernel-memory:容器能使用的最大内核内存量。最小可以设置到4m。因为内核内存不能被交换出去,一个缺乏内核内存的容器可能会阻塞主机资源,这会对主机和其他容器产生副作用。
  • –oom-kill-disable:默认下,当out-of-memory(OOM)错误产生时,内核会kill掉容器中的进程。可以使用–oom-kill-disableg来改变这个行为。如果设置了这个选项,那么仅在设置了-m/–memory的容器禁止OOM killer,如果-m没有设置,那么主机就能够用完所有内存,然后内核可能会杀死主机系统的进程来释放内存。
  • 关于cgroups和内存最多的信息请到https://www.kernel.org/doc/Documentation/cgroup-v1/memory.txt。

    –memory-swap详情

  • 如果这个选项没有设置,设置了–memory,容器能够使用-memory值的两倍swap。例如,–memory=”300m”,–memory-swap没有设置,那么容器能够使用300m内存和600m swap。
  • 如果–memory和–memory-swap都设置了,–memory-swap表示能够使用内存和swap的总数,–memory控制非swap内存的数量。所以如果–memory=”300m”,–memory-swap=”1g”,那么容器能够使用300m的内存和700m(1g -300m)的swap
  • 如果设置为-1(默认),容器就可以无限制使用swap。
  • –memory-swappiness详情

  • 值为0将关闭匿名页面交换。
  • 值100将所有匿名页面设置为可交换。
  • 默认情况下,如果不设置–memory-swappiness,将继承主机计算机的值。
  • –kernel-memory详情

    有以下几种情况:

  • 无限制的内存,无限制的内核内存:这个是默认行为。
  • 无限制的内存,有限制的内核内存:当所有的cgroups所需的内存量超过主机实际拥有的内存量时,适合设置为这样的。你可以配置内核内存不超过主机可用内存,容器需要更多的内存时只能等待了。
  • 有限制的内存,无限制的内核内存:总内存是有限制的,不过内核内核无限制。
  • 有限制的内存,有限制的内核内存:用户和内核限制都限制时对调试内存相关的问题会有帮助。如果一个容器用完了这两种内存其中的一种,它不会影响到其它的容器或主机。如果内核内存限制比用户内存低,使用完内核内存后会导致容器产生OOM错误。反之,不会遇到OOM。
  • CPU

    默认情况下,每个容器使用主机的CPU无限制。你可以通过下面的选项来对容器的CPU使用设置限制。

  • –cpu-shares:设置此参数比默认的1024大或小会增加或减小容器的权重,给它更大或更小主机CPU周期的比例的访问。这个只在CPU周期受到限制时才强制执行。当大量的CPU可用时,所有的容器都能够使用它们所需尽量多的CPU资源。所以这个是软限制。–cpu-shares不会阻容器在swarm模式下的调度。它会优先从可用CPU周期满足容器的CPU使用,但不过保证或保留特定的CPU周期。
  • –cpu-period:一个容器的一个逻辑CPU的调度周期。默认值是100000(100ms)
  • –cpu-quota:在由–cpu-period设置的时间段内容器可以调度的最大时间量。
  • –cpuset-cpus:使用此选项将容器固定到一个或多个CPU核心,以逗号分隔。
  • –cpu-period和–cpu-qota示例

    如果你有一个1 vCPU的系统,容器以–cpu-period=100000和–cpu-quota=50000运行,那么容器最大能消耗1个CPU的50%资源。

    1. $ docker run -ti --cpu-period=10000 --cpu-quota=50000 busybox

    如果你有一个4 vCPU系统,容器以–cpu-period=100000和–cpu-quota=200000运行,那么你的容器能最大消耗2个逻辑CPU(200%的–cpu-period)。

    1. $ docker run -ti --cpu-period=100000 --cpu-quota=200000

    –cpuset-cpus示例

    设置容器最大使用4 CPU,执行如下命令:

    1. $ docker run -ti --cpuset-cpus=4 busybox

    Block IO (blkio)

    有两个选项可用于调整给定容器对直接块IO设备的访问。你还可以按照每秒的字节数或每秒的IO操作来指定带宽限制。

  • blkio-weight:默认情况下,每个容器可以使用相同比例的块IO带宽(blkio)。默认权重是500。要提高或降低给定容器使用的blkio的比例,可以设置–blkio-weight为介于10和1000之间的值。此设置将平等地影响所有块IO设备。
  • blkio-weight-device:与–blkio-weight相同,但你可以使用语法–blkio-weight-device =“DEVICE_NAME:WEIGHT”为每个设备设置权重。DEVICE_NAME:WEIGHT是一个字符串,包含冒号分隔的设备名称和权重 。
  • –device-read-bps和–device-write-bps:根据大小限制设备的读取或写入速率,使用kb,mb或gb后缀。
  • –device-read-iops or –device-write-iops:通过IO操作/秒限制设备的读取或写入速率。
  • 块IO权限示例

    注意:–blkio-weight只影响直接IO,对缓冲IO没有影响。

    如果指定–blkio-weight和-blkio-weight-device,Docker使用–blkio-weight作为默认权重,并使用–blkio-weight-device重写命名设备上的默认值。
    要将/dev/sda的容器的设备权重设置为200,而不指定默认blkio-weight:

    1. $ docker run -it \
    2.   --blkio-weight-device "/dev/sda:200" \
    3.   ubuntu

    块带宽限制示例

    此示例将ubuntu容器对/dev/sda的最大写入速度限制为为1mbps:

    1. $ docker run -it --device-write-bps /dev/sda:1mb ubuntu

    此示例将ubuntu容器对/dev/sda的最大读取速率限制为每秒1000次IO操作:

    1. $ docker run -ti --device-read-iops /dev/sda:1000 ubuntu
    标签:Docker容器 发布于:2019-11-20 01:06:29