内存限额
概念介绍
- 容器使用内存包括两个部分:物理内存和swap。docker通过以下两组参数来控制容器内存使用量
1 -m或–memory:设置内存使用限额,例如100M,2G
2 -memory-swap:设置内存+swap使用限额
操作实例
- 我们可以使用progrium/stress镜像,该镜像可用于对容器进行压力测试。
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
--vm 1:启动1个内存工作线程
--vim-bytes 280M:每个线程分配280MB内存
如图所示:
如果超过--vm-bytes超过300M,stress就会报错
docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 320M
- 如果在启动容器时,只指定-m而不指定–memory-swap,那么–memory-swap默认是-m的两倍,也就是200M内存和200M的swap。
- 内存使用限制
docker run -itd --name test2 -m 512m centos /bin/bash
通过docker stats查看
CPU限额
概念介绍
- 默认设置下,所有容器可以平等的使用CPU资源并且没有限制,docker可以通过-c或–cpu-shares设置CPU权重,如果不指定,默认值为1024。按权重分配CPU只会在资源紧张的情况下,一个容器空闲状态下,为了充分利用CPU资源,另一个也可以分配到全部可用的cpu。
操作实例
- 20%的限定
docker run -itd --name test1 --cpu-quota 20000 centos /bin/bash
- cpu压力测试
docker exec -it cc238216f3fb /bin/bash
yum install bc -y
echo "scale=5000; 4*a(1)" |bc -l -q(取圆周率后5000位。)
- 打开top可以发现cpu最大资源利用率不会超过20%
- 按比例分配
创建两个容器,设置容器权重,使得cpu资源使用率为33.3%与66.7%
docker run -itd --name c1 --cpu-shares 512 centos /bin/bash
docker run -itd --name c2 --cpu-shares 1024 centos /bin/bash
- 进入容器分别安装压测工具
yum install epel-release -y
yum install stress -y
stress -c 4进行压力测试
- 打开另一个终端输入docker stats查看
- centos 8无法yum install stress,可以使用
wget https://download-ib01.fedoraproject.org/pub/epel/7/x86_64/Packages/s/stress-1.0.4-16.el7.x86_64.rpm
rpm -ivh stress-1.0.4-16.el7.x86_64.rpm
- 限制容器使用指定的cpu
docker run -itd --name test2 --cpuset-cpus 1,3 centos /bin/bash
- 与上面相同进行压测,通过top命令按1查看cpu1,3是否为满值
Block IO带宽限额
概念介绍
- Block IO是另一种可以限制容器的使用资源。Block IO指的是磁盘的读写,docker可以通过设置权重、限制bps与iops的方式控制容器读写磁盘的宽带。
- block IO权重
默认情况下,所有容器平等地读写磁盘,可以通过设置–blkio-weight参数来改变block IO的优先级。默认值为500
docker run -it --name test1 --blkio-weight 600 ubuntu
docker run -it --name test2 --blkio-weight 300 ubuntu - 限制bps和iops
bps:byte per second,每秒读写的数据量
iops:io per second,每秒IO次数
–device-read-bps:限制读某个设备的bps
–device-write-bps:限制写某个设备的iops
–device-read-iops:限制读某个设备的bps
–device-write-iops:限制写某个设备的iops
操作实例
docker run -it --device-write-bps /dev/sda:30MB ubuntu
time dd if=/dev/zero of=test.out bs=1M count=800 oflag=direct
- 速度在30MB左右,一般不超过30MB/s
oflag=direct指定用direct IO方式写文件,这样–device-write-bps才能生效。
如果不作限制它的读写速度则会大大提高