新聞中心
Linux系統(tǒng)中經(jīng)常有個(gè)需求就是希望能限制某個(gè)或者某些進(jìn)程的分配資源。也就是能完成一組容器的概念,在這個(gè)容器中,有分配好的特定比例的cpu時(shí)間,IO時(shí)間,可用內(nèi)存大小等。于是就出現(xiàn)了cgroup的概念,cgroup就是controller group,最初由google的工程師提出,后來(lái)被整合進(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)也就憑借著這個(gè)技術(shù),為每個(gè)應(yīng)用程序分配不同的cgroup,將每個(gè)程序進(jìn)行隔離,達(dá)到了一個(gè)應(yīng)用程序不會(huì)影響其他應(yīng)用程序環(huán)境的目的。
cgroups子系統(tǒng)
-
cpu 子系統(tǒng),主要限制進(jìn)程的 cpu 使用率。
-
cpuacct 子系統(tǒng),可以統(tǒng)計(jì) cgroups 中的進(jìn)程的 cpu 使用報(bào)告。
-
cpuset 子系統(tǒng),可以為 cgroups 中的進(jìn)程分配單獨(dú)的 cpu 節(jié)點(diǎn)或者內(nèi)存節(jié)點(diǎn)。
-
memory 子系統(tǒng),可以限制進(jìn)程的 memory 使用量。
-
blkio 子系統(tǒng),可以限制進(jìn)程的塊設(shè)備 io。
-
devices 子系統(tǒng),可以控制進(jìn)程能夠訪問(wèn)某些設(shè)備。
-
net_cls 子系統(tǒng),可以標(biāo)記 cgroups 中進(jìn)程的網(wǎng)絡(luò)數(shù)據(jù)包,然后可以使用 tc 模塊(traffic control)對(duì)數(shù)據(jù)包進(jìn)行控制。
-
net_prio — 這個(gè)子系統(tǒng)用來(lái)設(shè)計(jì)網(wǎng)絡(luò)流量的優(yōu)先級(jí)
-
freezer 子系統(tǒng),可以掛起或者恢復(fù) cgroups 中的進(jìn)程。
-
ns 子系統(tǒng),可以使不同 cgroups 下面的進(jìn)程使用不同的 namespace
-
hugetlb — 這個(gè)子系統(tǒng)主要針對(duì)于HugeTLB系統(tǒng)進(jìn)行限制,這是一個(gè)大頁(yè)文件系統(tǒng)。
cgroups 層級(jí)結(jié)構(gòu)(Hierarchy)
內(nèi)核使用 cgroup 結(jié)構(gòu)體來(lái)表示一個(gè) control group 對(duì)某一個(gè)或者某幾個(gè) cgroups 子系統(tǒng)的資源限制。cgroup 結(jié)構(gòu)體可以組織成一顆樹(shù)的形式,每一棵cgroup 結(jié)構(gòu)體組成的樹(shù)稱之為一個(gè) cgroups 層級(jí)結(jié)構(gòu)。
cgroups層級(jí)結(jié)構(gòu)可以 attach 一個(gè)或者幾個(gè) cgroups 子系統(tǒng),當(dāng)前層級(jí)結(jié)構(gòu)可以對(duì)其 attach 的 cgroups 子系統(tǒng)進(jìn)行資源的限制。每一個(gè) cgroups 子系統(tǒng)只能被 attach 到一個(gè) cpu 層級(jí)結(jié)構(gòu)中。
好好理解下這個(gè)圖即可:
創(chuàng)建了 cgroups 層級(jí)結(jié)構(gòu)中的節(jié)點(diǎn)(cgroup 結(jié)構(gòu)體)之后,可以把進(jìn)程加入到某一個(gè)節(jié)點(diǎn)的控制任務(wù)列表中,一個(gè)節(jié)點(diǎn)的控制列表中的所有進(jìn)程都會(huì)受到當(dāng)前節(jié)點(diǎn)的資源限制。同時(shí)某一個(gè)進(jìn)程也可以被加入到不同的 cgroups 層級(jí)結(jié)構(gòu)的節(jié)點(diǎn)中,因?yàn)椴煌?cgroups 層級(jí)結(jié)構(gòu)可以負(fù)責(zé)不同的系統(tǒng)資源。所以說(shuō)進(jìn)程和 cgroup 結(jié)構(gòu)體是一個(gè)多對(duì)多的關(guān)系。
上面這個(gè)圖從整體結(jié)構(gòu)上描述了進(jìn)程與 cgroups 之間的關(guān)系。最下面的P代表一個(gè)進(jìn)程。每一個(gè)進(jìn)程的描述符中有一個(gè)指針指向了一個(gè)輔助數(shù)據(jù)結(jié)構(gòu)css_set(cgroups subsystem set)。 指向某一個(gè)css_set的進(jìn)程會(huì)被加入到當(dāng)前css_set的進(jìn)程鏈表中。一個(gè)進(jìn)程只能隸屬于一個(gè)css_set,一個(gè)css_set可以包含多個(gè)進(jìn)程,隸屬于同一css_set的進(jìn)程受到同一個(gè)css_set所關(guān)聯(lián)的資源限制。
上圖中的”M×N Linkage”說(shuō)明的是css_set通過(guò)輔助數(shù)據(jù)結(jié)構(gòu)可以與 cgroups 節(jié)點(diǎn)進(jìn)行多對(duì)多的關(guān)聯(lián)。但是 cgroups 的實(shí)現(xiàn)不允許css_set同時(shí)關(guān)聯(lián)同一個(gè)cgroups層級(jí)結(jié)構(gòu)下多個(gè)節(jié)點(diǎn)。 這是因?yàn)?cgroups 對(duì)同一種資源不允許有多個(gè)限制配置。
一個(gè)css_set關(guān)聯(lián)多個(gè) cgroups 層級(jí)結(jié)構(gòu)的節(jié)點(diǎn)時(shí),表明需要對(duì)當(dāng)前css_set下的進(jìn)程進(jìn)行多種資源的控制。而一個(gè) cgroups 節(jié)點(diǎn)關(guān)聯(lián)多個(gè)css_set時(shí),表明多個(gè)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)建完成會(huì)自動(dòng)生成以下文件 [root@k8s-master cpu]# ls cpu_test/
寫個(gè)死循環(huán)測(cè)試程序增加cpu使用率
1 int main(void)
2 {
3 int i = 0;
4 for(;;) i++;
5 return 0;
6 }
啟動(dòng)程序后cpu使用100%
默認(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)程號(hào)增加到cpu tasks里面,在看top cpu使用率很快就下來(lái)
[root@k8s-master ~]# echo 23732 >> /sys/fs/cgroup/cpu/cpu_test/tasks
其它資源限制和cpu基本一致就先寫這么多了
網(wǎng)站標(biāo)題:詳解LinuxCgroup
文章分享:http://www.dlmjj.cn/article/dhsscdi.html


咨詢
建站咨詢
