Docker资源控制详细操作

前言:Cgroup是C ontrol group的简写,是Linux内核提供的一种限制使用物理资源的机制,这些资源主要包括CPU、内存、blkio。

文章目录

  • 一、对CPU的控制
    • 1.限制CPU使用速率
      • 1)理解
      • 2)CPU压力测试
    • 2.多任务按比例分享CPU
      • 1)理解
      • 2)测试
        • 2.1 按比例分配
        • 2.2分别进容器
        • 2.3验证结果
    • 3.限制CPU内核使用
      • 1)理解
      • 2)测试
  • 二、对内存使用的限制
    • 1.理解
    • 2.测试
  • 三、对blkio的限制
    • 1.理解
    • 2.测试
      • 2.1 测试bps
      • 2.2 测试iops
    • 总结

一、对CPU的控制

1.限制CPU使用速率

1)理解

  • 在Docker中可以通过–cpu-quota选项来限制CPU的使用率,CPU的百分比是以1000为单位的,100000为百分之百,1s;比如
docker run --cpu-quota 20000 容器名  //CPU的使用率限定为20%
或者
eco 20000 > /sys/fs/cgroup/容器ID/cou.cfs_quota_us
  • 在CentOS中还可以通过修改对应的Cgroup配置文件 /sys/fs/cgroup/cpu/docker/容器编号/cpu.cfs_quota_us的值来实现,直接执行echo命令讲设定值导入到此文件中就会立即生效
[root@promote ~]# docker ps -a   //查看有一个容器
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS              PORTS               NAMES
c7a05e06be4a        nginx               "nginx -g 'daemon of…"   6 minutes ago       Up 5 minutes        80/tcp              nice_agnesi
[root@promote ~]# cd /sys/fs/cgroup/cpu/docker/
[root@promote docker]# ls   //可以看到ID就是之前查看的容器
c7a05e06be4a0b0916c3771dca9fa714dd5aa8f150438ee6275e7a28b8491e87  cpuacct.usage         cpu.rt_runtime_us
cgroup.clone_children                                             cpuacct.usage_percpu  cpu.shares
cgroup.event_control                                              cpu.cfs_period_us     cpu.stat
cgroup.procs                                                      cpu.cfs_quota_us      notify_on_release
cpuacct.stat
[root@promote docker]# cd c7a05e06be4a0b0916c3771dca9fa714dd5aa8f150438ee6275e7a28b8491e87/  //进入这个容器文件
[root@promote c7a05e06be4a0b0916c3771dca9fa714dd5aa8f150438ee6275e7a28b8491e87]# ls  //可以看到配置文件cpu.cfs_quota_us 
cgroup.clone_children  cpuacct.stat          cpu.cfs_period_us  cpu.rt_runtime_us  notify_on_release
cgroup.event_control   cpuacct.usage         cpu.cfs_quota_us   cpu.shares         tasks
cgroup.procs           cpuacct.usage_percpu  cpu.rt_period_us   cpu.stat
[root@promote c7a05e06be4a0b0916c3771dca9fa714dd5aa8f150438ee6275e7a28b8491e87]# cat cpu.cfs_quota_us 
-1         //此时可以看到值为-1表示没有限制,可以更改值来改变cpu的使用率 

2)CPU压力测试

  • 再开一个终端,使用top命令动态检测CPU状态
    Docker资源控制详细操作_第1张图片
[root@promote ~]# docker run -itd --name test3 --cpu-quota 20000 centos:latest /bin/bash    //创建一个容器并配置cpu使用率
67708ad38fb61f5b9d0e29bf5d7e18d773f1bc2c31f609854ac151d482ab35f6
[root@promote ~]# docker ps -a  //查看容器
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
67708ad38fb6        centos:latest       "/bin/bash"         5 seconds ago       Up 5 seconds                            test3
[root@promote ~]# docker exec -it 67708ad38fb6 /bin/bash   //进入容器
[root@67708ad38fb6 /]# yum install bc -y    //安装计算工具
[root@67708ad38fb6 /]# echo "scale=5000;4*a(1)" | bc -l -q
3.141592653589793238462643383279502884197169399375105820974944592307\
。。。省略部分内容
//a是bc的一个内置函数,代表反正切arctan,由于tan(pi/4)=1,于是4*arctan(1)=pi  -l 使用标准数据库 -q 不输出在界面
  • 此时可以看到CPU状态
    Docker资源控制详细操作_第2张图片
  • 等圆周率计算完毕后,再次查看top
    Docker资源控制详细操作_第3张图片
  • 可以看到CPU使用率下来了

2.多任务按比例分享CPU

1)理解

  • 当有多个容器任务运行时,很难计算CPU的使用率。为了使容器合理使用CPU资源,可以通过–cpu-share选项设置CPU按比例共享CPU资源,这种方式还可以实现CPU使用率的动态调整
  • 比如:运行三个容器A、B、C,占用CPU资源的比例为1:1:2,可以这样执行
