Linux入门教程:Docker管理指南(3) – 限制容器资源使用,Docker提供了一
Linux入门教程:Docker管理指南(3) – 限制容器资源使用,Docker提供了一
默认一个容器没有资源限制,能使用与主机内核调度器允许的给定资源一样多的资源。Docker提供了一个控制一个容器能使用多个内存,CPU或块IO的方法,就是在docker run命令设置运行时的配置参数。本文详细介绍你什么时候应该设置这些限制和设置它们时可能存在的影响。
内存
Docker可以设置内存硬限制,只允许使用不超过用户或系统内存给定的内存数量,或者软限制,允许容器使用它所需的尽可能多的内存,除非是遇到了一些条件,如内核检测下系统处理低内存状态或一些竞争情况。当单独使用或当使用超过一个选项,这些选项中的一些会有不同的影响。
这些选项的大多数允许指定正整数,后面跟着一个后缀b,k,m,g来表示字节,千字节,兆字节或千兆字节。
关于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%资源。
$ docker run -ti --cpu-period=10000 --cpu-quota=50000 busybox如果你有一个4 vCPU系统,容器以–cpu-period=100000和–cpu-quota=200000运行,那么你的容器能最大消耗2个逻辑CPU(200%的–cpu-period)。
$ docker run -ti --cpu-period=100000 --cpu-quota=200000–cpuset-cpus示例
设置容器最大使用4 CPU,执行如下命令:
$ docker run -ti --cpuset-cpus=4 busyboxBlock 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:
块带宽限制示例
此示例将ubuntu容器对/dev/sda的最大写入速度限制为为1mbps:
$ docker run -it --device-write-bps /dev/sda:1mb ubuntu此示例将ubuntu容器对/dev/sda的最大读取速率限制为每秒1000次IO操作:
$ docker run -ti --device-read-iops /dev/sda:1000 ubuntu
评论暂时关闭