docker容器的资源控制
Docker通过Cgroup 来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。Cgroup 是ControlGroups的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、内存、磁盘,io等等)的机制,被LXC、docker等很多项目用于实现进程资源控制。Cgroup本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O或内存的分配控制等具体的资源管理是通过该功能来实现的。
cpu资源控制
cpu的使用上限
linux通过CFS(Completely Fair Scheduler 完全公平调度器),来调度各个进程对cpu的使用。CFS的调度100ms。
我们也可以自定义容器的调度周期。已经在这个周期时间之内各个容器能够使用cpu的调度时间。
--cpu-period 设置容器调度cpu的周期
--cpu-quota 设置在每个周期内容器可以使用cpu的时间
可以配合使用
CFS周期的有效范围:1ms-1s --cpu-period 1000-100 0000
容器使用cpu的配额时间必须要大于1ms --cpu-quota的值,必须是>=1000
[root@docker1 2ba14014323a7d68536ebd8414bcb6a52e1b8f196652509145b49c4a1a529e04]# cat cpu.cfs_quota_us
-1-1:如果配置是-1,那么容器在使用宿主机没有限制,随便用[root@docker1 2ba14014323a7d68536ebd8414bcb6a52e1b8f196652509145b49c4a1a529e04]# cat cpu.cfs_period_us
100000cpu.cfs_period_usCFS调度周期的长度,微秒,在每个周期内,容器可以使用指定比例的cpu时间,默认情况都是100毫秒CFS调度器,100毫秒就是定义了一个周期,在这个周期内,调度任务(容器)的基本时间单位100毫秒一次调度容器请求cpu资源,然后内核把cpu资源分配给容器
cpu.cfs_quota_us
调度器请求之后,根据配额,内核分配给容器使用cpu的时间
正常打开cpu,测试使用上限
cd /opt
docker exec -it test1 bash
yum -y install vimvim cpu.sh
#!/bin/bash
i=0
while true
do
let i++
donewq
chmod 777 cpu.sh
./cpu.shtop查看
会发现脚本把cpu占满了还能用docker top查看docker top test1docker status test1/id 可以容器的运行占用宿主机资源的情况
docker top test1/id 查看容器内宿主机和容器PID的关系
如何用配置文件方式让容器使用cpu只能用一半
docker ps -a
cd /sys/fs/cgroup cpu
ls
cd docker
cd shfbsdjfhughvbdfffjregjerbjgf
echo 50000 > cpu.cfs_period_us
如何对容器占用cpu的时间进行限制
设置cpu的资源占用权重比:需要多个容器才能生效。
--cpu-shares 指定容器占用cpu的份额。默认权重是1024,设置的值只能是1024的倍数。
docker run -itd --name test3 --cpu-shares 512 centos:7 /bin/bashdocker run -itd --name test4 --cpu-shares 1024 centos:7 /bin/bashdocker exec -it test3 bashyum -y install epel-releaseyum -y install stress
//模拟系统负载的工具stress -c 4
top
显示查看cpu还是被占满了docker exec -it test4 bash
yum -y install epel-releaseyum -y install stressstress -c 4docker stats
--cpu-shares 是给每个使用cpu设置了相对的权重,权重高的,可以使用cpu的资源更多,但是,如果只有一个容器在运行,即使设置了权重,但是没有更高的权重的容器来占用空间,权重低的容器依然不受限
绑定容器,让他使用指定的cpu:容器只能使用指定的cpu内核
docker run -itd --name test5 --cpuset-cpus 1,3 centos:7 /bin/bash
docker exec -it test5 bash
yum -y install epel-release
yum insyall stress -y
//压力测试工具
stress -c 4
top
查看
1,3被使用
内存的使用限制
docker run -itd --name test6 -m 512m centos:7 /bin/bash
如何限制使用swap
想要限制容器使用swap,必须和限制内存一块使用。
docker run -itd --name test7 -m 512m --memory-swap=1g centos:7 /bin/bash
如果说限制了内存是512,swap是1G,那么容器上能够使用swap空间,1g-512m=512m
如果不设置: -m 512m 但是使用swap的空间是-m的两倍
如果设置 --memory-swap的值,和内存限制一样,容器就不能使用swap。
-m 512m --memory-swap=-1 ,内存受限还是512M,但是容器使用swap空间不再限制。
磁盘i/o配置
磁盘i/o分为 读 , 写 两部分
限制容器在磁盘上的读速度:
读
docker run -itd --name test8 --device-read-bps /dev/sda:1M centos:7 /bin/bash写
docker run -itd --name test8 --device-write-bps /dev/sda:1M centos:7 /bin/bash
docker exec -it test9 bash
cd /opt
ls
dd if=/dev/zero of=123.txt bs=1M count=10dd if=/dev/zero of=123.txt bs=1M count=10 oflag=direct
在使用命令获取空字符集,是从文件系统的缓存当中输入,速度是比较快的。禁用文件系统缓存,直接把数据写入磁盘,可以更真实的测试设备的性能,模拟直接写入的物理设备的情况
限制容器读取的次数,限制容器写入设备的次数(了解即可)
对读取进行设置,每秒100次
docker run -itd --name test10 --device-read-iops /dev/sda:100 centos:7 /bin/bash对写取进行设置,每秒50次
docker run -itd --name test10 --device-write-iops /dev/sda:50 centos:7 /bin/bash
清理docker占用的磁盘空间
[root@docker1 opt]# docker system prune -a
WARNING! This will remove:- all stopped containers
//删除已经停止的容器- all networks not used by at least one container
//删除所有未被使用的网桥设备- all images without at least one container associated to them
//删除所有未被使用的镜像- all build cache
//删除创建容器时的缓存,以及无用的数据卷
总结
怎么对容器使用cpu进行限制 --cpu-quota 10000 (单位毫秒)
容器占用cpu的权重 --cpu-shares (1024倍数)
容器绑定cpu --cpuset-cpus
容器的宿主机内存的使用限制: -m
swap:必须和限制内存一块使用
-m 512m --memory-swap=512m
磁盘i/o: 清理docker占用的磁盘空间
扩展练习
centos1 占用cpu的时间,10000。占用cpu的权重256。占用内存1GB。cpu1
centos2 占用cpu的时间,20000. 占用权重 512。占用内存2G。cpu2
centos3 占用cpu的时间,30000. 占用权重 1024。占用内存512m。cpu3
并且都用一条命令解决
docker run -itd --name centos1 --cpu-quota 10000 --cpu-shares 256 --cpuset-cpus 1 -m 1g centos:7 /bin/bashdocker run -itd --name centos2 --cpu-quota 20000 --cpu-shares 512 --cpuset-cpus 2 -m 2g centos:7 /bin/bashdocker run -itd --name centos3 --cpu-quota 30000 --cpu-shares 1024 --cpuset-cpus 3 -m 512m centos:7 /bin/bash--name centos1 指定容器名
--cpu-quota 30000 内核分配给容器使用cpu的时间
--cpu-shares 容器占cpu的权重
--cpuset-cpus 指定容器使用哪个cpu
-m 指定容器占用内存