一、Cgroup介绍
Cgroup 是 Control Groups 的缩写,是Linux 内核提供的一种可以限制、记录、隔离进程组所使用的物理资源(如 CPU、内存、磁盘 IO 等等)的机制,被 LXC、docker 等很多项目用于实现进程资源控制。

Cgroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理是通过该功能来实现的。

1 Cgroup 子系统
●blkio:设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及 usb 等等。
●CPU:使用调度程序为 cgroup 任务提供 CPU 的访问。
●cpuacct:产生 cgroup 任务的 CPU 资源报告。
●cpuset:如果是多核心的 CPU,这个子系统会为 cgroup 任务分配单独的 CPU 和 内存。
●devices:允许或拒绝 cgroup 任务对设备的访问。
●freezer:暂停和恢复 cgroup 任务。
●memory:设置每个 cgroup 的内存限制以及产生内存资源报告。
●net_cls:标记每个网络包以供 cgroup 方便使用。
●ns:命名空间子系统。
●perf_event:增加了对每个 group 的监测跟踪的能力,可以监测属于某个特定的 group 的所有线程以及运行在特定CPU上的线程。

二、测试 CPU 和内存使用状况
2.1 stress 压力测试工具测试
■使用 Dockerfile 来创建一个基于 Centos 的 stress 工具镜像。

[root@localhost ~]# mkdir /opt/stress
[root@localhost ~]# vim /opt/stress/Dockerfile
FROM centos:7
MAINTAINER cuiwangfeng
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[root@localhost ~]# cd /opt/stress/
[root@localhost stress]# docker build -t centos:stress .
[root@localhost stress]# docker run -itd --cpu-shares 100 centos:stress
//–cpu-shares 参数值不能保证可以获得 1 个 vcpu 或 者多少 GHz 的 CPU 资源,它仅是一个弹性的加权值

注:
■默认情况下,每个 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分配和容器中进程运行情况。

2.2 通过 cpu share 可以设置容器使用 CPU 的优先级,比如启动了两个容器及运行查看 CPU 使用百分比

[root@localhost stress]# docker run -tid --name cpu512 --cpu-shares 512 centos:stress stress -c 10
//容器产生10个子函数进程
[root@localhost stress]# docker exec -it f4953c0d7e76 bash //进入容器使用top查看cpu使用情况
[root@localhost stress]# docker run -tid --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10
//再开启一个容器做比较
[root@localhost stress]# docker exec -it 5590c57d27b0 bash  //进容器使用top对比两个容器的%CPU,比例是1:2

三、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, 表示不做控制。cpu-period 和 cpu-quota 参数一般联合使用。

例:
■容器进程需要每 1 秒使用单个 CPU 的 0.2 秒时间,可以将 cpu-period 设置 为 1000000(即 1 秒),cpu-quota 设置为 200000(0.2 秒)。
■在多核情况下,如果允许容器进程完全占用两个 CPU,则可以将 cpu-period 设置为 100000(即 0.1 秒), cpu-quota 设置为 200000(0.2 秒)。

