Docker - 常用命令汇总2(容器资源限制:内存、CPU、带宽)

作者: hangge 发布时间: 2019-09-10 浏览: 1892 次 编辑

    一个 docker host 上会运行若干个容器,每个容器都需要 CPU、内存和 io 资源。我们可以控制分配多少 CPU、内存资源给每个容器,从而避免某个容器因占用太多资源而影响其他容器乃至整个 host 的性能。

一、内存限额

1,参数说明

与操作系统类似,容器可使用的内存包括两部分:物理内存和 swapdocker 通过下面两组参数来控制内存的使用量:

  • -m 或 --memory:设置 内存 的使用限额,例如 100MB2GB

  • --memory -swap:设置 内存 + swap 的使用限额(因此这个参数值必须大于上面那个)。


2,使用样例

(1)默认情况下,容器内存和 swap 的使用是没有限制的(相当于两个参数都设为 -1)。

docker run -it -d  httpd


(2)下面命令允许容器最多使用 200MB 的内存和 100MB 的 swap

docker run -it -d -m 200M --memory-swap=300M httpd


(3)如果在启动容器是只指定 -m 而不指定 --memory-swap,那么 --memory-swap 默认为 -m 的两倍。比如下面容器最多使用 200MB 的物理内存和 200MB 的 swap

docker run -it -d -m 200M httpd


(4)下面限制容器使用 200MB 的物理内存,但不限制使用的 swap 分区大小:

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 的数量。

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

原文:Docker - 常用命令汇总2(容器资源限制:内存、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 的两倍。

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 进行写操作。

docker run -it --device-write-bps /dev/sda:30MB ubuntu


原文链接:https://www.hangge.com/blog/cache/detail_2413.html