日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問(wèn) 生活随笔!

生活随笔

當(dāng)前位置: 首頁(yè) > 运维知识 > linux >内容正文

linux

[转载] linux cgroup

發(fā)布時(shí)間:2023/12/20 linux 34 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [转载] linux cgroup 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

原文:?http://coolshell.cn/articles/17049.html

感謝左耳朵耗子的精彩文章.

?

前面,我們介紹了Linux Namespace,但是Namespace解決的問(wèn)題主要是環(huán)境隔離的問(wèn)題,這只是虛擬化中最最基礎(chǔ)的一步,我們還需要解決對(duì)計(jì)算機(jī)資源使用上的隔離。也就是說(shuō),雖然你通過(guò)Namespace把我Jail到一個(gè)特定的環(huán)境中去了,但是我在其中的進(jìn)程使用用CPU、內(nèi)存、磁盤(pán)等這些計(jì)算資源其實(shí)還是可以隨心所欲的。所以,我們希望對(duì)進(jìn)程進(jìn)行資源利用上的限制或控制。這就是Linux CGroup出來(lái)了的原因。

Linux CGroup全稱(chēng)Linux Control Group, 是Linux內(nèi)核的一個(gè)功能,用來(lái)限制,控制與分離一個(gè)進(jìn)程組群的資源(如CPU、內(nèi)存、磁盤(pán)輸入輸出等)。這個(gè)項(xiàng)目最早是由Google的工程師在2006年發(fā)起(主要是Paul Menage和Rohit Seth),最早的名稱(chēng)為進(jìn)程容器(process containers)。在2007年時(shí),因?yàn)樵贚inux內(nèi)核中,容器(container)這個(gè)名詞太過(guò)廣泛,為避免混亂,被重命名為cgroup,并且被合并到2.6.24版的內(nèi)核中去。然后,其它開(kāi)始了他的發(fā)展。

Linux CGroupCgroup 可???讓???您???為???系???統(tǒng)???中???所???運(yùn)???行???任???務(wù)???(進(jìn)???程???)的???用???戶(hù)???定???義???組???群???分???配???資???源??? — 比???如??? CPU 時(shí)???間???、???系???統(tǒng)???內(nèi)???存???、???網(wǎng)???絡(luò)???帶???寬???或???者???這???些???資???源???的???組???合???。???您???可???以???監(jiān)???控???您???配???置???的??? cgroup,拒???絕??? cgroup 訪???問(wèn)???某???些???資???源???,甚???至???在???運(yùn)???行???的???系???統(tǒng)???中???動(dòng)???態(tài)???配???置???您???的??? cgroup。

主要提供了如下功能:

?

  • Resource limitation: 限制資源使用,比如內(nèi)存使用上限以及文件系統(tǒng)的緩存限制。
  • Prioritization: 優(yōu)先級(jí)控制,比如:CPU利用和磁盤(pán)IO吞吐。
  • Accounting: 一些審計(jì)或一些統(tǒng)計(jì),主要目的是為了計(jì)費(fèi)。
  • Control: 掛起進(jìn)程,恢復(fù)執(zhí)行進(jìn)程。

使???用??? cgroup,系???統(tǒng)???管???理???員???可???更???具???體???地???控???制???對(duì)???系???統(tǒng)???資???源???的???分???配???、???優(yōu)???先???順???序???、???拒???絕???、???管???理???和???監(jiān)???控???。???可???更???好???地???根???據(jù)???任???務(wù)???和???用???戶(hù)???分???配???硬???件???資???源???,提???高???總???體???效???率???。

在實(shí)踐中,系統(tǒng)管理員一般會(huì)利用CGroup做下面這些事(有點(diǎn)像為某個(gè)虛擬機(jī)分配資源似的):

  • 隔離一個(gè)進(jìn)程集合(比如:nginx的所有進(jìn)程),并限制他們所消費(fèi)的資源,比如綁定CPU的核。
  • 為這組進(jìn)程 分配其足夠使用的內(nèi)存
  • 為這組進(jìn)程分配相應(yīng)的網(wǎng)絡(luò)帶寬和磁盤(pán)存儲(chǔ)限制
  • 限制訪問(wèn)某些設(shè)備(通過(guò)設(shè)置設(shè)備的白名單)

那么CGroup是怎么干的呢?我們先來(lái)點(diǎn)感性認(rèn)識(shí)吧。

首先,Linux把CGroup這個(gè)事實(shí)現(xiàn)成了一個(gè)file system,你可以mount。在我的Ubuntu 14.04下,你輸入以下命令你就可以看到cgroup已為你mount好了。

