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.