赞
踩
【cgroup】
cgroups名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组(如CPU、内存、磁盘输入输出等。
【Docker资源限制】
Docker在默认情况下,容器是没有资源限制的,它会尽可能地使用宿主机能够分配给它的资源。
如果不对容器资源进行限制,容器之间就会相互影响。比如:一些占用资源较高的容器会排挤并吞噬掉所有的硬件资源,从而导致其它容器无硬件资源可用,发生停服状态。
同时呢Docker也提供了限制内存,CPU或磁盘IO的方法, 可以对容器所占用的硬件资源大小以及多少进行限制,我们在使用docker create
创建一个容器或者docker run
运行一个容器的时候就可以来对此容器的硬件资源做限制。
Docker 通过 cgroup 来控制容器使用的资源配额,包括 CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。
设置CPU资源的选项如下:
与内存限额不同,通过-c设置的cpu share 并不是CPU资源的绝对数量,而是一个相对的权重值。某个容器最终能分配到的CPU资源取决于它的cpu share占所有容器cpu share总和的比例。换句话说,通过cpu share可以设置容器使用CPU的优先级或可用份额。
# containerA的cpu share 1024, 是containerB 的两倍。
# 当两个容器都需要CPU资源时,containerA可以得到的CPU是containerB 的两倍。
# 需要特别注意的是,这种按权重分配CPU只会发生在CPU资源紧张的情况下。
# 如果containerA处于空闲状态,这时,为了充分利用CPU资源,containerB 也可以分配到全部可用的CPU。
docker run --name "cont_A" -c 1024 ubuntu
docker run --name "cont_B" -c 512 ubuntu
# 容器最多可以使用主机上两个CPU(逻辑cpu,核数) ,除此之外,还可以指定如 1.5 之类的小数。
docker run -it --rm --cpus=2 centos /bin/bash
# 表示容器中的进程可以在 CPU-1 和 CPU-3 上执行。
docker run -it --cpuset-cpus="1,3" ubuntu:14.04 /bin/bash
# 表示容器中的进程可以在 CPU-0、CPU-1 及 CPU-2 上执行。
docker run -it --cpuset-cpus="0-2" ubuntu:14.04 /bin/bash
CPU资源的绝对限制:
Linux 通过 CFS(Completely Fair Scheduler,完全公平调度器)来调度各个进程对 CPU 的使用。CFS 默认的调度周期是 100ms。
我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间。
docker run -it --cpu-period=50000 --cpu-quota=25000 Centos centos /bin/bash
表示将 CFS 调度的周期设为 50000,将容器在每个周期内的 CPU 配额设置为 25000,表示该容器每 50ms 可以得到 50% 的 CPU 运行时间。
docker run -it --cpu-period=10000 --cpu-quota=20000 Centos centos /bin/bash
表示将容器的 CPU 配额设置为 CFS 周期的两倍,CPU 使用时间怎么会比周期大呢?其实很好解释,给容器分配两个 CPU 就可以了。该配置表示容器可以在每个周期内使用两个 CPU 的 100% 时间。
CFS 周期的有效范围是 1ms~1s,对应的–cpu-period的数值范围是 1000~1000000。
而容器的 CPU 配额必须不小于 1ms,即–cpu-quota的值必须 >= 1000。可以看出这两个选项的单位都是 us。
参数总结:
容器可以使用的内存包括两部分:物理内存和Swap。
Docker通过下面两组参数来控制容器内存的使用量。
默认情况下,上面两组参数为-1,即对容器内存和swap的使用没有限制。如果在启动容器时,只指定-m而不指定–memory-swap, 那么–memory-swap默认为-m的两倍。
# 允许该容器最多使用200MB的内存和100MB 的swap。
docker run -m 200M --memory-swap=300M ubuntu
# 容器最多使用200M的内存和200M的Swap
docker run -it -m 200M ubuntu
Block IO 是另一种可以限制容器使用的资源。Block IO 指的是磁盘的读写,docker 可通过设置权重、限制 bps 和
iops 的方式控制容器读写磁盘的带宽注:目前 Block IO 限额只对 direct IO(不使用文件缓存)有效。
默认情况下,所有容器能平等地读写磁盘,可以通过设置--blkio-weight
参数来改变容器 block IO 的优先级。 --blkio-weight
与 --cpu-shares
类似,设置的是相对权重值,默认为 500。
# container_A是container_B的两倍
docker run -it --name container_A --blkio-weight 600 ubuntu
docker run -it --name container_B --blkio-weight 300 ubuntu
对bps和iops进行限制:
可通过以下参数控制容器的 bps 和 iops:
# 限制容器写 /dev/sda 的速率为 30 MB/s
docker run -it --device-write-bps /dev/sda:30MB centos:latest
# dd 测试在容器中写磁盘的速度
time dd if=/dev/zero of=test.out bs=1M count800 oflag=direct
dd测试参数:
- if=file:输入文件名,缺省为标准输入
- of=file:输出文件名,缺省为标准输出
- ibs=bytes:一次读入bytes 个字节(即一个块大小为 bytes 个字节)
- obs=bytes:一次写 bytes 个字节(即一个块大小为 bytes个字节)
- bs=bytes:同时设置读写块的大小为 bytes ,可代替 ibs 和 obs
- count=blocks:仅拷贝 blocks个块,每个块大小等于 ibs 指定的字节数
如果Docker要使用GPU,需要docker支持GPU,在docker19以前都需要单独下载nvidia-docker1或nvidia-docker2来启动容器.
但在docker19中后需要GPU的Docker只需要加个参数- -gpus即可(- -gpus all表示使用所有的gpu;要使用2个gpu:–-gpus 2即可;也可直接指定使用哪几个卡:–gpus ‘“device=1,2”’),Docker里面想读取nvidia显卡再也不需要额外的安装nvidia-docker了。
查看是否具备–gpus参数
docker run --help | grep -i gpus
查看nvidia界面是否能够启动
运行nvidia官网提供的镜像,并输入nvidia-smi命令,查看nvidia界面是否能够启动。
docker run --gpus all nvidia/cuda:9.0-base nvidia-smi
Docker限制GPU使用:
# 使用所有GPU
docker run --gpus all ubuntu
# 使用两个GPU
docker run --gpus 2 ubuntu
# 指定GPU运行
docker run --gpus '"device=2"' ubuntu
docker run --gpus '"device=1,2"' ubuntu
docker run --gpus '"device=UUID-ABCDEF,1"' ubuntu
如有不足,欢迎私信交流!
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。