1 2 3 4 5 6 7 8 9 10 11 12 hchen@ubuntu:~$ mount -t cgroup cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,relatime,cpuset) cgroup on /sys/fs/cgroup/cpu type cgroup (rw,relatime,cpu) cgroup on /sys/fs/cgroup/cpuacct type cgroup (rw,relatime,cpuacct) cgroup on /sys/fs/cgroup/memory type cgroup (rw,relatime,memory) cgroup on /sys/fs/cgroup/devices type cgroup (rw,relatime,devices) cgroup on /sys/fs/cgroup/freezer type cgroup (rw,relatime,freezer) cgroup on /sys/fs/cgroup/blkio type cgroup (rw,relatime,blkio) cgroup on /sys/fs/cgroup/net_prio type cgroup (rw,net_prio) cgroup on /sys/fs/cgroup/net_cls type cgroup (rw,net_cls) cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,relatime,perf_event) cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,relatime,hugetlb)

或者使用lssubsys命令:

1 2 3 4 5 6 7 8 9 10 11 12 $ lssubsys? -m cpuset /sys/fs/cgroup/cpuset cpu /sys/fs/cgroup/cpu cpuacct /sys/fs/cgroup/cpuacct memory /sys/fs/cgroup/memory devices /sys/fs/cgroup/devices freezer /sys/fs/cgroup/freezer blkio /sys/fs/cgroup/blkio net_cls /sys/fs/cgroup/net_cls net_prio /sys/fs/cgroup/net_prio perf_event /sys/fs/cgroup/perf_event hugetlb /sys/fs/cgroup/hugetlb

我們可以看到,在/sys/fs下有一個(gè)cgroup的目錄,這個(gè)目錄下還有很多子目錄,比如: cpu,cpuset,memory,blkio……這些,這些都是cgroup的子系統(tǒng)。分別用于干不同的事的。

如果你沒(méi)有看到上述的目錄,你可以自己mount,下面給了一個(gè)示例:

1 2 3 4 5 6 7 8 mkdir cgroup mount -t tmpfs cgroup_root ./cgroup mkdir cgroup/cpuset mount -t cgroup -ocpuset cpuset ./cgroup/cpuset/ mkdir cgroup/cpu mount -t cgroup -ocpu cpu ./cgroup/cpu/ mkdir cgroup/memory mount -t cgroup -omemory memory ./cgroup/memory/

一旦mount成功,你就會(huì)看到這些目錄下就有好文件了,比如,如下所示的cpu和cpuset的子系統(tǒng):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 hchen@ubuntu:~$ ls /sys/fs/cgroup/cpu /sys/fs/cgroup/cpuset/ /sys/fs/cgroup/cpu: cgroup.clone_children? cgroup.sane_behavior? cpu.shares???????? release_agent cgroup.event_control?? cpu.cfs_period_us???? cpu.stat?????????? tasks cgroup.procs?????????? cpu.cfs_quota_us????? notify_on_release? user /sys/fs/cgroup/cpuset/: cgroup.clone_children? cpuset.mem_hardwall???????????? cpuset.sched_load_balance cgroup.event_control?? cpuset.memory_migrate?????????? cpuset.sched_relax_domain_level cgroup.procs?????????? cpuset.memory_pressure????????? notify_on_release cgroup.sane_behavior?? cpuset.memory_pressure_enabled? release_agent cpuset.cpu_exclusive?? cpuset.memory_spread_page?????? tasks cpuset.cpus??????????? cpuset.memory_spread_slab?????? user cpuset.mem_exclusive?? cpuset.mems

你可以到/sys/fs/cgroup的各個(gè)子目錄下去make個(gè)dir,你會(huì)發(fā)現(xiàn),一旦你創(chuàng)建了一個(gè)子目錄,這個(gè)子目錄里又有很多文件了。

1 2 3 4 5 hchen@ubuntu:/sys/fs/cgroup/cpu$ sudo mkdir haoel [sudo] password for hchen: hchen@ubuntu:/sys/fs/cgroup/cpu$ ls ./haoel cgroup.clone_children? cgroup.procs?????? cpu.cfs_quota_us? cpu.stat?????????? tasks cgroup.event_control?? cpu.cfs_period_us? cpu.shares??????? notify_on_release

好了,我們來(lái)看幾個(gè)示例。

CPU 限制

假設(shè),我們有一個(gè)非常吃CPU的程序,叫deadloop,其源碼如下:

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

