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

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

    一个 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 的内存和 100MBswap
docker run -it -d -m 200M --memory-swap=300M httpd

(3)如果在启动容器是只指定 -m 而不指定 --memory-swap,那么 --memory-swap 默认为 -m 的两倍。比如下面容器最多使用 200MB 的物理内存和 200MBswap
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 sharetest02 的两倍,也就是说当两个容器都需要 CPU 资源时 test01 可以得到的 CPU 是 test02的两倍。
progrium/stress 是一个可以用来做压力测试的镜像。其中 --cpu 用来设置工作线程的数量:
  • 因为当前 host 只有 1CPU,所以一个工作线程就可以将 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

三、Block IO 宽带限额

Block IO 是另一种可以限制容器使用的资源。Block IO 指的是磁盘的读写,docker 可通过设置权重、限制 bpsiops 的方式控制容器读写磁盘的带宽。

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)bpsiops介绍:
  • bpsbyte per second,每秒读写的数据量。 
  • iops io per second,每秒 IO 的次数。

(2)可通过以下参数控制容器的 bpsiops
  • --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
评论0