目录

  • 一、CGroup 介绍
  • 二、基于Dockerfile创建安装stress镜像
  • 三、创建容器的CPU权重控制
  • 四:cpu周期限制
  • 五:cpu core控制
  • 六、cpu配额控制参数的混合使用
  • 七、内存限制
  • 八、Block IO的限制
  • 九、bps和iops 的限制

一、CGroup 介绍

CGroup 是 Control Groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组 (process groups) 所使用的物力资源 (如 cpu memory i/o 等等) 的机制。2007 年进入 Linux 2.6.24 内核,CGroups 不是全新创造的,它将进程管理从 cpuset 中剥离出来,作者是 Google 的 Paul Menage。CGroups 也是 LXC 为实现虚拟化所使用的资源管理手段。

CGroup 功能及组成

CGroup 是将任意进程进行分组化管理的 Linux 内核功能。CGroup 本身是提供将进程进行分组化管理的功能和接口的基础结构,I/O 或内存的分配控制等具体的资源管理功能是通过这个功能来实现的。这些具体的资源管理功能称为 CGroup 子系统或控制器。CGroup 子系统有控制内存的 Memory 控制器、控制进程调度的 CPU 控制器等。运行中的内核可以使用的 Cgroup 子系统由/proc/cgroup 来确认。

CGroup 提供了一个 CGroup 虚拟文件系统,作为进行分组管理和各子系统设置的用户接口。要使用 CGroup,必须挂载 CGroup 文件系统。这时通过挂载选项指定使用哪个子系统。

文件名 R/W 用途
Release_agent RW 删除分组时执行的命令,这个文件只存在于根分组
Notify_on_release RW 设置是否执行 release_agent。为 1 时执行
Tasks RW 属于分组的线程 TID 列表
Cgroup.procs R 属于分组的进程 PID 列表。仅包括多线程进程的线程 leader 的 TID,这点与 tasks 不同
Cgroup.event_control Cgroup.event_control 监视状态变化和分组删除事件的配置文件

CGroup 相关概念解释

  • 任务(task)。在 cgroups 中,任务就是系统的一个进程;
  • 控制族群(control group)。控制族群就是一组按照某种标准划分的进程。Cgroups
    中的资源控制都是以控制族群为单位实现。一个进程可以加入到某个控制族群,也从一个进程组迁移到另一个控制族群。一个进程组的进程可以使用
    cgroups 以控制族群为单位分配的资源,同时受到 cgroups 以控制族群为单位设定的限制;
  • 层级(hierarchy)。控制族群可以组织成 hierarchical
    的形式,既一颗控制族群树。控制族群树上的子节点控制族群是父节点控制族群的孩子,继承父控制族群的特定的属性;
  • 子系统(subsystem)。一个子系统就是一个资源控制器,比如 cpu 子系统就是控制 cpu
    时间分配的一个控制器。子系统必须附加(attach)到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都受到这个子系统的控制。
    相互关系
  • 每次在系统中创建新层级时,该系统中的所有任务都是那个层级的默认 cgroup(我们称之为 root cgroup,此 cgroup
    在创建层级时自动创建,后面在该层级中创建的 cgroup 都是此 cgroup 的后代)的初始成员;
  • 一个子系统最多只能附加到一个层级;
  • 一个层级可以附加多个子系统;
  • 一个任务可以是多个 cgroup 的成员,但是这些 cgroup 必须在不同的层级;
  • 系统中的进程(任务)创建子进程(任务)时,该子任务自动成为其父进程所在 cgroup 的成员。然后可根据需要将该子任务移动到不同的
    cgroup 中,但开始时它总是继承其父任务的 cgroup。
