目录
一、对CPU使用率的控制
1.1 CPU 资源控制
1.2 cgroups有四大功能
1.3 设置cpu使用率上限
查看周期限制和cpu配额限制
进行cpu压力测试然后修改每个周期的使用cpu的时间,查看cpu使用率
1.4 设置cpu资源占用比(设置多个容器时才有效)
创建两个容器设置比例然后压测
分别进入到c1和c2容器中,进行压测
1.5 设置容器绑定指定的cpu
二、内存资源控制
三、磁盘IO配额控制
3.1、限制Block IO
3.2、限制bps和iops进行限制
Linux通过CFS(completely fair scheduler,完全公平调度器)来调度各个进程对cpu的使用
Linux通过CFS(Completely Fair Scheduler,完全公平调度器)来调度各个进程对CPU的使用。CFS默认的调度周期是100ms。
我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少 CPU 时间。
使用 --cpu-period 即可设置调度周期,使用 --cpu-quota 即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。
CFS 周期的有效范围是 1ms~1s,对应的 --cpu-period 的数值范围是 1000~1000000。 周期100毫秒
而容器的 CPU 配额必须不小于 1ms,即 --cpu-quota 的值必须 >= 100
docker run -itd --name test1 centos:7 /bin/bash
#启动一个centos:7镜像容器
docker ps -a
#查看是否启动成功,并查看pid号
cd /sys/fs/cgroup/cpu/docker/容器PID号
#进入到该容器的限制目录中
cat cpu.cfs_quota_us
#查看每个周期的cpu最大限制时间
cat cpu.cfs_period_us
#查看调度周期是多久
//cpu.cfg_period_us: cpu 分配的周期(微秒,所以文件名中用us表示),默认为100000
//cpu.cfg_quota_us: 表示该cgroups限制占用的时间(微秒),默认为-1,表示为不限制,如果设为50000,表示占用50000/100000=50%的cpu
docker run -itd --name test1 --cpu-quota 50000 centos:7 /bin/bash
#可以直接创建一个容器并设置每个周期cpu执行的时间
或者
docker run -itd --name test1 centos:7 /bin/bash
cd /sys/fs/cgroup/cpu/docker/【容器pid】
echo 50000 > cpu.cfs_quota_us
#也可以先创建一个容器,然后进入到文件中直接修改cpu执行的实际的文件名称
docker exec -it 【容器id】 /bin/bash
#进入容器
vim /cpu.sh
#!bin/bash
i=0
while true
do
let i++
done
#创建死循环脚本,为了进行cpu压力测试
chmod +x /cpu.sh
./cpu.sh
#执行脚本
top
#查看这个容器中脚本占的多少的cpu资源
Docker通过-cpu-share指定cpu份额,默认为1024,值为1024的倍数
比如,当前系统上一共运行了两个容器,第一个容器上权重是1024,第二个容器权重是512, 第二个容器启动之后没有运行任何进程,自己身上的512都没有用完,而第一台容器的进程有很多,这个时候它完全可以占用容器二的CPU空闲资源,这就是共享式CPU资源;如果容器二也跑了进程,那么就会把自己的512给要回来,按照正常权重1024:512划分,为自己的进程提供CPU资源。如果容器二不用CPU资源,那容器一就能够把容器二的CPU资源所占用,如果容器二也需要CPU资源,那么就按照比例划分。那么第一个容器会从原来使用整个宿主机的CPU变为使用整个宿主机的CPU的2/3;这就是CPU共享式,也证明了CPU为可压缩性资源。
docker run -itd --name c1 --cpu-shares 512 centos:7
docker run -itd --name c2 --cpu-shares 1024 centos:7
#创建两个容器为c1和c2,若只有这两个容器,设置容器的权重,使得c1和c2的cpu资源占比为1/3和2/3
分别进入容器,进行压力测试
yum install -y epel-release
yum install -y stress
stress -c 4 #产生四个进程,每个进程都反复不停的计算随机数的平方根
再开一个终端查看 docker stats
–cpuset-cpus 是限制容器运行在指定的cpu核心
运行容器运行在哪个CPU核心上,例如主机有4个核心,cpu核心标识为0-3,我们一启动容器,只想让这台容器运行在标识0和3的两个CPU核心上,可以使用cpuset来指定。
docker run -itd --name c3 --cpuset-cpus 1,3 centos:7 /bin/bash
#启动一个容器,让它只使用内核1和内核3的资源
docker exec -it 【容器id】 /bin/bash
#进入容器
yum -y install epel-release
yum -y install stress
stress -c 8
#下载压力测试工具,并测试8个核
另一个终端top查看
与操作系统类似,容器可以使用的内存包括两部分:物理内存和Swap
Docker通过下面两组参数来控制容器内存的使用量
正常情况下,–memory-swap 的值包含容器可用内存和可用swap。所以 -m 300m --memory-swap=1g 的含义为:容器可用使用300M的物理内存,并且可以使用700M(1G-300)的swap。
docker run -itd --name m1 -m 200m --memory-swap=300M centos:7 /bin/bash
#允许该容器使用物理内存200M,swap空间为100m
docker stats
#查看容器使用资源情况
Block IO 是另一种可以限制容器使用的资源,Block IO 指的是磁盘的读写,docker可通过设置权重,限制bps和iops的方式控制容器读写磁盘的带宽。
默认情况下,所有容器能平等地读写磁盘,可以通过设置 --blkio-weight 参数来改变容器bliock IO 的优先级。–blkio-weight 与 --cpu-share类似,设置的是相对权重值,默认为500。
docker run -it --name b1 --blkio-weight 600 /bin/bash
docker run -it --name b2 --blkio-weight 300 /bin/bash
#上面两条中,b1容器读写磁盘的带宽是b2容器的两倍
可以通过以下参数控制容器的bps和iops
对写bps进行限制的测试
docker run -it --name b1 --device-write-bps /dev/sda:1mb centos:7 /bin/bash
#创建容器,限制写的数数据量为1mb/s
dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
#测试是否是写入的1MB/S
清理docker占用的磁盘空间
docker system prune -a
#可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络