【云原生】docker-Cgroup资源限制

news/2024/11/28 5:35:35/

Docker容器的资源控制

Docker通过Cgroup 来控制容器使用的资源配额,包括CPU、内存、磁盘三大方面,基本覆盖了常见的资源配额和使用量控制。Caroup 是ControlGroups的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 cpu、内存、磁盘,io等等)的机制,被LXC、docker等很多项目用于实现进程资源控制。Cgroup本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O或内存的分配控制等具体的资源管理是通过该功能来实现的。

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

 

docker占用宿主机cpu的限制

 Linux通过CFS (Completely Fair Scheduler,完全公平调度器)来调度各个进程对ceu的使用。CFS默认的调度周期是100ms 。我们可以设置每个容器进程的调度周期,以及在这个周期内各个容器最多能使用多少CPU时间。

 使用--cpu-period 即可设置调度周期,使用--cpu-quota即可设置在每个周期内容器能使用的CPU时间。两者可以配合使用。CFS周期的有效范围是 1ms~1s,对应的--cpu-period 的数值范围是1000~1000000。而容器的CPU配额必须不小于1ms,即--cpu-quota的值必须>= 1000。而容器的CPU配额必须不小于1ms,即--cpu-quota的值必须>= 1000。

 

 

#正常创建容器(此时容器遵循默认的占用cpu资源规则)
[root@localhost ~]#docker run -id --name c1 centos:7[root@localhost ~]#docker ps -a[root@localhost ~]#docker exec -it c1 bash[root@d6da0a6b999a /]# vi cpu.sh#!/bin/bash
i=0
while true
do
let i++
done[root@d6da0a6b999a /]# chmod +x cpu.sh [root@d6da0a6b999a /]# ./cpu.sh 

 由该结果可以看出,如果在创建容器时不限制它cpu使用的限制,是非常危险的一件事,一旦某个容器的程序异常陷入死循环,将直接导致其他容器中业务的中断 !

 (2)修改默认的容器时间分片上限规则,再次创建启动测试

docker start c1
docker ps -a
#d6da0a6b999aeaac89e2ce883b6ff057abd5f4c2319d9a539635ff8e1f43fe04为容器id
cd/sys/fs/cgroup/cpu/docker/d6da0a6b999aeaac89e2ce883b6ff057abd5f4c2319d9a539635ff8e1f43fe04[root@localhost d6da0a6b999aeaac89e2ce883b6ff057abd5f4c2319d9a539635ff8e1f43fe04]#echo 50000 > cpu.cfs_quota_us 

 

 

 (3)创建容器时指定容器的cpu资源占用量上限 

docker run -id --name c2 --cpu-quota 30000 centos:7
[root@localhost docker]#docker exec -it c2 bash
[root@10cfa036ff07 /]# vim cpu.sh
#!/bin/bash
i=0
while true
do
let i++
done
[root@10cfa036ff07 /]# vi cpu.sh
[root@10cfa036ff07 /]# chmod +x cpu.sh 
[root@10cfa036ff07 /]# ./cpu.sh 

 

 (4)多cpu分配容器的使用上限

[root@localhost docker]#docker run -id --name c3 centos:7[root@localhost docker]#docker ps -a[root@localhost docker]#cd /sys/fs/cgroup/cpu/docker/a1ce6948cdb6167570e6ef2101bb407d7de79407fbd9b9ac737ed40487f91a5a/
[root@localhost a1ce6948cdb6167570e6ef2101bb407d7de79407fbd9b9ac737ed40487f91a5a]#ls[root@localhost a1ce6948cdb6167570e6ef2101bb407d7de79407fbd9b9ac737ed40487f91a5a]#echo 200000 >  cpu.cfs_quota_us 

 

[root@localhost ~]#docker exec -it c3 bash
[root@a1ce6948cdb6 /]# vi cpu.bash
#!/bin/bash
i=0
while true
do
let i++
done
[root@a1ce6948cdb6 /]# chmod +x ./cpu.bash 
[root@a1ce6948cdb6 /]# ./cpu.bash 

 

 设置cpu资源的占用比 

