Docker资源管理

每个Docker容器在运行时都需要CPU, 内存以及IO资源,而运行Docker容器的主机的资源是有限的,因此如何有效的管理和使用资源就非常的重要了,因此Docker也提供了一下机制可以限制容器使用的资源。

CPU

在使用 docker run 启动容器时,提供了参数-c int或者–cpu-shares int可以帮助我们限制容器对CPU的使用。参数值是一个整数类型,用于设置当前Docker容器使用cpu的权重值(默认为1024)。这是一个相对值,每个容器能够使用的cpu, 取决于它的cpu shares 占所有容器cpu share的比例: 例如:

docker run --name "container1" -c 1024 image
docker run --name "container2" -c 512 image

在上述情况下,如果二者都需要内存,那么 container1 分配到两倍于 container2 的CPU资源。

另外需要注意,这种按权重分配 CPU 只会发生在 CPU 资源紧张的情况下。当CPU还有足够的空闲资源时,是没有此限制的。

内存

我们知道内存包括 实际的物理内存 和 交换内存(swap), 因此 Docker也分别提供了参数来控制内存的使用。

物理内存

在使用 docker run 启动容器时,提供参数-m bytes或者–memory bytes可以帮助我们限制容器对内存的使用。

这里的 bytes 指的是以字节为单位的最大使用限额,指的是明确的限额,而不是一个相对值。

例如:

docker run -m 200M image

此时该容器在运行时可以使用的最大的内存值为 200M, 此时 swap 最大值是物理内存的两倍。

交换内存

在使用 docker run 启动容器时,提供参数–memory-swap bytes可以帮助我们限制容器对swap的使用。

与 -m 参数的使用方式相同,并且二者可以同时使用:

docker run -m 200M --memory-swap=300M image

创建的新镜像可以使用最多 200M 物理内存和 300M swap。

IO

IO资源同样也是操作系统的一种非常重要的资源,通常包含了对硬盘的读写,网络数据的交换等等,这里指关注对 Docker host的硬盘的读写(即block IO)。

控制容器读写硬盘的方法有以下几种:

  1. 设置容器读写硬盘资源的权重
  2. 限制bps和iops

设置权重

在使用 docker run 启动容器时,提供参数–blkio-weight int可以帮助我们控制容器读写磁盘(block IO)的优先级。

这个参数类似于使用 -c 对 cpu资源 的控制方式, 设置的是相对值,而不是绝对值。其含义和分配方式均与 -c 类似,这里就不细说了。

限制 bps 和 iops

  • bps: byte per second,每秒读写的字节数(即读写速率)
  • iops: io per second,每秒 IO 的次数

在使用 docker run 启动容器时, 提供了以下参数来加以控制:

  1. –device-read-bps,限制读某个设备时的 bps。
  2. –device-write-bps,限制写某个设备时的 bps。
  3. –device-read-iops,限制读某个设备时的 iops。
  4. –device-write-iops,限制写某个设备时的 iops。

这里的设置指的就是硬盘,磁盘等等,通过这些参数,可以严格的限制当前容器对某个存储设备的读写速度。

  • –device-read-bps和–device-write-bps参数值的格式为: :[]。device-path 指的就是设备的路径名,number是一个正整数,unit是单位,可以是kb, mb 或者gb
  • –device-read-iops和–device-write-iops参数值的格式为: :。注意这里是没有单位的,因为它表示的就是次数。

例如:

docker run -it --device-write-bps /dev/sda:30MB --device-write-iops /dev/sdb:10000 image

上述命令,限制了新容器对磁盘设备/dev/sda的每秒钟后读写的字节数(bps)为30MB, 以及对 /dev/sdb设备的读写最大次数为10000次.

标签:Docker 发布于:2019-10-31 03:17:31