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

本文介绍了CGroup在Docker中的应用,讲解了如何通过CGroup对Docker容器进行CPU权重控制、周期限制、核心选择以及内存和Block IO的限制。内容涵盖Dockerfile创建stress镜像、CPU份额设置、CPU周期与配额的设定、内存限制以及Block IO的bps和iops约束。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

一、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	1


cpuset:如果是多核心的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 Dockerfile

FROM centos:7
MAINTAINER chen "[email protected]"
RUN yum install -y wget
RUN wget -O /etc/yum.repos.d/epel.repo http://
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值