用sudo執(zhí)行起來(lái)后,毫無(wú)疑問(wèn),CPU被干到了100%(下面是top命令的輸出)

1 2 PID USER????? PR? NI??? VIRT??? RES??? SHR S %CPU %MEM???? TIME+ COMMAND???? 3529 root????? 20?? 0??? 4196??? 736??? 656 R 99.6? 0.1?? 0:23.13 deadloop

然后,我們這前不是在/sys/fs/cgroup/cpu下創(chuàng)建了一個(gè)haoel的group。我們先設(shè)置一下這個(gè)group的cpu利用的限制:

1 2 3 hchen@ubuntu:~# cat /sys/fs/cgroup/cpu/haoel/cpu.cfs_quota_us -1 root@ubuntu:~# echo 20000 > /sys/fs/cgroup/cpu/haoel/cpu.cfs_quota_us

我們看到,這個(gè)進(jìn)程的PID是3529,我們把這個(gè)進(jìn)程加到這個(gè)cgroup中:

1 # echo 3529 >> /sys/fs/cgroup/cpu/haoel/tasks

然后,就會(huì)在top中看到CPU的利用立馬下降成20%了。(前面我們?cè)O(shè)置的20000就是20%的意思)

1 2 PID USER????? PR? NI??? VIRT??? RES??? SHR S %CPU %MEM???? TIME+ COMMAND???? 3529 root????? 20?? 0??? 4196??? 736??? 656 R 19.9? 0.1?? 8:06.11 deadloop

下面的代碼是一個(gè)線程的示例:

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 #define _GNU_SOURCE???????? /* See feature_test_macros(7) */ #include <pthread.h> #include <stdio.h> #include <stdlib.h> #include <sys/stat.h> #include <sys/types.h> #include <unistd.h> #include <sys/syscall.h> const int NUM_THREADS = 5; void *thread_main(void *threadid) { ????/* 把自己加入cgroup中(syscall(SYS_gettid)為得到線程的系統(tǒng)tid) */ ????char cmd[128]; ????sprintf(cmd, "echo %ld >> /sys/fs/cgroup/cpu/haoel/tasks", syscall(SYS_gettid)); ????system(cmd); ????sprintf(cmd, "echo %ld >> /sys/fs/cgroup/cpuset/haoel/tasks", syscall(SYS_gettid)); ????system(cmd); ????long tid; ????tid = (long)threadid; ????printf("Hello World! It's me, thread #%ld, pid #%ld!\n", tid, syscall(SYS_gettid)); ????? ????int a=0; ????while(1) { ????????a++; ????} ????pthread_exit(NULL); } int main (int argc, char *argv[]) { ????int num_threads; ????if (argc > 1){ ????????num_threads = atoi(argv[1]); ????} ????if (num_threads<=0 || num_threads>=100){ ????????num_threads = NUM_THREADS; ????} ????/* 設(shè)置CPU利用率為50% */ ????mkdir("/sys/fs/cgroup/cpu/haoel", 755); ????system("echo 50000 > /sys/fs/cgroup/cpu/haoel/cpu.cfs_quota_us"); ????mkdir("/sys/fs/cgroup/cpuset/haoel", 755); ????/* 限制CPU只能使用#2核和#3核 */ ????system("echo \"2,3\" > /sys/fs/cgroup/cpuset/haoel/cpuset.cpus"); ????pthread_t* threads = (pthread_t*) malloc (sizeof(pthread_t)*num_threads); ????int rc; ????long t; ????for(t=0; t<num_threads; t++){ ????????printf("In main: creating thread %ld\n", t); ????????rc = pthread_create(&threads[t], NULL, thread_main, (void *)t); ????????if (rc){ ????????????printf("ERROR; return code from pthread_create() is %d\n", rc); ????????????exit(-1); ????????} ????} ????/* Last thing that main() should do */ ????pthread_exit(NULL); ????free(threads); }

內(nèi)存使用限制

我們?cè)賮?lái)看一個(gè)限制內(nèi)存的例子(下面的代碼是個(gè)死循環(huán),其它不斷的分配內(nèi)存,每次512個(gè)字節(jié),每次休息一秒):

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 #include <stdio.h> #include <stdlib.h> #include <string.h> #include <sys/types.h> #include <unistd.h> int main(void) { ????int size = 0; ????int chunk_size = 512; ????void *p = NULL; ????while(1) { ????????if ((p = malloc(p, chunk_size)) == NULL) { ????????????printf("out of memory!!\n"); ????????????break; ????????} ????????memset(p, 1, chunk_size); ????????size += chunk_size; ????????printf("[%d] - memory is allocated [%8d] bytes \n", getpid(), size); ????????sleep(1); ????} ????return 0; }