注意:该方式需要设置多个容器时才会生效 

 创建容器时可以使用选项  --cpu-shares  数值(该数值要为1024的倍数,1024代表一份,当个容器占用cpu的份额由自身分配的份数除于所有容器占用cpu的份数,就为该容器所占用cpu资源的百分比)

进行分配

[root@localhost ~]#docker run -id --name b1 --cpu-shares 2048 centos:7[root@localhost ~]#docker run -id --name b2 --cpu-shares 1024 centos:7[root@localhost ~]#docker run -id --name b3 --cpu-shares 1024 centos:7

 开启三个终端,启动容器压测:

#三个容器均为以下压测操作
#下载压测工具依赖环境
yum install -y epel-release
#下载压测工具
yum install -y stress
#进行四个线程压测
stress -c 4#再开启一个终端查看测试结果
docker stats

 

 

由测试结果, 可以看到在cPU进行时间片分配的时候,容器b1比容器b2和b3多一倍的机会获得cpu的时间片。但分配的结果取决于当时主机和其他容器的运行状态,实际上也无法保证容器 b2和b3一定能获得cpu时间片

比如容器b2和b3的进程一直是空闲的,那么容器b1是可以获取比容器b2和b3更多的cpu时间片的。极端情况下,例如主机上只运行了一个容器,即使它的cpu份额只有50,它也可以独占整个主机的cpu资源。

 Cgroups 只在容器分配的资源紧缺时,即在需要对容器使用的资源进行限制时,才会生效。因此,无法单纯根据某个容器的cpu 份额来确定有多少cpu资源分配给它,资源分配结果取决于同时运行的其他容器的CPU分配和容器中进程运行情况。

 设置容器绑定指定的cpu 

top   
按数字“1”

 进行绑核创建容器 

[root@localhost ~]#docker run -id --name b4 --cpuset-cpus 2 centos:7

 压力测试:

yum install -y epel-release
yum insatll -y stressstress -c 1

  测试结果:

 内存使用的限制

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

m (或--memory=)选项用于限制容器可以使用的最大内存 

docker run -itd --name d1 -m 512m centos:7 /bin/bash
docker  stats

 

 限制容器可用的swap 大小 


 #限制可用的swap 大小,--memory-swap  

●强调一下, --memory-swap是必须要与 --memory(或-m)一起使用的。

●正常情况下, --memory-swap 的值包含容器可用内存和可用swap 。

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

 #--memory-swap 的值包含容器可用内存和可用swap,减去-m的值才是可用swap的值。#表示容器可以使用512M的物理内存,并且可以使用512M的swap。因为1g减去512m的物理内存,剩余值才是可用swap。docker run -itd --name d2 -m 512m --memory-swap=1g centos:7 bash​​#--memoryswap值和 -m 的值相同,表示容器无法使用swapdocker run -itd --name d3 -m 512m --memory-swap=512m centos:7 bash​​# --memory-swap 的值设置为0或者不设置,则容器可以使用的 swap 大小为 -m 值的两倍。docker run -itd --name d4 -m 512m centos:7 bash​​# --memory-swap 值为 -1,它表示容器程序使用的内存受限,但可以使用的swap空间使用不受限制(宿主机有多少swap 容器就可以使用多少)。docker run -itd --name d5 -m 512m --memory-swap=-1 centos:7 bash

对磁盘IO的配置控制(blkio)的限制 

-device-read-bps:限制某个设备上的读速度bps ( 数据量),单位可以是kb、mb (M)或者gb。

--device-write-bps : 限制某个设备上的写速度bps ( 数据量),单位可以是kb、mb (M)或者gb。

该速度是指每秒钟进行读写操作1M,1G或者是1kb 

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

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

默认情况下容器的写速度 