[root@localhost stress]# docker run -tid --cpu-period 100000 --cpu-quota 200000 centos:stress
[root@localhost stress]# docker exec -it 98d2aaa50019 bash
[root@98d2aaa50019 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
100000
[root@98d2aaa50019 /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
200000

四、CPU Core 控制
■对多核 CPU 的服务器,Docker 还可以控制容器运行使用哪些 CPU 内核,即使用–cpuset-cpus 参数。这对具有多 CPU 的服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。

[root@localhost stress]# docker run -tid --name cpu1 --cpuset-cpus 0-1 centos:stress
'//执行以上命令需要宿主机为双核,表示创建的容器只能用 0、1两个内核。最终生成 的 cgroup 的 CPU 内核配置如下'
[root@localhost stress]# docker exec -it 631eea630b21 bash
[root@631eea630b21 /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-1
[root@localhost stress]# docker exec 631eea630b21 taskset -c -p 1
'//容器内部第一个进程号pid为1被绑定到指定CPU上运行'
pid 1's current affinity list: 0,1

五、CPU 配额控制参数的混合使用
■通过 cpuset-cpus 参数指定容器 A 使用 CPU 内核 0,容器 B 只是用 CPU 内核 1。在主机上只有这两个容器使用对应 CPU 内核的情况,它们各自占用全部的内核资源,cpu-shares 没有明显效果。

■cpuset-cpus、cpuset-mems 参数只在多核、多内存节点上的服务器上有效,并且必须与实际的物理配置匹配,否则也无法达到资源控制的目的。

■在系统具有多个 CPU 内核的情况下,需要通过 cpuset-cpus 参数为设置容器 CPU 内核才能方便地进行测试。

'//宿主系统修改为4核心CPU'
[root@localhost stress]# docker run -tid --name cpu3 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1
[root@localhost stress]# docker exec -it 84598dfadd34 bash
[root@localhost stress]# exit
[root@localhost stress]# docker run -tid --name cpu4 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1
[root@localhost stress]# top
'//记住按1查看每个核心的占用'
Tasks: 172 total,   2 running, 170 sleeping,   0 stopped,   0 zombie
%Cpu0  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu1  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu2  :  0.0 us,  0.0 sy,  0.0 ni,100.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
%Cpu3  :100.0 us,  0.0 sy,  0.0 ni,  0.0 id,  0.0 wa,  0.0 hi,  0.0 si,  0.0 st
KiB Mem :  7994072 total,  6394056 free,   450124 used,  1149892 buff/cache
KiB Swap:  4194300 total,  4194300 free,        0 used.  7174064 avail Mem
[root@localhost stress]# docker exec -it 0eed2c8a20df bash
'总结:上面的 centos:stress 镜像安装了 stress 工具,用来测试 CPU 和内存的负载。通过 在两个容器上分别执行 stress -c 1 命令,将会给系统一个随机负载,产生 1 个进程。这 个进程都反复不停的计算由 rand() 产生随机数的平方根,直到资源耗尽。 观察到宿主机上的 CPU 使用率,第三个内核的使用率接近 100%, 并且一批进程的 CPU 使用率明显存在 2:1 的使用比例的对比。'

六、内存限额
■与操作系统类似,容器可使用的内存包括两部分:物理内存和 Swap。
Docker 通过下面两组参数来控制容器内存的使用量。
●-m 或 --memory:设置内存的使用限额,例如 100M、1024M。
●–memory-swap:设置 内存+swap 的使用限额。
‘允许该容器最多使用 200M 的内存和 300M 的 swap’

[root@localhost stress]# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 280M
'--vm 1:启动 1 个内存工作线程 '
'--vm-bytes 280M:每个线程分配 280M 内存'
'默认情况下,容器可以使用主机上的所有空闲内存。与 CPU 的 cgroups 配置类似, Docker 会自动为容器在目录 /sys/fs/cgroup/memory/docker/<容器的完整长 ID>中创建相应 cgroup 配置文件'
[root@localhost stress]# docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 310M
'如果让工作线程分配的内存超过 300M,分配的内存超过限额,stress 线程报错,容器 退出。'

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

[root@localhost docker]# docker run -it --name container_A --blkio-weight 600 centos:stress
[root@bbb0a299c8fd /]# cat /sys/fs/cgroup/blkio/blkio.weight
600
[root@localhost docker]# docker run -it --name container_B --blkio-weight 300 centos:stress
[root@9f5062a35cec /]# 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。

[root@localhost docker]# docker run -it --device-write-bps /dev/sda:5MB centos:stress
'//限制容器写 /dev/sda 的速率为 5 MB/s'
[root@96a5d7c68b96 /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct   //可以按ctrl+c中断查看
906+0 records in
906+0 records out
950009856 bytes (950 MB) copied, 181.202 s, 5.2 MB/s
'通过 dd 命令测试在容器中写磁盘的速度。因为容器的文件系统是在 host /dev/sda 上 的,在容器中写文件相当于对 host /dev/sda 进行写操作。另外,oflag=direct 指定用 direct IO 方式写文件,这样 --device-write-bps 才能生效。''结果表明限速 5MB/s 左右。作为对比测试,如果不限速,结果如下。'
[root@localhost docker]# docker run -it centos:stress
[root@10531445df8d /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB) copied, 0.928611 s, 1.2 GB/s

Cgroup资源配置方法详细解析相关推荐

  1. 修改mysql数据库默认字符集_MySQL数据库之修改mysql默认字符集的两种方法详细解析...

    本文主要向大家介绍了MySQL数据库之修改mysql默认字符集的两种方法详细解析 ,通过具体的内容向大家展现,希望对大家学习MySQL数据库有所帮助. (1) 最简单的修改方法,就是修改mysql的m ...

  2. 方舟手游服务器能修改密码吗,明日方舟怎么改密码_明日方舟改密码方法详细解析一览[多图]...

    明日方舟是一款末日策略生存类手游,在游戏中想要赢得胜利是需要考验大家的思考能力的.很多小伙伴最近都在询问要怎么在游戏中修改密码,虽然说明日方舟暂时还没有开放该名功能,但是修改密码还是可以的.接下来要给 ...

  3. java常见log日志的使用方法详细解析

    目录 前言 1. Java.util.Logger 2. org.apache.logging.log4j 2.1 xml配置文件 3. org.slf4j.Logger 前言 log日志可以debu ...

  4. js parseInt() 方法详细解析

    一.先来一个介绍parseInt(string,radix),parseInt() 函数可解析一个字符串,并返回一个整数.(W3C复制的) string 必需.要被解析的字符串. radix 可选.表 ...

  5. velocity显示List与Map的方法详细解析

    http://www.jb51.net/article/40899.htm 一.遍历个map类型 1.先看后台java程序 Java代码 复制代码 代码如下:     Map<String,St ...

  6. Linux效劳器的零碎内存监控方法详细解析-2

    三.使甩vmstat饬令监视虚拟内存哄骗环境   vmstat是Virtual Meomory Statistics(虚拟内存统计)的缩写,可对操作零碎的虚拟内存.历程.CPU举止中止监视.它是对零碎 ...

  7. 防盗链技术及破解方法详细解析

    盗链的定义 此内容不在自己服务器上,而通过技术手段,绕过别人放广告有利益的最终页,直接在自己的有广告有利益的页面上向最终用户提供此内容. 常常是一些名不见经传的小网站来盗取一些有实力的大网站的地址(比 ...

  8. finalize java,Java中Object对象finalize方法详细解析

    简书:capo 转载请注明原创出处,谢谢! 前言: 今天我们来看看Object中一个经常被人遗忘的方法,finalize方法.老规矩,我们先看看Javadoc是怎样描述这个方法的 /** * Call ...

  9. Docker通过Cgroup 资源配置

    目录 一.Cgroup资源配置方法 二.使用stress工具测试CPU 和内存 1.权重 --cpu-shares 2.CPU周期限制 --cpu-period. --cpu-quota 3.CPU ...

  10. Docker Cgroup资源配置(CPU、内存、磁盘)

    一.Cgroup 资源配置方法 Docker 通过 Cgroup 来控制容器使用的资源配额,包括 CPU.内存.磁盘三大方面,基本覆盖了常见的资源配额和使用量控制. Cgroup 是 Control ...

最新文章

  1. STL容器迭代过程中删除元素技巧
  2. Spring教程--AOP简介
  3. SpringBoot启动如何加载application.yml配置文件
  4. BZOJ #3166. [Heoi2013]Alo(可持久化trie树+set)
  5. Leetcode 219. 存在重复元素 II
  6. IT行业学习网站汇总
  7. C#中关于updatePanel与freeTextBox不兼容的问题 当页面刷子新后,ftb不能输入内容的解决办法
  8. oracle shutdown 默认,oracle shutdown 没有反应
  9. 知名厂商设备图标库大全
  10. 记事本写小程序C语言,抖音上用记事本编写爱心小程序教程
  11. java根据公历获得农历1921年到2050年
  12. 微信开放平台申请方法与用途
  13. win7计算机u盘不显示盘符,win7系统识别U盘但不显示盘符该如何解决?
  14. HTTP协议入门 状态码大全
  15. 开发工具与关键技术: 使用HTML 徽章 CSS3 动画 JQUERY 动态切换 JS自动切换
  16. 高斯判别分析GDA的简单python实现
  17. Centos7运行Docker1.13.1报错Loaded: loaded (/usr/lib/systemd/system/docker.service; disabled; vendor pres
  18. 演讲比赛流程管理系统C++
  19. 开心一刻 程序--内行话
  20. Elasticsearch搜索引擎第十篇-Query DSL详解

热门文章

  1. ios9版本的iphone,不执行网页js
  2. ​越狱iOS必备神器Flex使用指南-屏蔽越狱检测的破解利器
  3. 红米note 4x Android 8,红米note 4X升级安卓7.0:小米MIUI8第331周公测
  4. 学c++要不要先学C语言?
  5. ie浏览器升级的正确姿势
  6. Unity资源加载以及释放
  7. 用于登录的mysql语句_mysql常用语句
  8. word任意带圈数字
  9. 达梦数据库/DM7迁移之导出sql脚本
  10. mac 终端 常用命令