[root@localhost ~]# cat /proc/cgroups
#subsys_name    hierarchy   num_cgroups enabled
cpuset  5   1   1
cpu 8   88  1
cpuacct 8   88  1
memory  9   88  1
devices 11  88  1
freezer 10  1   1
net_cls 7   1   1
blkio   2   88  1
perf_event  6   1   1
hugetlb 3   1   1
pids    4   1   1
net_prio    7   1   1cpuset:如果是多核心的CPU, 这个子系统会为cgroup 任务分配单独的CPU和内存。
CPU:使用调度程序为cgroup任务提供CPU的访问。
cpuacct:产生cgroup, 任务的CPU资源报告
memory: 设置每个cgroup 的内存限制以及产生内存资源报告。
devices:允许或拒绝cgroup任务对设备的访问。
freezer:暂停和恢复cgroup任务。
net_cls: 标记每个网络包以供cgroup 方便使用。
blkio:设置限制每个块设备的输入输出控制。例如:磁盘,光盘以及usb 等等。
ns:命名空间子系统。
perf_event: 增加了对每个group 的监测跟踪的能力,可以监测属于某个特定的group 的所有线程以及运行在特定CPU上的线程。

二、基于Dockerfile创建安装stress镜像

stress是用来测试cpu内存的负载,通过在两个容器分别执行stress -c 1,这将会给系统一个随机负载,产生一个进程,这个进程会反复不停地计算由rand()产生地随机数的平方根,直到资源耗尽。

首先使用Dockerfile创建一个基于centos的stress的工具镜像

[root@localhost ~]# mkdir /opt/stress
[root@localhost ~]# cd /opt/stress/
[root@localhost stress]# vi DockerfileFROM centos:7
MAINTAINER chen "cjf@tom.com"
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

新建镜像

docker build -t centos:stress .

三、创建容器的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
    share参数可以设置容器使用cpu的优先级,比如启动了两个容器及运行查看cpu的cpu的使用百分比
    创建两个容器,分别制定不同的权重比
// --cpu-shares 指定使用cpu的权重
// stress -c 指定产生子进程的个数
[root@localhost stress]# docker run -itd --name cpu512 --cpu-shares 512 centos:stress stress -c 10
[root@localhost stress]# docker run -itd --name cpu1024 --cpu-shares 1024 centos:stress stress -c 10
docker ps -a    #查看容器
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                      PORTS               NAMES
fc27cfb6dbcc        centos:stress       "stress -c 10"           6 seconds ago       Up 5 seconds                                    cpu1024
4c261d0f2ffc        centos:stress       "stress -c 10"           55 seconds ago      Up 54 seconds                                   cpu512
##进入容器使用top命令查看cpu的使用率
[root@localhost stress]# docker exec -it cpu512 bash
[root@4c261d0f2ffc /]# top


对比cpu

[root@localhost stress]# docker exec -it cpu1024 bash
[root@4c261d0f2ffc /]# top


分别进入cpu512和cpu1024之后可以看到,%cpu的比例差不多是1:2,符合我们设置的–cpu-shares参数。

四:cpu周期限制

Docker提供了 --cpu-period、–cpu-quota两个参数控制容器可以分配到cpu的时钟周期。

# --cpu-period是用来指定容器对于cpu的使用要在多长时间内重新分配一次
# --cpu-quota是用来指定在这个周期内,最多可以有多少时间跑这个容器,
# 与--cpu-shares(权重)不同的是,这种配置指定一个绝对值,容器对cpu资源使用绝对不会超过配置的值。
  • cpu-peiod和cpu-quota参数一般联合使用。 例如:容器进程需要每一秒钟使用单个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 -itd --cpu-period 10000 --cpu-quota 200000 centos:stress
8805019e262d7d6b6aa3cd5a8b8824ab8520b89b7acd44e5c10520b2c4660649
[root@localhost stress]# docker ps -a
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                       PORTS               NAMES
8805019e262d        centos:stress       "/bin/bash"              12 seconds ago      Up 12 seconds                                    great_bohr

进入容器查看cgroup参数

[root@localhost stress]# docker exec -it 8805019e262d bash
[root@8805019e262d /]# cat /sys/fs/cgroup/cpu/cpu.cfs_period_us
10000
[root@8805019e262d /]# cat /sys/fs/cgroup/cpu/cpu.cfs_quota_us
200000
[root@8805019e262d /]# 

五:cpu core控制

对于多核cpu的服务器,docker还可以控制容器运行使用那些cpu内核,以及使用–cpuset-cpus参数,这对于具有多cpu服务器尤其有用,可以对需要高性能计算的容器进行性能最优的配置。

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

