cgroups
原作者 | Paul Menage 與 Rohit Seth |
---|---|
開發者 | kernel.org (Tejun Heo與其他成員)以及freedesktop.org |
首次發布 | 2007年 |
編程語言 | C語言 |
操作系統 | Linux |
類型 | 行程群組的資源管理功能 |
許可協議 | GPL 與 LGPL |
網站 | www |
cgroups,其名稱源自控制群組(英語:control groups)的簡寫,是Linux內核的一個功能,用來限制、控制與分離一個行程群組的資源(如CPU、內存、磁盤輸入輸出等)[1]。
這個專案最早是由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]。
功能
[編輯]cgroups的一個設計目標是為不同的用例提供統一的接口,從控制單一進程(像nice)到作業系統層虛擬化(像OpenVZ,Linux-VServer,LXC)。cgroups提供:
- 資源限制(Resource limiting):組可以被設置不超過設定的內存限制(這也包括頁面緩存)[9] [10]、I/O帶寬限制[11]、CPU配額限制[12]、CPU集合限制[13]或最大打開文件數[14]。
- 優先級設定(Prioritization):一些組可能會得到更大的CPU[15] 或磁盤IO吞吐量。[16]
- 結算(Accounting):衡量一個組的資源使用情況,可以用於計費等目的[17]
- 控制(Control):凍結組中的進程,運行檢查點和重新啟動。[17]
使用
[編輯]控制組(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不太匹配,並從內核中移除。
Linux的命名空間受到了貝爾實驗室九號項目中廣泛使用的更通用的命名空間功能的啟發。[33]
統一層次結構(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平台的等效概念,由該平台的對象管理器管理。
引用
[編輯]- ^ Control Group v2 — The Linux Kernel documentation. www.kernel.org. [2024-02-29]. (原始內容存檔於2018-11-07).
- ^ Jonathan Corbet. Process containers. LWN.net. 2007-05-29 [2012-06-16]. (原始內容存檔於2017-06-12).
- ^ Jonathan Corbet. Notes from a container. LWN.net. 2007-10-29 [2012-06-16]. (原始內容存檔於2012-06-22).
- ^ LKML: Tejun Heo: [PATCHSET cgroup/for-3.15] cgroup: convert to kernfs. lkml.org. [2024-02-29]. (原始內容存檔於2018-10-12).
- ^ [PATCH 12/12] netfilter: x_tables: lightweight process control group matching — Linux Network Development. web.archive.org. 2014-04-24 [2024-02-29]. 原始內容存檔於2014-04-24.
- ^ LKML: Tejun Heo: [PATCHSET cgroup/for-3.15] cgroup: prepare for the default unified hierarchy. lkml.org. [2024-02-29]. (原始內容存檔於2014-03-20).
- ^ kernel/git/torvalds/linux.git - Linux kernel source tree. git.kernel.org. [2024-02-29].
- ^ Control Group v2 — The Linux Kernel documentation. www.kernel.org. [2024-02-29]. (原始內容存檔於2018-11-07).
- ^ Jonathan Corbet. Controlling memory use in containers. LWN. 2007-07-31 [2012-06-16]. (原始內容存檔於2018-01-29).
- ^ Balbir Singh, Vaidynathan Srinivasan. Containers: Challenges with the memory resource controller and its performance (PDF). Ottawa Linux Symposium. July 2007 [2012-06-16]. (原始內容存檔 (PDF)於2012-05-23).
- ^ Using cgroups to limit I/O · André Carvalho. andrestc.com. [2024-02-29].
- ^ The container throttling problem. danluu.com. [2024-02-29].
- ^ Derr, Simon (2004). "CPUSETS".
- ^ setrlimit(2) — Arch manual pages. man.archlinux.org. [2024-02-29].
- ^ Jonathan Corbet. Kernel space: Fair user scheduling for Linux. Network World. 2007-10-23 [2012-06-16]. (原始內容存檔於2009-05-24).
- ^ Kamkamezawa Hiroyu. Cgroup and Memory Resource Controller (PDF). Japan Linux Symposium. 2008-11-19 [2012-06-16]. (原始內容 (PDF presentation slides)存檔於2011-07-22).
- ^ 17.0 17.1 Dave Hansen. Resource Management (PDF). Linux Foundation. [2012-06-16]. (原始內容 (PDF presentation slides)存檔於2011-10-09).
- ^ Notes from a container [LWN.net]. lwn.net. [2024-02-29]. (原始內容存檔於2018-02-04).
- ^ IBM Developer. developer.ibm.com. [2024-02-29]. (原始內容存檔於2013-10-03).
- ^ Rayson. Grid Engine cgroups Integration. [2024-02-29]. (原始內容存檔於2013-01-22) (英語).
- ^ v1.
- ^ linux/Documentation/admin-guide/cgroup-v2.rst at master · torvalds/linux. GitHub. [2024-02-29] (英語).
- ^ systemd-cgtop. www.freedesktop.org. [2024-02-29].
- ^ All About the Linux Kernel: Cgroup's Redesign. Linux.com. 2013-08-15 [2014-05-19]. (原始內容存檔於2019-04-28).
- ^ The unified control group hierarchy in 3.16. LWN.net. 2014-06-11.
- ^ Pull cgroup updates for 3.15 from Tejun Heo. kernel.org. 2014-04-03.
- ^ Pull cgroup updates for 3.16 from Tejun Heo. kernel.org. 2014-06-09.
- ^ Pavel Emelyanov, Kir Kolyshkin. PID namespaces in the 2.6.24 kernel. LWN.net. 19 November 2007 [2024-03-01]. (原始內容存檔於2017-12-08).
- ^ Serge E. Hallyn, Ram Pai. Applying mount namespaces. IBM developerWorks. 17 September 2007.
- ^ Michael Kerrisk. Namespaces in operation, part 5: User namespaces. lwn.net Linux Info from the Source. 27 February 2013 [2024-03-01]. (原始內容存檔於2022-06-04).
- ^ LKML: Linus Torvalds: Linux 4.6-rc1.
- ^ Janak Desai. Linux kernel documentation on unshare. 11 January 2006.
- ^ The Use of Name Spaces in Plan 9. 1992 [15 February 2015]. (原始內容存檔於6 September 2014).
- ^ kernfs, sysfs, driver-core: implement synchronous self-removal. LWN.net. 2014-02-03 [2014-04-07].
- ^ memcg: kmem controller infrastructure. kernel.org source code. 2012-12-18.
- ^ memcg: kmem accounting basic infrastructure. kernel.org source code. 2012-12-18.
- ^ memcg: add documentation about the kmem controller. kernel.org. 2012-12-18.
- ^ Linux_4.19 - Linux Kernel Newbies.
- ^ Mesosphere to Bring Google’s Kubernetes to Mesos - Mesosphere. web.archive.org. 2015-09-06 [2024-02-29]. 原始內容存檔於2015-09-06.
- ^ Mesosphere to Bring Google’s Kubernetes to Mesos - Mesosphere. web.archive.org. 2015-09-06 [2024-02-29]. 原始內容存檔於2015-09-06.
- ^ "6.0 Release Notes" (PDF). redhat.com.
- ^ 1732114 – Modify Fedora 31 to use CgroupsV2 by default. bugzilla.redhat.com. [2024-02-29].