Cgroups

cgroups(7) - Linux manual page https://www.man7.org/linux/man-pages/man7/cgroups.7.html

Cgroup_百度百科 https://baike.baidu.com/item/cgroup/4988200

Linux Containers - ArchWiki https://wiki.archlinux.org/title/Linux_Containers

cgroups,其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限制、控制与分离一个进程组资源(如CPU内存磁盘输入输出等)。
这个项目最早是由Google的工程师(主要是Paul Menage和Rohit Seth)在2006年发起,最早的名称为进程容器(process containers)。在2007年时,因为在Linux内核中,容器(container)这个名词有许多不同的意义,为避免混乱,被重命名为cgroup,并且被合并到2.6.24版的内核中去。自那以后,又添加了很多功能。
 
 
中文名
源自控制组群
外文名
control groups
cgroups的一个设计目标是为不同的应用情况提供统一的接口,从控制单一进程(像nice)到操作系统层虚拟化(像OpenVZ,Linux-VServer,LXC)。cgroups提供:
  • 资源限制:组可以被设置不超过设定的内存限制;这也包括虚拟内存
  • 优先级:一些组可能会得到大量的CPU或磁盘IO吞吐量。
  • 结算:用来衡量系统确实把多少资源用到适合的目的上。
  • 控制:冻结组或检查点和重启动。
Cgroups最初的目标是为资源管理提供的一个统一的框架,既整合现有的cpuset等子系统,也为未来开发新的子系统提供接口。现在的cgroups适用于多种应用场景,从单个进程的资源控制,到实现操作系统层次的虚拟化(OS Level Virtualization)。Cgroups提供了以下功能:
1.限制进程组可以使用的资源数量(Resource limiting )。比如:memory子系统可以为进程组设定一个memory使用上限,一旦进程组使用的内存达到限额再申请内存,就会触发OOM(out of memory)。
2.进程组的优先级控制(Prioritization )。比如:可以使用cpu子系统为某个进程组分配特定cpu share。
3.记录进程组使用的资源数量(Accounting )。比如:可以使用cpuacct子系统记录某个进程组使用的cpu时间
4.进程组隔离(Isolation)。比如:使用ns子系统可以使不同的进程组使用不同的namespace,以达到隔离的目的,不同的进程组有各自的进程、网络、文件系统挂载空间。
5.进程组控制(Control)。比如:使用freezer子系统可以将进程组挂起和恢复。

相关介绍

编辑 语音

相关概念

1.任务(task)。在cgroups中,任务就是系统的一个进程。
2.控制族群(control group)。控制族群就是一组按照某种标准划分的进程。Cgroups中的资源控制都是以控制族群为单位实现。一个进程可以加入到某个控制族群,也从一个进程组迁移到另一个控制族群。一个进程组的进程可以使用cgroups以控制族群为单位分配的资源,同时受到cgroups以控制族群为单位设定的限制。
3.层级(hierarchy)。控制族群可以组织成hierarchical的形式,既一颗控制族群树。控制族群树上的子节点控制族群是父节点控制族群的孩子,继承父控制族群的特定的属性。
4.子系统(subsystem)。一个子系统就是一个资源控制器,比如cpu子系统就是控制cpu时间分配的一个控制器。子系统必须附加(attach)到一个层级上才能起作用,一个子系统附加到某个层级以后,这个层级上的所有控制族群都受到这个子系统的控制。

相互关系

1.每次在系统中创建新层级时,该系统中的所有任务都是那个层级的默认 cgroup(我们称之为 root cgroup ,此cgroup在创建层级时自动创建,后面在该层级中创建的cgroup都是此cgroup的后代)的初始成员。
2.一个子系统最多只能附加到一个层级。
3.一个层级可以附加多个子系统
4.一个任务可以是多个cgroup的成员,但是这些cgroup必须在不同的层级。
5.系统中的进程(任务)创建子进程(任务)时,该子任务自动成为其父进程所在 cgroup 的成员。然后可根据需要将该子任务移动到不同的 cgroup 中,但开始时它总是继承其父任务的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 -- 名称空间子系统。 [1] 

如何管控

编辑 语音
Cgroup 是透过阶层式的方式来管理的,和程序、子群组相同,都会由它们的 parent 继承部份属性。然而,这两个模型之间有所不同。

Linux 程序

Linux 系统上的所有程序皆为相同 parent 的子程序:init程序,由 kernel 在开机时执行,并启用其它程序(并且可能会相应地启用它们自己的子程序)。因为所有程序皆源自於单独的父程序,因此 Linux 的程序模型属於单独的阶层或树状目录。
此外,所有除了init以外的程序皆会继承其父程序的环境(例如 PATH 变数)与特定属性(例如开放式的档案描述元) [2]  。

Cgroup 模型

Cgroup 与程序的相似点为:
  • 它们皆属於阶层式,并且
  • 子 cgroup 会继承其父群组的特定属性。
基础差异就是在同一部系统上,能够同时存在许多不同的 cgroup 阶层。若 Linux 程序模型是个程序的单树状,那麼 cgroup 模型便是个各别、未连接的树状工作(例如程序)。
多重各别的 cgroup 阶层是必要的,因为各个阶层皆连至了「一个或更多」个「子系统」。子系统[2]代表单独的资源,例如 CPU 时间或记忆体。Red Hat Enterprise Linux 6 提供了九个控制群组子系统,以名称和功能列在下方。
Red Hat Enterprise Linux 中的可用子系统
  • blkio— 此子系统可设置来自於,以及至区块装置(例如像是固态、USB 等等的实体磁碟)的输入/输出存取限制。
  • cpu— 此子系统使用了排程器,以提供 CPU cgroup 工作的存取权限。
  • cpuacct— 此子系统会自动产生 cgroup 中的工作所使用的 CPU 资源报告。
  • cpuset— 此子系统会将个别的 CPU 与记忆体节点分配给 cgroup 中的工作。
  • devices— 此子系统能允许或拒绝控制群组中的任务存取装置。
  • freezer— 此子系统可中止或复原控制群组中的工作。
  • memory— 此子系统会根据使用於控制群组中的工作的记忆体资源,自动产生记忆体报告,然後设定这些工作所能使用的记忆体限制:
  • net_cls— 此子系统会以一个 class 标识符号(classid)来标记网路封包,这能让 Linux 流量控制器(tc)辨识源自於特定控制群组的封包。流量控制器能被配置来指定不同的优先顺序给来自於不同控制群组的封包。
  • ns—namespace子系统。

 

posted @ 2021-12-09 09:35  papering  阅读(148)  评论(0编辑  收藏  举报