Cgroup

cgroups,其名稱源自控制組群(control groups)的簡寫,是Linux核心的一個功能,用來限制、控制與分離一個進程組資源(如CPU記憶體磁碟輸入輸出等)。

這個項目最早是由Google的工程師(主要是Paul Menage和Rohit Seth)在2006年發起,最早的名稱為進程容器(process containers)。在2007年時,因為在Linux核心中,容器(container)這個名詞有許多不同的意義,為避免混亂,被重命名為cgroup,並且被合併到2.6.24版的核心中去。自那以後,又添加了很多功能。

基本介紹

  • 中文名:源自控制組群
  • 外文名:control groups
功能,作用,相關概念及其關係,相關概念,相互關係,子系統介紹,如何管理控制群組,Linux 程式模型,Cgroup 模型,

功能

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 -- 名稱空間子系統。

如何管理控制群組

Cgroup 是透過階層式的汽放朽方式來管理的,和程式、子群組相同,都會由它們的 parent 繼承部份屬性。然而,這兩個模型之間有所不同。

Linux 程式模型

Linux 系統上的所有程式皆為相同 parent 的子程式:init程式,由 kernel 在開機時執行,並啟用其它程式(並且可能會相應地啟用它們自己的子程式)。因為所有程式皆源自於單獨的父程式,因此 Linux 的程式模型屬於單獨的階層或樹狀目錄。
此外,所有除了init以外的程式皆會繼承其父程式的環境(例如 PATH 變數)與特定屬性(例如開放式的檔案描述元)。

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子系統。
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 -- 名稱空間子系統。

如何管理控制群組

Cgroup 是透過階層式的方式來管理的,和程式、子群組相同,都會由它們的 parent 繼承部份屬性。然而,這兩個模型之間有所不同。

Linux 程式模型

Linux 系統上的所有程式皆為相同 parent 的子程式:init程式,由 kernel 在開機時執行,並啟用其它程式(並且可能會相應地啟用它們自己的子程式)。因為所有程式皆源自於單獨的父程式,因此 Linux 的程式模型屬於單獨的階層或樹狀目錄。
此外,所有除了init以外的程式皆會繼承其父程式的環境(例如 PATH 變數)與特定屬性(例如開放式的檔案描述元)。

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子系統。

相關詞條

熱門詞條

聯絡我們