然后,在我們另外一邊:

1 2 3 4 5 6 # 創(chuàng)建memory cgroup $ mkdir /sys/fs/cgroup/memory/haoel $ echo 64k > /sys/fs/cgroup/memory/haoel/memory.limit_in_bytes # 把上面的進(jìn)程的pid加入這個(gè)cgroup $ echo [pid] > /sys/fs/cgroup/memory/haoel/tasks

你會(huì)看到,一會(huì)上面的進(jìn)程就會(huì)因?yàn)閮?nèi)存問(wèn)題被kill掉了。

磁盤(pán)I/O限制

我們先看一下我們的硬盤(pán)IO,我們的模擬命令如下:(從/dev/sda1上讀入數(shù)據(jù),輸出到/dev/null上)

1 sudo dd if=/dev/sda1 of=/dev/null

我們通過(guò)iotop命令我們可以看到相關(guān)的IO速度是55MB/s(虛擬機(jī)內(nèi)):

1 2 TID? PRIO? USER???? DISK READ? DISK WRITE? SWAPIN???? IO>??? COMMAND????????? 8128 be/4 root?????? 55.74 M/s??? 0.00 B/s? 0.00 % 85.65 % dd if=/de~=/dev/null...

然后,我們先創(chuàng)建一個(gè)blkio(塊設(shè)備IO)的cgroup

1 mkdir /sys/fs/cgroup/blkio/haoel

并把讀IO限制到1MB/s,并把前面那個(gè)dd命令的pid放進(jìn)去(注:8:0 是設(shè)備號(hào),你可以通過(guò)ls -l /dev/sda1獲得):

1 2 root@ubuntu:~# echo '8:0 1048576'? > /sys/fs/cgroup/blkio/haoel/blkio.throttle.read_bps_device root@ubuntu:~# echo 8128 > /sys/fs/cgroup/blkio/haoel/tasks

再用iotop命令,你馬上就能看到讀速度被限制到了1MB/s左右。

1 2 TID? PRIO? USER???? DISK READ? DISK WRITE? SWAPIN???? IO>??? COMMAND????????? 8128 be/4 root????? 973.20 K/s??? 0.00 B/s? 0.00 % 94.41 % dd if=/de~=/dev/null...

CGroup的子系統(tǒng)

好了,有了以上的感性認(rèn)識(shí)我們來(lái),我們來(lái)看看control group有哪些子系統(tǒng):

    • blkio — 這???個(gè)???子???系???統(tǒng)???為???塊???設(shè)???備???設(shè)???定???輸???入???/輸???出???限???制???,比???如???物???理???設(shè)???備???(磁???盤(pán)???,固???態(tài)???硬???盤(pán)???,USB 等???等???)。
    • cpu — 這???個(gè)???子???系???統(tǒng)???使???用???調(diào)???度???程???序???提???供???對(duì)??? CPU 的??? cgroup 任???務(wù)???訪???問(wèn)???。???
    • cpuacct — 這???個(gè)???子???系???統(tǒng)???自???動(dòng)???生???成??? cgroup 中???任???務(wù)???所???使???用???的??? CPU 報(bào)???告???。???
    • cpuset — 這???個(gè)???子???系???統(tǒng)???為??? cgroup 中???的???任???務(wù)???分???配???獨(dú)???立??? CPU(在???多???核???系???統(tǒng)???)和???內(nèi)???存???節(jié)???點(diǎn)???。???
    • devices — 這???個(gè)???子???系???統(tǒng)???可???允???許???或???者???拒???絕??? cgroup 中???的???任???務(wù)???訪???問(wèn)???設(shè)???備???。???
    • freezer — 這???個(gè)???子???系???統(tǒng)???掛???起???或???者???恢???復(fù)??? cgroup 中???的???任???務(wù)???。???
    • memory — 這???個(gè)???子???系???統(tǒng)???設(shè)???定??? cgroup 中???任???務(wù)???使???用???的???內(nèi)???存???限???制???,并???自???動(dòng)???生???成?????內(nèi)???存???資???源使用???報(bào)???告???。???
    • net_cls — 這???個(gè)???子???系???統(tǒng)???使???用???等???級(jí)???識(shí)???別???符???(classid)標(biāo)???記???網(wǎng)???絡(luò)???數(shù)???據(jù)???包???,可???允???許??? Linux 流???量???控???制???程???序???(tc)識(shí)???別???從???具???體??? cgroup 中???生???成???的???數(shù)???據(jù)???包???。???
    • net_prio — 這個(gè)子系統(tǒng)用來(lái)設(shè)計(jì)網(wǎng)絡(luò)流量的優(yōu)先級(jí)
    • hugetlb — 這個(gè)子系統(tǒng)主要針對(duì)于HugeTLB系統(tǒng)進(jìn)行限制,這是一個(gè)大頁(yè)文件系統(tǒng)。

