cgroups,其名稱源自控制群組(英語:control groups)的簡寫,是Linux內核的一個功能,用來限制、控制與分離一個行程群組資源(如CPU、內存、磁盤輸入輸出等)[1]

Quick Facts 原作者, 開發者 ...
cgroups
原作者Paul Menage 與 Rohit Seth
開發者kernel.org (Tejun Heo與其他成員)以及freedesktop.org
首次發布2007年,​17年前​(2007
編程語言C語言
操作系統Linux
類型行程群組的資源管理功能
許可協議GPLLGPL
網站www.kernel.org/doc/Documentation/cgroup-v1/cgroups.txtwww.freedesktop.org/wiki/Software/systemd/ControlGroupInterface/
Close
Thumb
Unified hierarchy cgroups 且 systemd.

這個專案最早是由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)到作業系統層虛擬化(像OpenVZLinux-VServerLXC)。cgroups提供:

  • 資源限制(Resource limiting):組可以被設置不超過設定的內存限制(這也包括頁面緩存英語Page_cache[9] [10]、I/O帶寬限制[11]、CPU配額限制[12]、CPU集合限制[13]最大打開文件數[14]
  • 優先級設定(Prioritization):一些可能會得到更大的CPU[15] 或磁盤IO吞吐量。[16]
  • 結算(Accounting):衡量一個的資源使用情況,可以用於計費等目的[17]
  • 控制(Control):凍結中的進程,運行檢查點英語Application_checkpointing和重新啟動。[17]

使用

控制組(cgroup)是一組受相同條件約束的進程,並與一組參數或限制相關聯。這些組可以是層次結構的,意味着每個組都從其父組繼承限制。

內核通過cgroup接口提供對多個控制器(也稱為子系統)的訪問[18];例如,「memory」控制器限制內存使用,「cpuacct」記錄CPU使用情況等。

控制組可以通過多種方式使用:

  • 手動讀寫 cgroup 的虛擬文件系統。
  • 使用 cgcreatecgexeccgclassify (來自 libcgroup )等工具,即時創建和管理群組。
  • 通過「規則引擎守護程序」,可以根據配置自動將特定用戶、組或命令的進程移動到cgroups中。
  • 間接通過使用 cgroups 的其他軟件,如DockerFirejail、LXC[19]libvirtsystemdOpen 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日,​11年前​(2013-02-18)。[35][36][37]kmemcg控制器可以限制內核用於管理其自身內部進程所使用的內存量。

cgroup對OOM killer的感知

Linux內核4.19(2018年10月)引入了對OOM killer英語OOM killer實現的cgroup感知,這增加了以cgroup為單位殺死進程的能力,從而保證了工作負載的完整性。[38]

應用

各種項目都使用cgroups作為基礎,包括CoreOSDocker(2013年)、HadoopJelasticKubernetes[39]lmctfy(Let Me Contain That For You)、LXC(LinuX Containers)、systemdMesos和Mesosphere[40],以及HTCondor。主要的Linux發行版也採用了它,例如Red Hat Enterprise Linux(RHEL)6.0在2010年11月採用[41],比主線Linux內核晚三年。

2019年10月29日,Fedora項目將Fedora 31默認修改為使用CgroupsV2。[42]

參見

引用

外部連結

Wikiwand in your browser!

Seamless Wikipedia browsing. On steroids.

Every time you click a link to Wikipedia, Wiktionary or Wikiquote in your browser's search results, it will show the modern Wikiwand interface.

Wikiwand extension is a five stars, simple, with minimum permission required to keep your browsing private, safe and transparent.