docker资源管理cgroup【cgroup介绍,stress工具的使用,cpu限制,内存的限制,i/0的限制,传输速率的限制】

docker资源管理cgroup


资源分配【 CPU;内存;i/o】的原因:
虚拟机在创建的时候已经做了资源分配,但是容器共享内核资源的

一、cgroup的介绍

cgroups,其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组的资源(如CPU、内存、磁盘输入输出等)。这个项目最早是由Google的工程师(主要是Paul Menage和Rohit Seth)在2006年发起,最早的名称为进程容器(process containers)。在2007年时,因为在Linux内核中,容器(container)这个名词有许多不同的意义,为避免混乱,被重命名为cgroup,并且被合并到2.6.24版的内核中去。自那以后,又添加了很多功能。

【1】cgroup的功能

cgroups的一个设计目标是为不同的应用情况提供统一的接口,从控制单一进程(像nice)到操作系统层虚拟化(像OpenVZ,Linux-VServer,LXC)。cgroups提供:
资源限制:组可以被设置不超过设定的内存限制;这也包括虚拟内存。
优先级:一些组可能会得到大量的CPU或磁盘IO吞吐量。
结算:用来衡量系统确实把多少资源用到适合的目的上。
控制:冻结组或检查点和重启动。

【2】cgroup的作用

1.限制进程组可以使用的资源数量(Resource limiting )。比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会触发OOM(out of memory)。
2.进程组的优先级控制(Prioritization )。比如:可以使用cpu子系统为某个进程组分配特定cpu share。
3.记录进程组使用的资源数量(Accounting )。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间
4.进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。
5.进程组控制(Control)。比如:使用freezer子系统可以将进程组挂起和恢复。

【3】cgroup子系统

blkio – 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)。
cpu – 这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问。
cpuacct – 这个子系统自动生成 cgroup 中任务所使用的 CPU 报告。
cpuset – 这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点。
devices – 这个子系统可允许或者拒绝 cgroup 中的任务访问设备。
freezer – 这个子系统挂起或者恢复 cgroup 中的任务。
memory – 这个子系统设定 cgroup 中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。
net_cls – 这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包。
ns – 名称空间子系统。

二、使用stress工具测试CPU和内存

【1】使用dockerfile来创建一个机遇centos的stress镜像
mkdir /opt/stress
vim /opt/stress/Dockerfile
  FROM centos:7
  MAINTAINER qing
  RUN yum install -y wget
  RUN wget -O /etc/yum.repos.d/epel.repo http://mirrors.aliyun.com/repo/epel-7.repo
  RUN yum install -y stress
cd /opt/stress/
docker build -t centos:stress .
【2】使用命令创建容器

命令–cpu-shares参数值不能保证获得1个vcpu或者多少GHz的CPU资源,它仅是一个弹性加权值

docker run -itd --cpu-shares 100 centos:stress

注:默认情况下,每个docker容器的cpu份额都是1024。单独一个容器的份额是没有意义的,只有在同时运行多个容器时,容器的cpu加权的效果才能体现出来。例如,两个容器A、B的cpu份额分别为1000和500,在cpu进行时间片分配的时候,容器A比容器B多一倍的机会获得CPU的时间片,但分配的结果取决于当时主机和其他容器的运行状态,实际上也无法保证容器A一定能获得CPU时间片。比如容器A的进程一直是空闲的,那么容器B是可以获取比容器A更多的CPU时间片的。极端情况下,比如说主机上只运行了一个容器,即使它的cpu份额只有50,它也可以独占整个主机的cpu资源。cgroups只在容器分配的资源紧缺时,也就是说在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的cpu份额来确定有多少cpu资源分配给它,资源分配结果取决于同时运行的其他容器的cpu分配和容器中进程运行情况。

【3】通过cpu share可以设置容器使用cpu的优先级,

比如启动了两个容器及运行查看cpu使用百分比

docker run -itd --name cpu512 --cpu-shares 512 centos:stress stress -c 10     
//容器产生10个子函数进程
docker exec -it dfhgjfv4541 bash   
//进入容器使用top查看cpu使用情况
【4】再开启一个容器比较两个容器的%cpu,比例是1:2
docker run -itd --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10
docker exec -it 4511s1fdfsxs bash
top

三、cpu周期限制

docker提供了–cpu-period、–cpu-quota两个参数控制容器可以分配到的CPU时钟周期。–cpu-period是用来指定容器对CPU的使用要在多长时间内做一次重新分配,而–cpu-quota是用来指定在这个周期内,最多可以有多少时间用来跑这个容器。跟–cpu-shares不同的是这种配置是指定一个绝对值,而且没有弹性在里面,容器对CPU资源的使用绝对不会超过配置的值。cpu-period和cpu-quota的单位为微秒(μs)。cpu-period的最小值为1000微秒,最大值为1秒(10^6 μs),默认值为0.1秒(100000 μs)。cpu-quota的值默认为-1,表示不做控制。
举个例子,如果容器进程需要每1秒使用单个CPU的0.2秒时间,可以将cpu-period设置为1000000(即1秒),cpu-quota设置为200000(0.2秒)。当然,在多核情况下,如果允许容器进程需要完全占用两个CPU,则可以将cpu-period设置为100000(即0.1秒),cpu-quota设置为200000(0.2秒)。