???

注意,你可能在Ubuntu 14.04下看不到net_cls和net_prio這兩個(gè)cgroup,你需要手動(dòng)mount一下:

1 2 3 4 5 6 7 $ sudo modprobe cls_cgroup $ sudo mkdir /sys/fs/cgroup/net_cls $ sudo mount -t cgroup -o net_cls none /sys/fs/cgroup/net_cls $ sudo modprobe netprio_cgroup $ sudo mkdir /sys/fs/cgroup/net_prio $ sudo mount -t cgroup -o net_prio none /sys/fs/cgroup/net_prio

關(guān)于各個(gè)子系統(tǒng)的參數(shù)細(xì)節(jié),以及更多的Linux CGroup的文檔,你可以看看下面的文檔:

  • Linux Kernel的官方文檔
  • Redhat的官方文檔

CGroup的術(shù)語(yǔ)

CGroup有下述術(shù)語(yǔ):

  • 任務(wù)(Tasks):就是系統(tǒng)的一個(gè)進(jìn)程。
  • 控制組(Control Group):一組按照某種標(biāo)準(zhǔn)劃分的進(jìn)程,比如官方文檔中的Professor和Student,或是WWW和System之類(lèi)的,其表示了某進(jìn)程組。Cgroups中的資源控制都是以控制組為單位實(shí)現(xiàn)。一個(gè)進(jìn)程可以加入到某個(gè)控制組。而資源的限制是定義在這個(gè)組上,就像上面示例中我用的haoel一樣。簡(jiǎn)單點(diǎn)說(shuō),cgroup的呈現(xiàn)就是一個(gè)目錄帶一系列的可配置文件。
  • 層級(jí)(Hierarchy):控制組可以組織成hierarchical的形式,既一顆控制組的樹(shù)(目錄結(jié)構(gòu))。控制組樹(shù)上的子節(jié)點(diǎn)繼承父結(jié)點(diǎn)的屬性。簡(jiǎn)單點(diǎn)說(shuō),hierarchy就是在一個(gè)或多個(gè)子系統(tǒng)上的cgroups目錄樹(shù)。
  • 子系統(tǒng)(Subsystem):一個(gè)子系統(tǒng)就是一個(gè)資源控制器,比如CPU子系統(tǒng)就是控制CPU時(shí)間分配的一個(gè)控制器。子系統(tǒng)必須附加到一個(gè)層級(jí)上才能起作用,一個(gè)子系統(tǒng)附加到某個(gè)層級(jí)以后,這個(gè)層級(jí)上的所有控制族群都受到這個(gè)子系統(tǒng)的控制。Cgroup的子系統(tǒng)可以有很多,也在不斷增加中。

下一代的CGroup

上面,我們可以看到,CGroup的一些常用方法和相關(guān)的術(shù)語(yǔ)。一般來(lái)說(shuō),這樣的設(shè)計(jì)在一般情況下還是沒(méi)什么問(wèn)題的,除了操作上的用戶(hù)體驗(yàn)不是很好,但基本滿足我們的一般需求了。

不過(guò),對(duì)此,有個(gè)叫Tejun Heo的同學(xué)非常不爽,他在Linux社區(qū)里對(duì)cgroup吐了一把槽,還引發(fā)了內(nèi)核組的各種討論。

對(duì)于Tejun Heo同學(xué)來(lái)說(shuō),cgroup設(shè)計(jì)的相當(dāng)糟糕。他給出了些例子,大意就是說(shuō),如果有多種層級(jí)關(guān)系,也就是說(shuō)有多種對(duì)進(jìn)程的分類(lèi)方式,比如,我們可以按用戶(hù)來(lái)分,分成Professor和Student,同時(shí),也有按應(yīng)用類(lèi)似來(lái)分的,比如WWW和NFS等。那么,當(dāng)一個(gè)進(jìn)程即是Professor的,也是WWW的,那么就會(huì)出現(xiàn)多層級(jí)正交的情況,從而出現(xiàn)對(duì)進(jìn)程上管理的混亂。另外,一個(gè)case是,如果有一個(gè)層級(jí)A綁定cpu,而層級(jí)B綁定memory,還有一個(gè)層級(jí)C綁定cputset,而有一些進(jìn)程有的需要AB,有的需要AC,有的需要ABC,管理起來(lái)就相當(dāng)不易。

