> 文章列表 > Ddocker cgroups资源限制

Ddocker cgroups资源限制

Ddocker cgroups资源限制

目录

一、概述

1、简介

2、cgroups四大功能

3、cpu时间片概念

二、查看容器的默认CPU使用限制

 1、进行CPU压力测试

三、创建容器时设置CPU使用时间限制

四、设置CPU资源占用比(设置多个容器时才有效

 1、分别进入容器进行压测

 查看容器运行状态

五、设置容器绑定指定的CPU

六、对内存使用的限制

限制容器可以使用的最大内存

 限制容器可用swap大小

七、对磁盘IO的配置控制

1、创建容器,限制读速度

2、创建容器,限制写速度


一、概述

1、简介

       cgroups,是一个非常强大的linux内核工具,他不仅可以限制被 namespace 隔离起来的资源, 还可以为资源设置权重、计算使用量、操控进程启停等等。 所以 cgroups(Control groups)实现了对资源的配额和度量。

2、cgroups四大功能

  • 资源限制:可以对任务使用的资源总额进行限制
  • 优先级分配:通过分配的cpu时间片数量以及磁盘IO带宽大小,实际上相当于控制了任务运行优先级
  • 资源统计:可以统计系统的资源使用量,如cpu时长,内存用量等
  • 任务控制:cgroup可以对任务执行挂起、恢复等操作

3、cpu时间片概念

       时间片即CPU分配给各个程序的时间,每个线程被分配一个时间段,称作它的时间片,即该进程允许运行的时间,使各个程序从表面上看是同时进行的。如果在时间片结束时进程还在运行,则CPU将被剥夺并分配给另一个进程。如果进程在时间片结束前阻塞或结束,则CPU当即进行切换。而不会造成CPU资源浪费。

       在宏观上:我们可以同时打开多个应用程序,每个程序并行不悖,同时运行。但在微观上:由于只有一个CPU,一次只能处理程序要求的一部分,如何处理公平,一种方法就是引入时间片,每个程序轮流执行。

对CPU使用的限制

       Linux通过CFS (Completely Fair Scheduler, 完全公平调度器)来调度各个进程对CPU的使用。CFS默认的调度周期是100ms

       我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少CPU时间。

使用 --cpu-period 即可设置调度周期,使用 --cpu-quota 即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。

CFS周期的有效范围是1ms ~ 1s, 对应的 --cpu-period 的数值范围是 1000 ~1000000 (单位微秒)。

而容器的CPU配额必须不小于1ms,即 --cpu-quota 的值必须 >= 1000。

二、查看容器的默认CPU使用限制

[root@localhost ~]# docker run -itd --name k1 centos:7 /bin/bash
[root@localhost ~]# docker ps 
CONTAINER ID   IMAGE      COMMAND       CREATED          STATUS          PORTS     NAMES
ae832e2e7d18   centos:7   "/bin/bash"   39 minutes ago   Up 39 minutes             k1
[root@localhost ~]# cd /sys/fs/cgroup/cpu/docker/
[root@localhost docker]# ls
25990ec94f9bfe21aa095a8456eb5386aa32dbceda13bb3a52241cc8ea550ae9  cgroup.event_control  cpuacct.usage         cpu.cfs_quota_us   cpu.shares         tasks
ae832e2e7d18ec35a887ca12cafe2e1dbcd9def8b7a2e814215300d3ed07f7aa  cgroup.procs          cpuacct.usage_percpu  cpu.rt_period_us   cpu.stat
cgroup.clone_children                                             cpuacct.stat          cpu.cfs_period_us     cpu.rt_runtime_us  notify_on_release
[root@localhost docker]# cd ae832e2e7d18ec35a887ca12cafe2e1dbcd9def8b7a2e814215300d3ed07f7aa
#切换到k1容器的目录
[root@localhost ae832e2e7d18ec35a887ca12cafe2e1dbcd9def8b7a2e814215300d3ed07f7aa]# ls
cgroup.clone_children  cgroup.procs  cpuacct.usage         cpu.cfs_period_us  cpu.rt_period_us   cpu.shares  notify_on_release
cgroup.event_control   cpuacct.stat  cpuacct.usage_percpu  cpu.cfs_quota_us   cpu.rt_runtime_us  cpu.stat    tasks
[root@localhost ae832e2e7d18ec35a887ca12cafe2e1dbcd9def8b7a2e814215300d3ed07f7aa]# cat cpu.cfs_quota_us
-1           #默认为-1,表示不限制
[root@localhost ae832e2e7d18ec35a887ca12cafe2e1dbcd9def8b7a2e814215300d3ed07f7aa]# cat cpu.cfs_period_us
100000       #单位微秒,即100毫秒,0.1秒#cpu.cfs_period_us:分配的周期(微秒,所以文件名中用u),默认为100000。#cpu.cfs_quota_us:表示该cgroups限制占用的时间(微秒),默认为-1,表示不限制。#cpu.cfs_quota_us 如果设为50000,表示占用 50000/100000=50%的CPU。

 1、进行CPU压力测试

docker exec -it 3ed82355f811 /bin/bash    #进入容器
vi /cpu.sh                                #写个死循环脚本#!/bin/bash
i=0
while true
dolet i++
done[root@ae832e2e7d18 /]# chmod +x cpu.sh    #给脚本权限
[root@ae832e2e7d18 /]# ./cpu.sh           #运行脚本
再开一个终端,查看你cpu.sh进程的cpu使用率#之后在容器中使用ctrl+c,停止脚本的执行,再top观察CPU使用率

 

三、创建容器时设置CPU使用时间限制

 

#设置50%的比例分配CPU使用时间上限
docker run -itd --name k2 --cpu-quota 50000 centos:7 /bin/bash	
#可以重新创建一个容器并设置限额
或者
cd /sys/fs/cgroup/cpu/docker/ae832e2e7d18ec35a887ca12cafe2e1dbcd9def8b7a2e814215300d3ed07f7aa
/
echo 50000 > cpu.cfs_quota_us
docker exec -it ae832e2e7d18 /bin/bash
./cpu.shtop					#可以看到cpu占用率接近50%,cgroups对cpu的控制起了效果#容器的CPU使用时间限制设为50000,而调度周期为100000,表示容器占用50000/100000=50%的CPU。

四、设置CPU资源占用比(设置多个容器时才有效

[root@localhost ~]# docker rm -f $(docker ps -a)
#先删除所有容器
Docker 通过 --cpu-shares 指定 CPU 份额,默认值为1024,值为1024的倍数。
#创建两个容器为 c1 和 c2,若只有这两个容器,设置容器的权重,使得c1和c2的CPU资源占比为1/3和2/3。
docker run -itd --name t1 --cpu-shares 512 centos:7	
docker run -itd --name t2 --cpu-shares 1024 centos:7	

 1、分别进入容器进行压测

[root@localhost ~]# echo "net.ipv4.ip_forward = 1">> /etc/sysctl.conf 
[root@localhost ~]# sysctl -p
net.ipv4.ip_forward = 1
#宿主机开启路由转发,使容器能连通外网#分别进入容器,进行压力测试
#进入t1容器,进行压测
docker exec -it t1 /bin/bash
yum install -y epel-release
yum install -y stress
stress -c 4				#产生四个进程,每个进程都反复不停的计算随机数的平方根#进入t2容器,进行压测
docker exec -it t2 /bin/bash
yum install -y epel-release
yum install -y stress
stress -c 4				#产生四个进程,每个进程都反复不停的计算随机数的平方根

 查看容器运行状态

docker stats
ONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O         PIDS
3ba4d9e1ff02   t2        133.57%   157.6MiB / 1.781GiB   8.64%     37.1MB / 406kB   44.7MB / 50.6MB   7
aaba2641f3bf   t1        67.05%    102.1MiB / 1.781GiB   5.60%     37.1MB / 442kB   138MB / 50.4MB    7

五、设置容器绑定指定的CPU

#先分配虚拟机4个CPU核数
docker run -itd --name d1 --cpuset-cpus 1,3 centos:7 /bin/bash
#进入容器,进行压力测试
docker exec -it d1 /bin/bash
yum install -y epel-release
yum install stress -y
stress -c 4
#退出容器,执行 top 命令再按 1 查看CPU使用情况。

 

六、对内存使用的限制

限制容器可以使用的最大内存

 #-m(--memory=)选项用于限制容器可以使用的最大内存docker run -itd --name d5 -m 512m centos:7 /bin/bash
#创建容器,并限制容器能使用的最大内存为512m
docker stats
#查看容器状态CONTAINER ID   NAME      CPU %     MEM USAGE / LIMIT     MEM %     NET I/O          BLOCK I/O        PIDS
2041f1b3d1e7   d5        0.00%     404KiB / 512MiB       0.08%     648B / 0B        0B / 0B          1
31d195f881ce   d1        0.00%     233.8MiB / 1.781GiB   12.82%    36.8MB / 170kB   117MB / 50.5MB   1

 限制容器可用swap大小

限制可用的 swap 大小, --memory-swap
强调一下,--memory-swap 是必须要与 --memory 一起使用的。正常情况下,--memory-swap 的值包含容器可用内存和可用 swap。
所以 -m 300m --memory-swap=1g 的含义为:容器可以使用 300M 的物理内存,并且可以使用 700M(1G - 300)的 swap。如果 --memory-swap 设置为 0 或者 不设置,则容器可以使用的 swap 大小为 -m 值的两倍。
如果 --memory-swap 的值和 -m 值相同,则容器不能使用 swap。
如果 --memory-swap 值为 -1,它表示容器程序使用的内存受限,而可以使用的 swap 空间使用不受限制(宿主机有多少 swap 容器就可以使用多少)。

七、对磁盘IO的配置控制

 --device-read-bps:限制某个设备上的读速度bps ( 数据量),单位可以是kb、mb (M)或者gb。例: docker run -itd --name test9 --device-read-bps /dev/sda:1M centos:7 /bin/bash#表示该容器每秒只能读取1M的数据量​--device-write-bps : 限制某个设备上的写速度bps ( 数据量),单位可以是kb、mb (M)或者gb。例: docker run -itd --name test10 --device-write-bps /dev/sda:1mb centos:7 /bin/bash#表示该容器每秒只能写入1M的数据量​--device-read-iops :限制读某个设备的iops (次数)--device-write-iops :限制写入某个设备的iops ( 次数)

1、创建容器,限制读速度

#创建容器,限制读入速度
docker run -itd --name y5 --device-write-bps /dev/sda:1mb centos:7 /bin/bash

2、创建容器,限制写速度

[root@localhost ~]# docker run -it --name t10 --device-write-bps /dev/sda:1MB centos:7 /bin/bash#通过dd来验证写速度,拷贝10M的数据
[root@bad897fe72fd /]# dd if=/dev/zero of=test.out bs=1M count=10 oflag=direct
#添加oflag参数以规避掉文件系统cache
10+0 records in
10+0 records out
10485760 bytes (10 MB) copied, 10.0048 s, 1.0 MB/s#10秒的时间内已写入10M的数据,写入速度为1M/s。