docker run -itd --cpu-period 100000 --cpu-quota 200000 centos:stress
docker exec -it fjdfnfj451213 bash
cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
100000
cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
200000

四、cpu内核参数

对多核CPU的服务器,docker还可以控制容器运行限定使用哪些cpu内核和内存节点,即使用–cpuset-cpus和–cpuset-mems参数。对具有NUMA拓扑(具有多CPU、多内存节点)的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。如果服务器只有一个内存节点,则–cpuset-mems的配置基本上不会有明显效果。

docker run -itd --name cpu1 --cpuset-cpus 0-1 centos:stress

执行以上命令需要宿主机为双核,表示创建的容器只能用0,1两个内核。最终生成的cgroup的cpu内核配置如下:

docker exec -it dfjd4521 bash
cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-1

通过下面指令可以看到容器中进程与cpu内核的绑定关系,达到绑定cpu内核的目的。

docker exec 64212sfnjd taskset -c -p 1   
//容器内部第一个进程号pid为1被绑定到指定cpu上运行

五、cpu配额控制参数的混合使用

通过cpuset-cpus、cpuset-mems参数只在多核,多内存节点上的服务器上有效,并且必须与实际的物理配置匹配,否则也无法达到资源控制的目的在系统具有多个cpu内核的情况下,需要通过cpuset-cpus参数设置容器cpu内核才能方便的进行测试。
//宿主系统修改4核心cpu

docker run -itd --name cpu3 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1
docker exec -it dfhjgf545112 bash
top     //按1查看每个核心的占用

docker run -itd --name cpu4 --cpuset--cpus 3 --cpu-shares 1024 centos:stress stress -c 1
docker exec -it fdjfjdbvf4512 bash
top

上面的centos:stress镜像安装了stress工具,用来测试cpu和内存的负载。通过在两个容器上分别执行stress -c 1命令将会给系统一个随机负载,产生1个进程这个进程都反复不停的计算有rand()产生随机数的平方根,直到资源耗尽。观察到宿主机上的cpu使用率,第三个内核的使用率接近100%,并且一批进程的cpu使用率明显存在2:1的使用比例的对比。

六、docker容器的内存配置

和CPU控制一样,docker也提供了若干参数来控制容器的内存使用配额,可以控制容器的swap大小、可用内存大小等各种内存方面的控制。默认情况下,容器可以使用主机上的所有空闲内存。主要有以下参数:
memory-swappiness:
控制进程将物理内存交换到swap分区的倾向,默认系数为60。系数越小,就越倾向于使用物理内存。值范围为0-100。当值为100时,表示尽量使用swap分区;当值为0时,表示禁用容器 swap 功能(这点不同于宿主机,宿主机 swappiness 设置为 0 也不保证 swap 不会被使用)。

–kernel-memory:
内核内存,不会被交换到swap上。一般情况下,不建议修改,可以直接参考docker的官方文档。

–memory:
设置容器使用的最大内存上限。默认单位为byte,可以使用K、G、M等带单位的字符串。

–memory-reservation:
启用弹性的内存共享,当宿主机资源充足时,允许容器尽量多地使用内存,当检测到内存竞争或者低内存时,强制将容器的内存降低
到memory-reservation所指定的内存大小。按照官方说法,不设置此选项时,有可能出现某些容器长时间占用大量内存,导致性能上的损失。

–memory-swap:
等于内存和swap分区大小的总和,设置为-1时,表示swap分区的大小是无限的。默认单位为byte,可以使用K、G、M等带单位的字符串。如果–memory-swap的设置值小于–memory的值,则使用默认值,为–memory-swap值的两倍。

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
--vm 1:启动1个内存工作线程
--vm-bytes 280M:每个线程分配280M内存

如果让工作线程分配的内存超过300M,分配的内存超过限额,stress线程会报错,容器会退出

docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 310M

七、block i/o的限制

默认情况下,所有容器能平等的读写磁盘,可以设置–blkio-weight参数来改变容器block io的优先级。–blkio-weight与–cpu-shares类似,设置的是相对权重值,默认为500。在下面的例子中,容器A读写磁盘的带宽是容器B的两倍。

docker run -it --name container_A --blkio-weight 600 centos:stress
cat /sys/fs/cgroup/blkio/blkio.weight
600

docker run -it --name container_B --blkio-weight 300 centos:stress
cat /sys/fs/cgroup/blkio/blkio.weight
300

八、bps和iops的限制

bps是byte per second,每秒读写的数据量
iops是io per second,每秒io的次数
可通过一下参数控制容器的bps和iops:
–device-read-bps,限制读某个设备的bps
–device-write-bps,限制写某个设备的bps
–device-read-iops,限制读某个设备的iops
–device-write-iops,限制写某个设备的iops

限制容器写/dev/sda的速率为5M/s

docker run -it --device-write-bps /dev/sda:5M centos:stress

在容器里面

dd if=/dev/zero of=test bs=1M count=1024 oflag=direct   

//可以按照Ctrl+c中断查看,会很慢传输不限速

docker run -it centos:stress
dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值