docker run --cpu-shares 1024 容器A
docker run --cpu-shares 1024 容器B
docker run --cpu-shares 2048 容器C
  • 如果又有一个容器D需要更多的CPU资源,则可以将其 --cpu-share的值设置为4096,那么A、B、C、D的CPU资源占用比例变为1:1:2:4

2)测试

2.1 按比例分配

  • 创建两个容器为c1和c2,若只有这两个容器,设置容器的权重,使得c1和c2的CPU组员占比为33.3%和66.7%
[root@promote ~]# docker run -itd --name c1 --cpu-shares 512 centos:7 /bin/bash
8b86214f3109234adb0dbef8d71ec22d45a6126f175d99deb9a844378e50fdc1
[root@promote ~]# docker run -itd --name c2 --cpu-shares 1024 centos:7 /bin/bash
2eaf798a0996fac872a83e2606da9f9f1d356bc5564878294899d263a83692d7
[root@promote ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
2eaf798a0996        centos:7            "/bin/bash"         18 seconds ago      Up 17 seconds                           c2
8b86214f3109        centos:7            "/bin/bash"         36 seconds ago      Up 35 seconds                           c1
  • 在另一个终端使用docker stats查看状态
[root@promote ~]# docker stats

Docker资源控制详细操作_第4张图片

2.2分别进容器

[root@promote ~]# docker exec -it d652bfde0835  /bin/bash
[root@d652bfde0835 /]# yum install epel-release -y  //epel源用来装压测工具
[root@d652bfde0835 /]# yum install stress -y   //产生线程的压测工具
//再开一个终端登录
[root@promote ~]# docker exec -it 2eaf798a0996 /bin/bash
[root@2eaf798a0996 /]# yum install epel-release -y

2.3验证结果

  • 分别在两个容器内启用四个线程
[root@8b86214f3109 /]# stress -c 4
stress: info: [100] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd

[root@2eaf798a0996 /]# stress -c 4
stress: info: [117] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
  • 此时查看docker stars
    在这里插入图片描述
  • 可以看到c1和c2的CPU组员占比为33.3%和66.7%
  • 此时再添加一个容器,同样进入容器安装所需要的源即工具,并开启四个线程
[root@promote ~]# docker run -itd --name c3 --cpu-shares 1024 centos:7 /bin/bash
69ba84c65c9800ffff1a3536e7eb634c9878b0dc433287543c68827d7c70c908
[root@promote ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
69ba84c65c98        centos:7            "/bin/bash"         4 seconds ago       Up 3 seconds                            c3
2eaf798a0996        centos:7            "/bin/bash"         10 minutes ago      Up 10 minutes                           c2
8b86214f3109        centos:7            "/bin/bash"         11 minutes ago      Up 11 minutes                           c1
[root@promote ~]# docker exec -it 69ba84c65c98 /bin/bash
[root@69ba84c65c98 /]# yum install epel-release -y
[root@69ba84c65c98 /]# yum install stress -y
[root@69ba84c65c98 /]# stress -c 4
stress: info: [99] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
  • 再次查看docker stats
    Docker资源控制详细操作_第5张图片
  • 可以看到c1、c2和c3的CPU组员占比为1:2:2

3.限制CPU内核使用

1)理解

  • 在Docker中可以使用 --cpuset-cpus选项来使某些程序独享CPU内核,以便提高其处理速度,对应的Cgroup配置文件为/sys/fs/cgroup/cpuset/docker/容器编号/cpuset.cpus
  • 选项后直接跟参数0、1、2······表示第1个内核、第2个内核、第3个内核,与/proc/cpuinfo中的CPU编号(processor)相同
[root@promote ~]# cd /sys/fs/cgroup/cpuset/docker/c7a05e06be4a0b0916c3771dca9fa714dd5aa8f150438ee6275e7a28b8491e87/
[root@promote c7a05e06be4a0b0916c3771dca9fa714dd5aa8f150438ee6275e7a28b8491e87]# cat cpuset.cpus   //查看内容,有四个内核
0-3
  • 如果服务器有16个核心,那么CPU编号为015,使容器绑定第14个内核使用,则
docker run --cpuset-cpus 0,1,2,3 容器名
  • 那么该容器内的进程只会在编号1、2、3、4的CPU上运行
  • 尽量使用绑定内核的方式分配CPU资源给容器进程使用,然后再配合 --cpu-share 选项动态调整CPU使用资源的比例

2)测试

  • 添加处理器为双核双线程
    Docker资源控制详细操作_第6张图片
  • 用top命令查看,按1可以看到全部线程
    Docker资源控制详细操作_第7张图片
  • 此时限制容器使用指定的CPU,并进行压测
