目录
一、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://