docker资源配额
百度网盘链接:https://pan.baidu.com/s/15t_TSH5RRpCFXV-93JHpNw?pwd=8od3 提取码:8od3
7 docker资源配额
7.1 docker容器控制cpu
Docker通过cgroup来控制容器使用的资源限制,可以对docker限制的资源包括CPU 内存 磁盘。
7.1.1 指定docker容器可以使用的cpu份额
查看配置份额的帮助命令:
# docker run --help | grep cpu-shares
cpu配额参数:-c, --cpu-shares int
例:给容器实例分配512权重的cpu使用份额
# docker run -it --cpu-shares 512 centos /bin/bash
$ cat /sys/fs/cgroup/cpu/cpu.shares #查看结果:512
在 host 中启动了两个容器:
# docker run --name "container_A" -c 1024 ubuntu
# docker run --name "container_B" -c 512 ubuntu
container_A 的 cpu share 1024,是 container_B 的两倍。当两个容器都需要 CPU 资源时,container_A 可以得到的 CPU 是 container_B 的两倍。
需要注意的是,这种按权重分配 CPU只会发生在 CPU资源紧张的情况下。如果 container_A 处于空闲状态,为了充分利用 CPU资源,container_B 也可以分配到全部可用的 CPU。
7.1.2 CPU core核心控制
参数:--cpuset可以绑定CPU
对多核CPU的服务器,docker还可以控制容器运行限定使用哪些cpu内核和内存节点,即使用--cpuset-cpus和--cpuset-mems参数。对具有NUMA拓扑(具有多CPU 多内存节点)的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。如果服务器只有一个内存节点,则--cpuset-mems的配置基本上不会有明显效果。
7.1.3 CPU配额控制参数的混合使用
在上面这些参数中,cpu-shares控制只发生在容器竞争同一个cpu的时间片时有效。
测试cpu-shares和cpuset-cpus混合使用运行效果,就需要一个压缩力测试工具stress来让容器实例把cpu跑满。
# yum -y install epel-release
# yum -y install stress
stress参数解释
-? 显示帮助信息
-v 显示版本号
-q 不显示运行信息
-n 显示已完成的指令情况
-t --timeout N 指定运行N秒后停止
--backoff N 等待N微妙后开始运行
-c 产生n个进程 :每个进程都反复不停的计算随机数的平方根,测试cpu
-i 产生n个进程 :每个进程反复调用sync(),sync()用于将内存上的内容写到硬盘上,测试磁盘io
-m --vm n 产生n个进程,每个进程不断调用内存分配malloc()和内存释放free()函数 ,测试内存
--vm-bytes B 指定malloc时内存的字节数 (默认256MB)
--vm-hang N 指定在free栈的秒数
-d --hadd n 产生n个执行write和unlink函数的进程
-hadd-bytes B 指定写的字节数
--hadd-noclean 不unlink
运行两个容器实例
# docker run -itd --name docker10 --cpuset-cpus 0,1 --cpu-shares 512 centos /bin/bash
# docker run -itd --name docker20 --cpuset-cpus 0,1 --cpu-shares 1024 centos /bin/bash
测试1: 进入docker10,使用stress测试进程是不是只在cpu0,1上运行:
# docker exec -it docker10 /bin/bash
$ yum install -y epel-release #安装epel扩展源
$ yum install stress -y #安装stress命令
$ stress -c 2 -v -t 10m #运行2个进程,把两个cpu占满
通过top命令可看到正常只在cpu0,1上运行。
测试2: 进入docker20,使用stress测试进程是不是只在cpu0,1上运行,且docker20上运行的stress使用cpu百分比是docker10的2倍
# docker exec -it docker20 /bin/bash
$ yum install -y epel-release #安装epel扩展源
$ yum install stress -y
$ stress -c 2 -v -t 10m
在另外一个虚拟终端上运行top命令,按1快捷键,查看每个cpu使用情况
7.2 docker容器控制内存
Docker提供参数-m, --memory=""限制容器的内存使用量。
例1:允许容器使用的内存上限为128M:
# docker run -it -m 128m centos
$ cat /sys/fs/cgroup/memory/memory.limit_in_bytes
134217728
注:也可以使用tress进行测试。
例2:创建一个docker,只使用2个cpu核心,只能使用128M内存
# docker run -it --cpuset-cpus 0,1 -m 128m centos
7.3 docker容器控制IO
限制此设备上的写速度(bytes per second),单位可以是kb mb或者gb。
--device-read-bps value
例1:限制容器实例对硬盘的最高写入速度设定为 2MB/s。
--device参数:将主机设备添加到容器
# mkdir -p /var/www/html/
# docker run -it -v /var/www/html/:/var/www/html --device /dev/sda:/dev/sda --device-write-bps /dev/sda:2mb centos /bin/bash
$ time dd if=/dev/sda of=/var/www/html/test.out bs=2M count=50 oflag=direct,nonblock
注:dd 参数:
direct:读写数据采用直接IO方式,不走缓存。直接从内存写硬盘上。
nonblock:读写数据采用非阻塞IO方式,优先写dd命令的数据。