溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點(diǎn)擊 登錄注冊 即表示同意《億速云用戶服務(wù)條款》

Linux中Cgroup是什么

發(fā)布時間:2022-02-19 11:36:58 來源:億速云 閱讀:264 作者:小新 欄目:開發(fā)技術(shù)

這篇文章給大家分享的是有關(guān)Linux中Cgroup是什么的內(nèi)容。小編覺得挺實(shí)用的,因此分享給大家做個參考,一起跟隨小編過來看看吧。

Linux系統(tǒng)中經(jīng)常有個需求就是希望能限制某個或者某些進(jìn)程的分配資源。也就是能完成一組容器的概念,在這個容器中,有分配好的特定比例的cpu時間,IO時間,可用內(nèi)存大小等。于是就出現(xiàn)了cgroup的概念,cgroup就是controller group,最初由google的工程師提出,后來被整合進(jìn)Linux內(nèi)核中。

Cgroup是將任意進(jìn)程進(jìn)行分組化管理的Linux內(nèi)核功能。cgroup本身提供將進(jìn)程進(jìn)行分組化管理的功能和接口的基礎(chǔ)結(jié)構(gòu)。

而后的Android操作系統(tǒng)也就憑借著這個技術(shù),為每個應(yīng)用程序分配不同的cgroup,將每個程序進(jìn)行隔離,達(dá)到了一個應(yīng)用程序不會影響其他應(yīng)用程序環(huán)境的目的。

Linux中Cgroup是什么

cgroups子系統(tǒng)

  1. cpu 子系統(tǒng),主要限制進(jìn)程的 cpu 使用率。
  2. cpuacct 子系統(tǒng),可以統(tǒng)計 cgroups 中的進(jìn)程的 cpu 使用報告。
  3. cpuset 子系統(tǒng),可以為 cgroups 中的進(jìn)程分配單獨(dú)的 cpu 節(jié)點(diǎn)或者內(nèi)存節(jié)點(diǎn)。
  4. memory 子系統(tǒng),可以限制進(jìn)程的 memory 使用量。
  5. blkio 子系統(tǒng),可以限制進(jìn)程的塊設(shè)備 io。
  6. devices 子系統(tǒng),可以控制進(jìn)程能夠訪問某些設(shè)備。
  7. net_cls 子系統(tǒng),可以標(biāo)記 cgroups 中進(jìn)程的網(wǎng)絡(luò)數(shù)據(jù)包,然后可以使用 tc 模塊(traffic control)對數(shù)據(jù)包進(jìn)行控制。
  8. net_prio — 這個子系統(tǒng)用來設(shè)計網(wǎng)絡(luò)流量的優(yōu)先級
  9. freezer 子系統(tǒng),可以掛起或者恢復(fù) cgroups 中的進(jìn)程。
  10. ns 子系統(tǒng),可以使不同 cgroups 下面的進(jìn)程使用不同的 namespace
  11. hugetlb — 這個子系統(tǒng)主要針對于HugeTLB系統(tǒng)進(jìn)行限制,這是一個大頁文件系統(tǒng)。

cgroups 層級結(jié)構(gòu)(Hierarchy)

內(nèi)核使用 cgroup 結(jié)構(gòu)體來表示一個 control group 對某一個或者某幾個 cgroups 子系統(tǒng)的資源限制。cgroup 結(jié)構(gòu)體可以組織成一顆樹的形式,每一棵cgroup 結(jié)構(gòu)體組成的樹稱之為一個 cgroups 層級結(jié)構(gòu)。

cgroups層級結(jié)構(gòu)可以 attach 一個或者幾個 cgroups 子系統(tǒng),當(dāng)前層級結(jié)構(gòu)可以對其 attach 的 cgroups 子系統(tǒng)進(jìn)行資源的限制。每一個 cgroups 子系統(tǒng)只能被 attach 到一個 cpu 層級結(jié)構(gòu)中。

好好理解下這個圖即可:

Linux中Cgroup是什么