[root@localhost stress]# docker run -itd --name cpu1 --cpuset-cpus 0-1 centos:stress
5749cbeadd49f18b89801079da54fe350756b44469dfe467d17756dc8c12810d
[root@localhost stress]# docker ps -a
CONTAINER ID        IMAGE               COMMAND             CREATED             STATUS              PORTS               NAMES
5749cbeadd49        centos:stress       "/bin/bash"         10 seconds ago      Up 9 seconds                            cpu1
进入查看
[root@localhost stress]# docker exec -it cpu1 bash
[root@5749cbeadd49 /]# cat /sys/fs/cgroup/cpuset/cpuset.cpus
0-1
[root@5749cbeadd49 /]# exit
exit
//通过下列指令可以看到容器中进程与cpu内核的绑定关系,达到绑定cpu内核的目的
[root@localhost stress]# docker exec -it 5749cbeadd49 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核心

[root@localhost stress]# docker run -itd --name cpu2 --cpuset-cpus 1 --cpu-shares 512 centos:stress stress -c 1
[root@localhost stress]# docker run -itd --name cpu3 --cpuset-cpus 3 --cpu-shares 1024 centos:stress stress -c 1
[root@localhost stress]#docker exec -it cpu2 bash
[root@localhost stress]#top
[root@localhost stress]# docker exec -it cpu3 bash

七、内存限制

与操作系统类似,容器可使用的内存包括两部分:物理内存和swap
容器通过 -m或–memory设置内存的使用限额,例如:-m 300M;通过–memory-swap设置内存+swap的使用限额

实例如下,允许容器最多使用200M的内存和300M的swap

[root@localhost stress]#docker run -it -m 200M --memory-swap=300M progrium/stress --vm 1 --vm-bytes 250M
#--vm 1 ,代表启动一个内存工作线程
#--vm-bytes 280 M ,代表每个线程可以分配250M内存

八、Block IO的限制

默认情况下,所有容器平等地读写磁盘,可以通过设置–blkio-weight参数来改变容器block IO的优先级。

[root@bogon ~]# docker run -it --name continer_A --blkio-weight 600 centos:stress
[root@50697ac10b6c /]# cat /sys/fs/cgroup/blkio/blkio.weight
600     ##权重600
[root@50697ac10b6c /]# exit
exit
[root@bogon ~]# docker run -it --name container_B --blkio-weight 300 centos:stress
[root@8334be751f83 /]# cat /sys/fs/cgroup/blkio/blkio.weight
300     ##权重300
[root@8334be751f83 /]# 

九、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 的速率为5 MB/s

[root@bogon ~]# docker run -it --device-write-bps /dev/sda:5MB centos:stress
[root@78d0749720c1 /]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
#按ctrl+c中断查看
^C249+0 records in
249+0 records out
261095424 bytes (261 MB) copied, 49.8101 s, 5.2 MB/s[root@78d0749720c1 /]# exit
exit
[root@bogon ~]# dd if=/dev/zero of=test bs=1M count=1024 oflag=direct
#按ctrl+c中断查看
^C记录了418+1 的读入
记录了418+0 的写出
438304768字节(438 MB)已复制,1.84835 秒,237 MB/秒