層級(jí)操作起來(lái)比較麻煩,而且如果層級(jí)變多,更不易于操作和管理,雖然那種方式很好實(shí)現(xiàn),但是在使用上有很多的復(fù)雜度。你可以想像一個(gè)圖書(shū)館的圖書(shū)分類(lèi)問(wèn)題,你可以有各種不同的分類(lèi),分類(lèi)和圖書(shū)就是一種多對(duì)多的關(guān)系。

所以,在Kernel 3.16后,引入了unified hierarchy的新的設(shè)計(jì),這個(gè)東西引入了一個(gè)叫__DEVEL__sane_behavior的特性(這個(gè)名字很明顯意味目前還在開(kāi)發(fā)試驗(yàn)階段),它可以把所有子系統(tǒng)都掛載到根層級(jí)下,只有葉子節(jié)點(diǎn)可以存在tasks,非葉子節(jié)點(diǎn)只進(jìn)行資源控制。

我們mount一下看看:

1 2 3 4 5 6 7 $ sudo mount -t cgroup -o __DEVEL__sane_behavior cgroup ./cgroup $ ls ./cgroup cgroup.controllers? cgroup.procs? cgroup.sane_behavior? cgroup.subtree_control $ cat ./cgroup/cgroup.controllers cpuset cpu cpuacct memory devices freezer net_cls blkio perf_event net_prio hugetlb

我們可以看到有四個(gè)文件,然后,你在這里mkdir一個(gè)子目錄,里面也會(huì)有這四個(gè)文件。上級(jí)的cgroup.subtree_control控制下級(jí)的cgroup.controllers。

舉個(gè)例子:假設(shè)我們有以下的目錄結(jié)構(gòu),b代表blkio,m代碼memory,其中,A是root,包括所有的子系統(tǒng)()。

1 2 3 4 5 6 7 8 9 10 11 12 13 # A(b,m) - B(b,m) - C (b) #?????????????? \ - D (b) - E # 下面的命令中, +表示enable, -表示disable # 在B上的enable blkio # echo +blkio > A/cgroup.subtree_control # 在C和D上enable blkio # echo +blkio > A/B/cgroup.subtree_control # 在B上enable memory? # echo +memory > A/cgroup.subtree_control

在上述的結(jié)構(gòu)中,

  • cgroup只有上線控制下級(jí),無(wú)法傳遞到下下級(jí)。所以,C和D中沒(méi)有memory的限制,E中沒(méi)有blkio和memory的限制。而本層的cgroup.controllers文件是個(gè)只讀的,其中的內(nèi)容就看上級(jí)的subtree_control里有什么了。
  • 任何被配置過(guò)subtree_control的目錄都不能綁定進(jìn)程,根結(jié)點(diǎn)除外。所以,A,C,D,E可以綁上進(jìn)程,但是B不行。

我們可以看到,這種方式干凈的區(qū)分開(kāi)了兩個(gè)事,一個(gè)是進(jìn)程的分組,一個(gè)是對(duì)分組的資源控制(以前這兩個(gè)事完全混在一起),在目錄繼承上增加了些限制,這樣可以避免一些模棱兩可的情況。

當(dāng)然,這個(gè)事還在演化中,cgroup的這些問(wèn)題這個(gè)事目前由cgroup的吐槽人Tejun Heo和華為的Li Zefan同學(xué)負(fù)責(zé)解決中。總之,這是一個(gè)系統(tǒng)管理上的問(wèn)題,而且改變會(huì)影響很多東西,但一旦方案確定,老的cgroup方式將一去不復(fù)返。

參考

  • Linux Kernel Cgroup Documents
  • Reahat Resource Management Guide
  • Fixing control groups
  • The unified control group hierarchy in 3.16
  • Cgroup v2(PDF)

(全文完)

轉(zhuǎn)載于:https://www.cnblogs.com/zhengran/p/4587659.html

總結(jié)

以上是生活随笔為你收集整理的[转载] linux cgroup的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。

如果覺(jué)得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。