[root@localhost ~]#docker run -id --name e1  centos:7
[root@localhost ~]#docker exec -it e1 bash
[root@8657384cb483 /]# dd if=/dev/zero  of=/opt/test.txt bs=10M count=5 oflag=direct
## oflag=direct 规避文件读写系统中所带来的缓存,避免影响测试结果

 进行写速度限制的容器创建 

 
[root@localhost ~]#docker run -it --name e3 --device-write-bps /dev/sda:1M centos:7 /bin/bash
[root@6c1b8bcf6b44 /]# dd if=/dev/zero of=/opt/test.out bs=10M count=5 oflag=direct

 总结

 对cpu的限制参数

 docker run --cpu-period     #设置调度周期时间1000~1000000--cpu-quota      #设置容器进程的CPU占用时间,要与调度周期时间成比例--cpu-shares    #设置多个容器之间的CPU资源占用比--cpuset-cpus   #绑核(第一个CPU编号从0开始)

对内存的限制

 -m 物理内存 [--memory-swap=总值]

对磁盘IO的限制

 --device-read-bps 设备文件:1mb/1M     #限制读速度--device-write-bps 设备文件:1mb/1M    #限制写速度--device-read-iops                   #限制读次数--device-write-iops                  #限制写次数​docker system prune -a    #清理磁盘,删除关闭的容器、无用的数据卷和网络。


http://www.ppmy.cn/news/239780.html

相关文章

Yolov3 模型构建和深入掌握快速搭建网络的搭积木方法

(一)设计Conv2dBatchLeaky 1、了解LeakyReLU激活函数 LeakyReLU 激活层,创建一个可调用对象以计算输入 x 的 LeakReLU 。其中,x为输入的 Tensor 感觉和飞桨的api有点相同,可以对照参考理解: LeakyReLU激活…

Easeui 02 tree组件.

1.添加tree组件. tree组件的位置:DataGrid and Tree(表格和树) → tree(树); 复制 tree组件到 "菜单管理"的div里面,如: 这里要动态绑定数据,所以把死数据删除,只留下一个 ul,如&am…

围棋知名AI-KataGo 下载分享

下载地址 下载链接: 围棋 提取码: 2hvp 里面有详情 这个AI 是很知名的围棋AI,并且是开源的 喜欢围棋的就去看看吧

Linux下的围棋软件,在Linux下和电脑下围棋

这几天笔记本C盘硬盘坏了,进不了Windows了,也就没法上弈城或TOM之类的对弈平台了,硬盘要过几天才能换新的,这几天就只能进Fedora core6了,由于里面一直没有装有关围棋的软件,这次趁这个机会就找了一个可以打…

围棋AI安装与测试

2016年,Alphago横跨出世,4比1战胜李世石,正式标志围棋AI战胜人类顶尖棋手(此前围棋最强的软件大致是zen和疯石,有业余强五的水平)。而后Deepmind又推出了Alphago升级版master,对人类顶尖高手达成60连胜&…

功能日臻完善的围棋打谱软件(附源代码)

功能日臻完善的围棋打谱软件(附源代码) 在3月份的时候,围棋打谱软件更新过一版,详见没有退缩的理由(每前进一步都很艰难,但很快乐)一文。到目前为止,软件的功能大为改善。不仅解决了打劫问题,还增加了悔棋、回放、研究等多项功能,并采用此软件操作,在B站发表了几个…

围棋AI kataGo下载

文章目录 一、下载地址二、安装步骤1.安装Java环境2.下载相关资源包3.运行软件4.设置参数 一、下载地址 Github开源项目:https://github.com/lightvector/KataGo 网盘链接:点击跳转 提取码:2hvp 二、安装步骤 1.安装Java环境 该软件是用…

基于java的围棋游戏设计

围棋游戏能实现联机对战,和单机版游戏对战。用Eclipse开发Java程序的相关技术,主要运用了GUI(用户图形界面)API(应用程序借口)来实现,此程序没有用到图片的引用,棋盘和棋子的设计完全是应用函数绘制,再加入复选框,按钮&#xff0c…