Docker资源控制的Cgroup--CPU权重等--Block IO、bps和iops 的限制详细操作相关推荐

  1. 这就是你日日夜夜想要的docker!!!---------Docker资源控制--Cgroup

    文章目录 一.什么是 Cgroup? 二.使用 stress 工具测试 CPU 和内存 1.stress工具介绍 2.使用 Dockerfile 来创建一个 stress 的工具镜像: 三.实操 1. ...

  2. Docker资源控制与TLS加密通信

    文章目录 Docker资源控制 使用stress工作测试cpu和内存 cup周期限制 CPU Core 控制 cpu配额控制参数的混合使用 内存限额 IO限制 bps和iops的限制 Docker-T ...

  3. Linux资源控制-使用cgroup控制CPU和内存

    原文地址:http://www.cnblogs.com/wang_yb/p/3942208.html 主要介绍Linux下, 如果对进程的CPU和内存资源的使用情况进行控制的方法. CPU资源控制 每 ...

  4. Docker容器压力测试查看CPU权重

    #需要安装压力测试工具Stress #下载链接贴在下面 Stress安装包链接: 链接: https://pan.baidu.com/s/1ANz2WqhaehI5E-DL7cHnDw 提取码: ts ...

  5. cgroup介绍、安装和控制cpu,内存,io示例

    cgroup介绍 cgroup是control group的简称,它为Linux内核提供了一种任务聚集和划分的机制,通过一组参数集合将一些任务组织成一个或多个子系统. Cgroups是control ...

  6. docker 的资源控制和数据管理

    文章目录 一: docker 的资源控制 1.1 CPU资源控制 1.1.1 设置cpu 使用率上限 1.1.2 进行CPU 压力测试 1.1.3 设置cpu 使用时间上限 1.1.4 设置cpu 资 ...

  7. docker网络模式与资源控制

    文章目录 容器网络 Docker四种网络模式 HOST container None Bridge veth对 总结 docker自定义网络 自定义网络固定IP docker资源控制(cpu.内存.I ...

  8. Docker网络模式与资源控制管理

    网络模式与资源控制管理 docker的四种网络 docker自定义网络 Docker资源控制(cpu.内存.IO资源控制) docker的四种网络 1.host 在容器内部创建的两个容器A,B,通过d ...

  9. 【云原生】Docker网络原理及Cgroup硬件资源占用控制

    内容预知 1.dockers的网络模式 获取容器的进程号 docker网络模式的特性 1.1 host主机模式 1.2  container模式 1.3  none模式 1.4 bridge 桥接模式 ...

  10. docker技术剖析--docker资源限制及应用总结 for centos7.2

    http://hongge.blog.51cto.com/ Docker(linux container)所依赖的底层技术 1 Namespace 用来做容器的隔离,有了namespace,在dock ...

最新文章

  1. 23 个优秀的机器学习训练公共数据集
  2. Codeforces #536 div2 E (1106E)Lunar New Year and Red Envelopes (DP)
  3. GNU make manual 翻译(六十一)
  4. IOS 多线程的一些总结
  5. java+@api_Java 常用的api
  6. 用电脑发短信_丢掉你的手机数据线吧!用这个软件轻松在任何设备互传文件
  7. 双缝干涉试验为什么恐怖?
  8. hibernate 表关系映射详解之继承关系
  9. Linux之GDB调试命令
  10. Mac Pro m1 安装 brew/eclipse/visual stadio code/nodejs/git
  11. 判断是否是2的N次方各方法运行速度比较
  12. 苹果官宣:这届“春晚”,好早!
  13. string不能输入空格,如何输入有空格字符串呢
  14. matlab之GUI界面设计(1)
  15. html语言怎么给字体加颜色代码,html怎么给字体设置颜色
  16. bixby怎么编程_Bixby将优先考虑Yahoo和AOL内容,因为三星获得了报酬
  17. 随手笔记之逆序输出数字
  18. 服务器时间 验证码不显示,时间不同步导致网页验证码不能正常显示解决方法...
  19. 聚合微服务中的 Swagger API 文档
  20. Seventh season twenty-first episode,Monica and Chandler both did not know how to write their vows???

热门文章

  1. 鸟哥惠新宸:PHP 7.1 的新特性我并不是很喜欢
  2. 计算机启动修复取消,w7电脑启动修复无法进入操作系统怎么解决 w7系统取消启动修复的方法...
  3. VB学习记录——数组
  4. Box Cox Transformation
  5. github连接显示隐私设置错误的解决方案
  6. cout 和printf的区别,输出不同
  7. 第五次:对比分析《大唐仙妖劫》和《梦幻西游》
  8. 10个T的硬盘都装不下,这几个资源网站的优质资源真的超多
  9. Java+SQLServer实现——网上图书馆借还管理系统
  10. 解决Android打包Entry name ‘res/animator/linear_indeterminate_line1_head_interpolator.xml‘ collided