創(chuàng)建了 cgroups 層級結(jié)構(gòu)中的節(jié)點(diǎn)(cgroup 結(jié)構(gòu)體)之后,可以把進(jìn)程加入到某一個節(jié)點(diǎn)的控制任務(wù)列表中,一個節(jié)點(diǎn)的控制列表中的所有進(jìn)程都會受到當(dāng)前節(jié)點(diǎn)的資源限制。同時某一個進(jìn)程也可以被加入到不同的 cgroups 層級結(jié)構(gòu)的節(jié)點(diǎn)中,因?yàn)椴煌?cgroups 層級結(jié)構(gòu)可以負(fù)責(zé)不同的系統(tǒng)資源。所以說進(jìn)程和 cgroup 結(jié)構(gòu)體是一個多對多的關(guān)系。

Linux中Cgroup是什么

上面這個圖從整體結(jié)構(gòu)上描述了進(jìn)程與 cgroups 之間的關(guān)系。最下面的P代表一個進(jìn)程。每一個進(jìn)程的描述符中有一個指針指向了一個輔助數(shù)據(jù)結(jié)構(gòu)css_set(cgroups subsystem set)。 指向某一個css_set的進(jìn)程會被加入到當(dāng)前css_set的進(jìn)程鏈表中。一個進(jìn)程只能隸屬于一個css_set,一個css_set可以包含多個進(jìn)程,隸屬于同一css_set的進(jìn)程受到同一個css_set所關(guān)聯(lián)的資源限制。

上圖中的”M×N Linkage”說明的是css_set通過輔助數(shù)據(jù)結(jié)構(gòu)可以與 cgroups 節(jié)點(diǎn)進(jìn)行多對多的關(guān)聯(lián)。但是 cgroups 的實(shí)現(xiàn)不允許css_set同時關(guān)聯(lián)同一個cgroups層級結(jié)構(gòu)下多個節(jié)點(diǎn)。 這是因?yàn)?cgroups 對同一種資源不允許有多個限制配置。

一個css_set關(guān)聯(lián)多個 cgroups 層級結(jié)構(gòu)的節(jié)點(diǎn)時,表明需要對當(dāng)前css_set下的進(jìn)程進(jìn)行多種資源的控制。而一個 cgroups 節(jié)點(diǎn)關(guān)聯(lián)多個css_set時,表明多個css_set下的進(jìn)程列表受到同一份資源的相同限制。

實(shí)踐操作

查看cgroup掛載點(diǎn)(centos7.5):

 1 [root@k8s-master ~]# mount -t cgroup 2 cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
 3 cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
 4 cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
 5 cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
 6 cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpuacct,cpu)
 7 cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
 8 cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
 9 cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
10 cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
11 cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
12 cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_prio,net_cls)

創(chuàng)建隔離組

[root@k8s-master ~]# cd /sys/fs/cgroup/cpu

[root@k8s-master cpu]# mkdir cpu_test

目錄創(chuàng)建完成會自動生成以下文件 [root@k8s-master cpu]# ls cpu_test/ Linux中Cgroup是什么

寫個死循環(huán)測試程序增加cpu使用率

 1 int main(void)
 2 {
 3     int i = 0;
 4     for(;;) i++;
 5     return 0;
 6 }

啟動程序后cpu使用100%

Linux中Cgroup是什么

默認(rèn)-1不限制,現(xiàn)在改成20000,可以理解使用率限制在20%

[root@k8s-master cpu]# echo 20000 > /sys/fs/cgroup/cpu/cpu_test/cpu.cfs_quota_us

找到進(jìn)程號增加到cpu tasks里面,在看top cpu使用率很快就下來

[root@k8s-master ~]# echo 23732 >> /sys/fs/cgroup/cpu/cpu_test/tasks

Linux中Cgroup是什么

 

其它資源限制和cpu基本一致就先寫這么多了

感謝各位的閱讀!關(guān)于“Linux中Cgroup是什么”這篇文章就分享到這里了,希望以上內(nèi)容可以對大家有一定的幫助,讓大家可以學(xué)到更多知識,如果覺得文章不錯,可以把它分享出去讓更多的人看到吧!

向AI問一下細(xì)節(jié)

免責(zé)聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點(diǎn)不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進(jìn)行舉報,并提供相關(guān)證據(jù),一經(jīng)查實(shí),將立刻刪除涉嫌侵權(quán)內(nèi)容。

AI