[root@promote ~]# docker run -itd --name test1 --cpuset-cpus 1,3 centos:7 /bin/bash
888fa015ac6635d762d63c602ceeb4c485a51d1cea43c95bdb47efb7e593776e
[root@promote ~]# docker exec -it 888fa015ac66 /bin/bash
[root@888fa015ac66 /]# yum install epel-release -y
[root@888fa015ac66 /]# yum install stress -y
[root@888fa015ac66 /]# stress -c 4
stress: info: [94] dispatching hogs: 4 cpu, 0 io, 0 vm, 0 hdd
  • 这时查看top状态
    Docker资源控制详细操作_第8张图片

  • 可以看到,使用的是CPU1和CPU3的核心数资源

  • 对CPU的控制,这几种方法可以同时使用

二、对内存使用的限制

1.理解

  • 在Docker中可以通过docker run -m 命令来限制容器内存使用量,相应的Cgroup配置文件为 /sys/fs/cgroup/memory/memory.limit_in_bytes
[root@promote ~]# cd /sys/fs/cgroup/memory/docker/c7a05e06be4a0b0916c3771dca9fa714dd5aa8f150438ee6275e7a28b8491e87/
[root@promote c7a05e06be4a0b0916c3771dca9fa714dd5aa8f150438ee6275e7a28b8491e87]# cat memory.limit_in_bytes 
9223372036854771712
  • 但是需要注意:一旦容器Cgroup使用的内存超过了限制的容量,Linux内核将会尝试收回这些内存,如果仍旧没法控制内存使用在限制范围之内,进程就会被杀死
  • 例如:限制容器的内存为512M
docker run -m 512M 容器名

2.测试

  • 创建一个容器并指定其内存512m
[root@promote ~]# docker run -itd --name test2 -m 512m centos:7 /bin/bash
b318bb08886ec778fa454cc0bf834224cbc6dda8215af3103f45955132a71313
[root@promote ~]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS                       PORTS               NAMES
b318bb08886e        centos:7            "/bin/bash"         5 seconds ago       Up 4 seconds                                     test2
888fa015ac66        centos:7            "/bin/bash"         10 minutes ago      Up 9 minutes                                     test1
  • 再开一个终端,使用docker stats命令查看状态
    Docker资源控制详细操作_第9张图片
  • 可以看到,test1的内存没有限制,最高能到4GB,而test2的内存限制到512m

三、对blkio的限制

1.理解

  • 如果是在一台服务器上进行容器的混合部署,那么会出现同时有几个程序写磁盘数据的情况,这时可以通过 --device-write-iops 选项来限制写入的iops,相应的还有–device-read-bps选项可以限制读取的iops。但是这种方法只能针对blkio限制的是设备(device),而不是分区。相应Cgroup写配置文件 /sys/fs/cgroup/blkio/docker
[root@promote ~]# cd /sys/fs/cgroup/blkio/docker/c7a05e06be4a0b0916c3771dca9fa714dd5aa8f150438ee6275e7a28b8491e87/
[root@promote c7a05e06be4a0b0916c3771dca9fa714dd5aa8f150438ee6275e7a28b8491e87]# ls
blkio.throttle.write_iops_device
。。。省略部分内容
//格式
--device-read-bps:限制读某个设备的bps(数据量)
例:docker run -itd --device-read-bps /dev/sda:30M centos:7

--device-write-bps:限制写入某个设备的bps(数据量)
例:docker run -itd --device-write-bps /dev/sda:30M centos:7

--device-read-iops:限制读某个设备的iops(次数)

--device-write-iops:限制读某个设备的iops(次数)

2.测试

2.1 测试bps

  • 测试写bps限制
[root@promote ~]# docker run -it --name test3 --device-write-bps /dev/sda:1mb centos:7 /bin/bash   
[root@c918d1bf6f72 /]# dd if=/dev/zero of=test.out bs=1M count=100 oflag=direct
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 100.064 s, 1.0 MB/s     //可以得知写入的平均速度是 1.0 MB/s
  • 也可以使用iotop命令查看,没有可以yum install安装
    Docker资源控制详细操作_第10张图片
  • 获取测试过程中的 bps 也是 1.0 MB 为上限
  • 读 bps 限制测试方法与写bps一样

2.2 测试iops

  • 测试写iops
[root@promote ~]# docker run -it --name test4 --device-write-iops /dev/sda:5 centos:7 /bin/bash
[root@90efd5a9fb07 /]# dd if=/dev/zero of=test.out bs=1M count=100 oflag=direct
100+0 records in
100+0 records out
104857600 bytes (105 MB) copied, 40.0031 s, 2.6 MB/s
  • 通过 iostat 监控 tps(此处即为 iops)基本上持续在5左右(会有些偏差)

  • iostat 1 可以持续监控
    Docker资源控制详细操作_第11张图片

  • 读 iops 限制测试方法同写 iops 限制

  • 总结

  • Cgroup是Control group 的简写,是Linux内核提供的一种限制所使用物理资源的机制,这些资源主要包括CPU、内存、blkio

你可能感兴趣的:(docker)