一个 docker host 上会运行若干个容器,每个容器都需要 CPU、内存和 io 资源。我们可以控制分配多少 CPU、内存资源给每个容器,从而避免某个容器因占用太多资源而影响其他容器乃至整个 host 的性能。
一、内存限额
1,参数说明
与操作系统类似,容器可使用的内存包括两部分:物理内存和 swap。docker 通过下面两组参数来控制内存的使用量:
-m 或 --memory:设置 内存 的使用限额,例如 100MB,2GB。
--memory -swap:设置 内存 + swap 的使用限额(因此这个参数值必须大于上面那个)。
2,使用样例
(1)默认情况下,容器内存和 swap 的使用是没有限制的(相当于两个参数都设为 -1)。
1 | docker run -it -d httpd |
(2)下面命令允许容器最多使用 200MB 的内存和 100MB 的 swap:
1 | docker run -it -d -m 200M --memory-swap=300M httpd |
(3)如果在启动容器是只指定 -m 而不指定 --memory-swap,那么 --memory-swap 默认为 -m 的两倍。比如下面容器最多使用 200MB 的物理内存和 200MB 的 swap:
1 | docker run -it -d -m 200M httpd |
(4)下面限制容器使用 200MB 的物理内存,但不限制使用的 swap 分区大小:
1 | docker run -it -d -m 200M --memory-swap=-1 httpd |
二、CPU 限额
1,参数说明
默认设置下,所有容器可以平等地使用 host CPU 资源并且没有限制。
docker 可以通过 -c 或 –cpu-shares 设置容器使用 CPU 的权重。如果不指定,默认值为 1024。
与内存限额不同,通过 -c 设置的 CPU share 并不是 CPU 资源的绝对数量,而是一个相对的权重值。某个容器最终能分配到 CPU 资源取决于它的 CPU share 占所有容器 CPU share 总和的比例。
简单说来就是通过 CPU share 可以设置容器使用 CPU 的优先级。
2,使用样例
(1)下面我们启动两个 progrium/stress 镜像容器,其中 test01 的 cpu share 是 test02 的两倍,也就是说当两个容器都需要 CPU 资源时 test01 可以得到的 CPU 是 test02的两倍。
progrium/stress 是一个可以用来做压力测试的镜像。其中 --cpu 用来设置工作线程的数量:
因为当前 host 只有 1 颗 CPU,所以一个工作线程就可以将 CPU 压满。
如果 host 有多颗 CPU,则需要相应增加 --cpu 的数量。
1 2 | docker run -it -d --name test01 -c 1024 progrium/stress --cpu 1 docker run -it -d --name test02 -c 512 progrium/stress --cpu 1 |
(2)在 host 中执行 top 命令查看容器对 CPU 的使用情况,可以看到 test01 消耗的 CPU 确实是 test02 的两倍。
注意:这种按权重分配 CPU 只会发生在 CPU 资源紧张的情况下。如果 test01 处于空闲状态,这时为了充分利用 CPU 资源,test02 也可以分配到全部的 CPU。
三、Block IO 宽带限额
Block IO 是另一种可以限制容器使用的资源。Block IO 指的是磁盘的读写,docker 可通过设置权重、限制 bps 和 iops 的方式控制容器读写磁盘的带宽。
1,block io 权重
(1)参数说明
默认情况下,所有容器能平等地读写磁盘,可以通过设置 --blkio-weight 参数来改变容器 block io 的优先级。
--blkio–weight 与 --cpu-shares 类似,设置的是相对权重值,默认为 500。
(2)下面样例 test01 磁盘的带宽时 test02 的两倍。
1 2 | docker run -t --name test01 --blkio-weight 600 ubuntu docker run -t --name test02 --blkio-weight 300 ubuntu |
2,限制 bps 和 iops
(1)bps 和 iops介绍:
bps 是 byte per second,每秒读写的数据量。
iops 是 io per second,每秒 IO 的次数。
(2)可通过以下参数控制容器的 bps 和 iops:
--device-read-bps:限制读某个设备的 bps。
--device-write-bps:限制写某个设备的 bps。
--device-read-iops:限制读某个设备的 iops。
--device-write-iops:限制写某个设备的 iops。
(3)下面样例限制容器写 /dev/sda 的速率为 30MB/s。因为容器的文件系统是在 host /dev/sda 上的,所以在容器中写文件相当于对 host /dev/sda 进行写操作。
1 | docker run -it --device-write-bps /dev/sda:30MB ubuntu |
原文链接:https://www.hangge.com/blog/cache/detail_2413.html