cgroups
cgroups,其名稱源自控制群組(英語:)的簡寫,是Linux内核的一个功能,用来限制、控制與分離一个行程群組的资源(如CPU、内存、磁盘输入输出等)[1]。
原作者 | Paul Menage 與 Rohit Seth |
---|---|
開發者 | kernel.org (Tejun Heo與其他成員)以及freedesktop.org |
首次发布 | 2007年 |
编程语言 | C語言 |
操作系统 | Linux |
类型 | 行程群組的資源管理功能 |
许可协议 | GPL 與 LGPL |
网站 | www |
這個專案最早是由Google的工程師(主要是Paul Menage和Rohit Seth)在2006年發起,最早的名稱為进程容器(process containers)[2]。在2007年時,因為在Linux內核中,容器(container)這個名詞有許多不同的意義,為避免混亂,被重新命名為cgroup,並且被合併到2.6.24版的内核中去(该版本于2008年1月发布)[3]。自那以后,开发人员陆续添加了许多新功能和控制器,例如2014年对kernfs的支持[4],防火墙功能[5]和统一层次结构[6]。cgroup v2在Linux内核4.5中被合并[7],接口和内部功能发生了重大变化[8]。
使用
控制组(cgroup)是一组受相同条件约束的进程,并与一组参数或限制相关联。这些组可以是层次结构的,意味着每个组都从其父组继承限制。
内核通过cgroup接口提供对多个控制器(也称为子系统)的访问[18];例如,“memory”控制器限制内存使用,“cpuacct”记录CPU使用情况等。
控制组可以通过多种方式使用:
- 手动读写 cgroup 的虚拟文件系统。
- 使用
cgcreate
、cgexec
和cgclassify
(来自libcgroup
)等工具,即时创建和管理群组。 - 通过“规则引擎守护程序”,可以根据配置自动将特定用户、组或命令的进程移动到cgroups中。
- 间接通过使用 cgroups 的其他软件,如Docker、Firejail、LXC[19]、libvirt、systemd、Open Grid Scheduler/Grid Engine[20],以及Google已停止开发的lmctfy。
Linux 内核文档包含了控制组版本1(cgroup v1)[21] 和版本2(cgroup v2)[22]的一些设置和使用的技术细节。
也可以使用 systemd-cgtop
命令[23]按资源使用情况显示顶级控制组。
重新设计
cgroups的重新设计始于2013年[24],随后在Linux内核的3.15和3.16版本中引入了额外的改变。[25][26][27]
命名空间隔离
虽然不是cgroups工作的技术部分,但Linux内核的一个相关特性是命名空间隔离,它将一组进程分离开来,使它们无法“看到”其他组中的资源。例如,PID命名空间在每个命名空间中提供了一个独立的进程标识符枚举。还有可用的挂载、用户、UTS、网络和SysV IPC命名空间。
- PID namespace (PID命名空间) 提供了进程标识符(PID)、进程列表及其详细信息的分离。虽然新的命名空间与其他同级命名空间隔离,但其“父”命名空间中的进程仍然可以看到子命名空间中的所有进程,尽管PID号码不同。[28]
- Network namespace (网络命名空间) 隔离了(物理或虚拟的)网络接口控制器、iptables防火墙规则、路由表等。网络命名空间可以使用"veth"虚拟以太网设备连接在一起。
- "UTS" namespace 允许更改主机名。
- Mount namespace 允许创建不同的文件系统布局,或将某些挂载点设置为只读。[29]
- IPC namespace 隔离了命名空间之间的System V进程间通信。
- User namespace 在命名空间之间隔离用户ID。[30]
- Cgroup namespace [31]
命名空间是通过"unshare"命令或系统调用创建的,或者作为"clone"系统调用中的"new"标志。[32]
在 cgroups 开发早期,添加了"ns"子系统,以整合命名空间和控制组。如果挂载了"ns"控制组,每个命名空间也会在控制组层次结构中创建一个新的组。这是一个实验,后来被认为与cgroups API不太匹配,并从内核中移除。
统一层次结构(Unified hierarchy)
Kernfs于2014年3月引入Linux内核,版本为3.14,主要作者是Tejun Heo。[34]一个独立的kernfs的主要动机之一是cgroups文件系统。Kernfs基本上是通过将一些sysfs逻辑拆分为一个独立实体来创建的,从而为其他内核子系统实现自己的虚拟文件系统提供了便利,包括处理设备连接和断开连接、动态创建和删除以及其他属性。重设计继续到Linux内核的3.15版本。
内核内存控制组(kmemcg)
内核内存控制组(kmemcg)已合并到Linux内核主线版本3.8(2013年2月18日 )。[35][36][37]kmemcg控制器可以限制内核用于管理其自身内部进程所使用的内存量。
cgroup对OOM killer的感知
Linux内核4.19(2018年10月)引入了对OOM killer实现的cgroup感知,这增加了以cgroup为单位杀死进程的能力,从而保证了工作负载的完整性。[38]
应用
各种项目都使用cgroups作为基础,包括CoreOS、Docker(2013年)、Hadoop、Jelastic、Kubernetes[39]、lmctfy(Let Me Contain That For You)、LXC(LinuX Containers)、systemd、Mesos和Mesosphere[40],以及HTCondor。主要的Linux发行版也采用了它,例如Red Hat Enterprise Linux(RHEL)6.0在2010年11月采用[41],比主线Linux内核晚三年。
2019年10月29日,Fedora项目将Fedora 31默认修改为使用CgroupsV2。[42]
参见
- 实现了操作系统级虚拟化的项目列表
- 进程组
- Tc (Linux)
- 工作对象 - Windows平台的等效概念,由该平台的对象管理器管理。
引用
- . www.kernel.org. [2024-02-29]. (原始内容存档于2018-11-07).
- Jonathan Corbet. . LWN.net. 2007-05-29 [2012-06-16]. (原始内容存档于2017-06-12).
- Jonathan Corbet. . LWN.net. 2007-10-29 [2012-06-16]. (原始内容存档于2012-06-22).
- . lkml.org. [2024-02-29]. (原始内容存档于2018-10-12).
- . web.archive.org. 2014-04-24 [2024-02-29]. 原始内容存档于2014-04-24.
- . lkml.org. [2024-02-29]. (原始内容存档于2014-03-20).
- . git.kernel.org. [2024-02-29].
- . www.kernel.org. [2024-02-29]. (原始内容存档于2018-11-07).
- Jonathan Corbet. . LWN. 2007-07-31 [2012-06-16]. (原始内容存档于2018-01-29).
- Balbir Singh, Vaidynathan Srinivasan. (PDF). Ottawa Linux Symposium. July 2007 [2012-06-16]. (原始内容存档 (PDF)于2012-05-23).
- . andrestc.com. [2024-02-29].
- . danluu.com. [2024-02-29].
- Derr, Simon (2004). .
- . man.archlinux.org. [2024-02-29].
- Jonathan Corbet. . Network World. 2007-10-23 [2012-06-16]. (原始内容存档于2009-05-24).
- Kamkamezawa Hiroyu. (PDF). Japan Linux Symposium. 2008-11-19 [2012-06-16]. (原始内容 (PDF presentation slides)存档于2011-07-22).
- Dave Hansen. (PDF). Linux Foundation. [2012-06-16]. (原始内容 (PDF presentation slides)存档于2011-10-09).
- . lwn.net. [2024-02-29]. (原始内容存档于2018-02-04).
- . developer.ibm.com. [2024-02-29]. (原始内容存档于2013-10-03).
- Rayson. . [2024-02-29]. (原始内容存档于2013-01-22) (英语).
- .
- . GitHub. [2024-02-29] (英语).
- . www.freedesktop.org. [2024-02-29].
- . Linux.com. 2013-08-15 [2014-05-19]. (原始内容存档于2019-04-28).
- . LWN.net. 2014-06-11.
- . kernel.org. 2014-04-03.
- . kernel.org. 2014-06-09.
- Pavel Emelyanov, Kir Kolyshkin. . LWN.net. 19 November 2007 [2024-03-01]. (原始内容存档于2017-12-08).
- Serge E. Hallyn, Ram Pai. . IBM developerWorks. 17 September 2007.
- Michael Kerrisk. . lwn.net Linux Info from the Source. 27 February 2013 [2024-03-01]. (原始内容存档于2022-06-04).
- .
- Janak Desai. . 11 January 2006.
- . 1992 [15 February 2015]. (原始内容存档于6 September 2014).
- . LWN.net. 2014-02-03 [2014-04-07].
- . kernel.org source code. 2012-12-18.
- . kernel.org source code. 2012-12-18.
- . kernel.org. 2012-12-18.
- .
- . web.archive.org. 2015-09-06 [2024-02-29]. 原始内容存档于2015-09-06.
- . web.archive.org. 2015-09-06 [2024-02-29]. 原始内容存档于2015-09-06.
- (PDF). redhat.com.
- . bugzilla.redhat.com. [2024-02-29].