返回 导航

Docker / K8s

hangge.com

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

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

一、内存限额

1,参数说明

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

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)参数说明

(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)

回到顶部