linux cgroup机制

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了linux cgroup机制相关的知识,希望对你有一定的参考价值。

参考技术A Cgroup是control group的缩写,是Linux内核提供的一种用于限制,记录,隔离进程组所使用物理资源(cpu,memory,io等)的机制。

cgroup提供了一系列的功能用于对Linux系统资源进行管理和限制,主要功能包括如下

1:限制进程组可以使用的资源数量,例如进程组对内存的使用上限。

2:进程组的执行优先级限制。

3:记录进程组所使用的资源数量,例如进程组所使用的cpu时间。

4:进程组隔离的能力。

在cgroup中有一些基本定义或概念

1:Task,理解为系统中需要被控制的进程。

2:Subsystem,可以被控制的资源系统,例如cpu,IO,内存等。

3:Cgroup,按照某种控制标准而划分而成的控制族。

4:hierarchy,Cgroup可以组织成树状结构,子节点继承父节点的控制标准。

在系统中创建新的hierarchy时,系统中的所有任务都属于该层级的默认cgroup(root group)的成员。

一个子系统只能附加到一个层级上。

一个层级可以附加多个子系统。

一个任务可以是cgroup的成员,但这些cgroup必须在不同的hierarchy中。

任务创建的子任务(进程),子进程自动成为父进程cgroup的成员。

关系图如下:

blkio -- 这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等)。

cpu -- 这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问。

cpuacct -- 这个子系统自动生成 cgroup 中任务所使用的 CPU 报告。

cpuset -- 这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点。

devices -- 这个子系统可允许或者拒绝 cgroup 中的任务访问设备。

freezer -- 这个子系统挂起或者恢复 cgroup 中的任务。

memory -- 这个子系统设定 cgroup 中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。

net_cls -- 这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包。

ns -- 名称空间子系统。

Linux系统中最多可以建12棵cgroup层级树(每棵树关联一个子系统),也可以最少建一颗cgroup层级树(关联所有12个控制子系统)

可以通过mount命令完成

1.挂载一颗和所有subsystem关联的cgroup树到/sys/fs/cgroup

mount -t cgroup

xxx /sys/fs/cgroup

2.挂载一颗和cpuset

subsystem关联的cgroup树到/sys/fs/cgroup/cpuset

mkdir

/sys/fs/cgroup/cpuset

mount -t cgroup -o

cpuset xxx /sys/fs/cgroup/cpuset

3.挂载一颗与cpu和cpuacct

subsystem关联的cgroup树到/sys/fs/cgroup/cpu,cpuacct

mkdir

/sys/fs/cgroup/cpu,cpuacct

mount -t cgroup -o

cpu,cpuacct xxx /sys/fs/cgroup/cpu,cpuacct

4.挂载一棵cgroup树,但不关联任何subsystem

mkdir

/sys/fs/cgroup/systemd

mount -t cgroup -o

none,name=systemd xxx /sys/fs/cgroup/system

通过mount可以查看到cgroup的默认挂载点

每个目录下,其中的文件描述了如何对资源进行限制。

在每个进程的/proc/$pid/cgroup文件中,描述了进程于cgroup的关系:

第一列描述cgroup的树ID(该ID可以在/proc/cgroups中一一对应);第二列描述绑定的所有子系统;第三列描述进程在cgroup中的路径。

当我们对某个任务需要进行限制时,不推荐直接在cgroup的各个子系统的root下修改配置,而是在对应的层级下建立单独的控制节点。

例如如下,在cpu目录下建立我们自己的子目录:

进入我们创建的子目录后,会看到系统已经创建好了资源控制文件,此时只需要修改这些配置文件满足要求既可以。

要控制我们的进程,只需要将进程ID添加到tasks配置文件中即可以。

以上是关于linux cgroup机制的主要内容,如果未能解决你的问题,请参考以下文章

Linux Cgroup浅析

cgroup小记

Docker之cgroup篇

7 Cgroup

Linux资源管理之cgroups简介

Linux资源管理之cgroups简介