Cgroup 研究报告
Control Groups (Cgroups) 是 Red Hat Enterprise Linux 6 (以后簡(jiǎn)稱(chēng) RHEL6) 提供的一項(xiàng)內(nèi)核功能。Cgroup是將任意進(jìn)程進(jìn)行分組化管理的內(nèi)核功能。
Cgroup提供了一個(gè)cgroup虛擬文件系統(tǒng),作為進(jìn)行分組管理和各子系統(tǒng)設(shè)置的用戶(hù)接口。因此,要使用cgroup,必須先掛載cgroup文件系統(tǒng):
我們可以使用 Cgroups 為任務(wù)(進(jìn)程)分配資源,例如 CPU 時(shí)間、系統(tǒng)內(nèi)存、網(wǎng)絡(luò)帶寬等。我們可以對(duì) Cgroups 進(jìn)行監(jiān)控,禁止 Cgroups 控制下的進(jìn)程訪問(wèn)某些資源,還可以在一個(gè)運(yùn)行中的系統(tǒng)中對(duì) Cgroups 動(dòng)態(tài)地進(jìn)行配置。cgconfig ( control group config ) 是一項(xiàng)系統(tǒng)服務(wù),它可以根據(jù)配置文件創(chuàng)建 Cgroups,我們可以通過(guò)它在每次重啟操作系統(tǒng)之后保持一致的 Cgroups 配置。
Cgroup子系統(tǒng)
Cgroups 的組織結(jié)構(gòu)為層次體系(目錄樹(shù)),Cgroups有多棵目錄樹(shù),每棵樹(shù)對(duì)應(yīng)一個(gè)或多個(gè)子系統(tǒng)(一個(gè)子系統(tǒng)表示一個(gè)單一的資源)。目前Cgroups提供了9個(gè)子系統(tǒng):
- blkio- 該子系統(tǒng)限制塊設(shè)備的輸入輸出訪問(wèn);
- cpu- 該子系統(tǒng)調(diào)度cgroup中進(jìn)程的cpu訪問(wèn);
- cpuacct- 該子系統(tǒng)生成cgroup中的任務(wù)使用cpu資源的報(bào)告;
- cpuset- 該子系統(tǒng)用于將cpu和內(nèi)存節(jié)點(diǎn)指定給cgroup中的任務(wù);
- devices- 該子系統(tǒng)用于限制cgroup中任務(wù)對(duì)設(shè)備的訪問(wèn)權(quán)限;
- freezer- 該子系統(tǒng)可以暫停和繼續(xù)cgroup中的任務(wù)
- memory- 該子系統(tǒng)用于設(shè)定cgroup中任務(wù)使用的內(nèi)存限額,并生成內(nèi)存資源報(bào)告
- net_cls- network classifer cgroup使用等級(jí)標(biāo)識(shí)符classid標(biāo)記網(wǎng)絡(luò)數(shù)據(jù)包
- net_prio- 該子系統(tǒng)可以動(dòng)態(tài)設(shè)置每個(gè)網(wǎng)卡的優(yōu)先級(jí)
Cgroup層級(jí)
/cgroup(或者/sys/fs/cgroup)根目錄下的每個(gè)文件夾都是一個(gè)層級(jí),通常的默認(rèn)配置喜歡把子系統(tǒng)(如blkio)掛載到同名(如blkio)的層級(jí)上,這樣我們通常可以在/cgroup(或者/sys/fs/cgroup)根目錄下看到幾個(gè)名為blkio, cpu, cpuacct, cpuset, memory, devices的文件夾,這些文件夾就是一個(gè)個(gè)層級(jí),層級(jí)上再掛載子系統(tǒng)。其實(shí)層級(jí)的名字可以隨便起哦,層級(jí)名不需要和子系統(tǒng)相同。可以把多個(gè)子系統(tǒng)掛到一個(gè)層級(jí)上(類(lèi)似于多個(gè)設(shè)備同時(shí)掛載到一個(gè)目錄上),但是一個(gè)子系統(tǒng)不能掛到多個(gè)層級(jí)上,會(huì)提示already mounted or busy(類(lèi)似于不能把一個(gè)設(shè)備同時(shí)掛載到多個(gè)目錄下)。
(1) 一個(gè)層級(jí)結(jié)構(gòu)可以關(guān)聯(lián)一個(gè)或多個(gè)子系統(tǒng)(結(jié)果是,cpu和?memory子系統(tǒng)都掛載到一個(gè)層級(jí)名為cpu_mem_cg的層級(jí)上了)
?
(2) 任何單個(gè)子系統(tǒng)不可以被掛載到兩個(gè)及以上的層次結(jié)構(gòu)(結(jié)果是,cpu子系統(tǒng)永遠(yuǎn)無(wú)法附加到兩個(gè)不同的層級(jí)中)??
(3) 一個(gè)任務(wù)不能同時(shí)屬于同一個(gè)層次結(jié)構(gòu)中的兩個(gè) cgroup。
?
(4) 當(dāng) cgroups 中的一個(gè)任務(wù) fork 出一個(gè)新任務(wù)時(shí),新任務(wù)自動(dòng)繼承其父任務(wù)的 cgroup 關(guān)系。但是,新任務(wù)與父任務(wù)之間是完全獨(dú)立的,新任務(wù)可以被移動(dòng)到其他的 cgroups 。
?
Cgroup創(chuàng)建層級(jí)實(shí)例
(1) 首先創(chuàng)建一個(gè)目錄,作為層級(jí)結(jié)構(gòu)的根:
mkdir /sys/fs/cgroup/cpu_and_mem(2) 接著掛載cgroup相應(yīng)的子系統(tǒng)到該層次結(jié)構(gòu)下:
mount -t cgroup -o cpu,cpuset,memory cpu_and_mem /sys/fs/cgroup/cpu_and_mem(3) 使用lssubsys來(lái)查看當(dāng)前已經(jīng)掛載了的子系統(tǒng):
# lssubsys -amcpu,cpuset,memory /sys/fs/cgroup/cpu_and_memblkiocpuacctdevicesfreezer(4) 修改掛載的子系統(tǒng),如現(xiàn)要將cpu_and_mem組也關(guān)聯(lián)到cpuacct中:
mount -t cgroup -o remount,cpu,cpuacct,cpuset,memory cpu_and_mem /sys/fs/cgroup/cpu_and_mem(5) 如果要?jiǎng)h除一個(gè)層級(jí)結(jié)構(gòu)(目錄樹(shù)),直接umount相應(yīng)的掛載點(diǎn):
umount /sys/fs/cgroup/cpu_and_memCgroup創(chuàng)建進(jìn)程組實(shí)例
上面,已經(jīng)創(chuàng)建了一個(gè)層級(jí)結(jié)構(gòu),即進(jìn)程組的父目錄,接下來(lái)就可以在該結(jié)構(gòu)下創(chuàng)建group了。
(1) 創(chuàng)建組
mkdir /sys/fs/cgroup/cpu/lab1/group1mkdir /sys/fs/cgroup/cpuset/lab1/group1(2) 此時(shí),cpu/lab1/group1的目錄里已經(jīng)自動(dòng)生成了許多文件,文件名前綴為cgroup的是由cgroup的基礎(chǔ)結(jié)構(gòu)提供的特殊文件;前綴為cpu的是由cpu子系統(tǒng)提供的特殊文件。在這些特殊的文件中,最重要的是tasks文件,其記錄了屬于這個(gè)分組的PID。
(3) 在cgroup文件系統(tǒng)中,一個(gè)目錄就是一個(gè)分組。每個(gè)分組都是一系列線程的集合。cgroup/cpu, cgroup/blkio, cgroup/cpuset等等,這些目錄是每個(gè)子系統(tǒng)的根目錄,其tasks默認(rèn)包含了當(dāng)前系統(tǒng)所有進(jìn)程的PID。不過(guò),當(dāng)cpu,cpuset,blkio等目錄下又有子目錄時(shí),子目錄有自己的tasks,此時(shí),父tasks會(huì)遷移一些進(jìn)程到子tasks里去
Cgroup虛擬文件系統(tǒng)的掛載與卸載
(1) 可以通過(guò)/proc/cgroups查看系統(tǒng)支持的cgroup子系統(tǒng),其中hierarchy項(xiàng)為0表明該子系統(tǒng)尚未掛載,非0表示已經(jīng)掛載。若hierarchy項(xiàng)值相同的子系統(tǒng)表明這些子系統(tǒng)對(duì)應(yīng)到同一層級(jí)結(jié)構(gòu)(同一目錄)。?
?
(2) 可以使用lssubsys命令(libcgroup工具集)來(lái)更清晰的查看當(dāng)前cgroup子系統(tǒng)的掛載情況和掛載點(diǎn)信息:
?
?
(3) 卸載cgroup子系統(tǒng)
a)先把各子系統(tǒng)目錄下的group依次從底層刪除,使用cgclear命令(也屬于libcgroup工具集)。
b)依次將lssubsys中的各個(gè)掛載點(diǎn)umount掉。
c)必須先刪除再u(mài)mount,否則如果直接umount雖然目錄沒(méi)有了,但其實(shí)并沒(méi)有umount成功,通過(guò)/proc/cgroup可以看到它的hierarchy項(xiàng)非0。
d)如果沒(méi)有umount成功,應(yīng)該先再把該子系統(tǒng)mount到一個(gè)目錄上,然后依次把沒(méi)有rmdir的目錄先全部rm了,再u(mài)mount。
(4) 掛載cgroup子系統(tǒng)??
添加子目錄 創(chuàng)建一個(gè)cgroup,在剛才mount的目錄下:
mkdir /cgroup/cgtest這樣就創(chuàng)建了一個(gè)cgroup(該操作相對(duì)的是rmdir,即只有把該cgroup內(nèi)的tasks移到top group才能真正將一個(gè)cgroup刪除掉),此時(shí)可以看到新目錄下已經(jīng)有許多文件了。
libcgroup工具
libcgroup工具集安裝
使用cgroup的最簡(jiǎn)單的方法是安裝libcgroup工具集。雖然可以使用shell命令來(lái)掛載和設(shè)定cgroup。但是,使用libcgroup工具可簡(jiǎn)化過(guò)程并擴(kuò)展功能。
redhat系:
debian系:
sudo apt-get install cgroup-bincgroup服務(wù)的啟動(dòng)和停止(cgroup啟動(dòng)時(shí)會(huì)自動(dòng)讀取配置文件/etc/cgconfg.conf,根據(jù)其內(nèi)容創(chuàng)建和掛載指定的cgroup子系統(tǒng)):
service cgconfig start|stopcgconfig配置文件分析
/etc/cgconfig.conf是cgroup配置工具libcgroup用來(lái)進(jìn)行cgroup組的定義,參數(shù)設(shè)定以及掛載點(diǎn)定義的配置文件,主要由mount和group兩個(gè)section構(gòu)成。 (1) mount section的語(yǔ)法格式如下:
mount { <controller> = <path>; ... }controller:內(nèi)核子系統(tǒng)的名稱(chēng)
path:該子系統(tǒng)的掛載點(diǎn)
舉個(gè)列子:
mount { cpuset = /cgroup/red; }上面定義相當(dāng)于如下shell指令:
mkdir /cgroup/red mount -t cgroup -o cpuset red /cgroup/red(2) group section的格式如下:
group <name> { [<permissions>] <controller> { <param name> = <param value>; … } … }name: 指定cgroup的名稱(chēng)
permissions:可選項(xiàng),指定cgroup對(duì)應(yīng)的掛載點(diǎn)文件系統(tǒng)的權(quán)限,root用戶(hù)擁有所有權(quán)限。 controller:子系統(tǒng)的名稱(chēng)
param name 和 param value:子系統(tǒng)的屬性及其屬性值
舉個(gè)列子:
group daemons/www { ## 定義daemons/www(web服務(wù)器進(jìn)程)組 perm { ## 定義這個(gè)組的權(quán)限task {uid = root;gid = webmaster;}admin {uid = root;gid = root;}}cpu { ## 定義cpu子系統(tǒng)的屬性及其值,即屬于詞組的任務(wù)的權(quán)重為1000cpu.shares = 1000;}}上面的配置文件相當(dāng)于執(zhí)行了如下的shell命令:
mkdir /mnt/cgroups/cpu/daemons mkdir /mnt/cgroups/cpu/daemons/www chown root:root /mnt/cgroups/cpu/daemons/www/* chown root:webmaster /mnt/cgroups/cpu/daemons/www/tasks echo 1000 > /mnt/cgroups/cpu/daemons/www/cpu.sharesCgroup子系統(tǒng)介紹
blkio子系統(tǒng)
blkio子系統(tǒng)控制并監(jiān)控cgroup中的任務(wù)對(duì)塊設(shè)備的I/O訪問(wèn)。在部分這樣的偽文件中寫(xiě)入值可限制訪問(wèn)或者帶寬,且從這些偽文件中讀取值可提供I/O操作信息。
blkio.weight:?指定cgroup默認(rèn)可用訪問(wèn)塊I/O 的相對(duì)比例(加權(quán)),范圍在100~1000。這個(gè)值可由具體設(shè)備的blkio.weight_device參數(shù)覆蓋。
舉個(gè)列子:將cgroup訪問(wèn)塊設(shè)備的默認(rèn)加權(quán)設(shè)定為500
blkio.weight_device:指定對(duì)cgroup中可用的?具體設(shè)備?I/O訪問(wèn)的相對(duì)比例(加權(quán)),范圍是100~1000。這個(gè)值的格式為主設(shè)備號(hào):從設(shè)備號(hào) 權(quán)值。
舉個(gè)例子:為訪問(wèn)/dev/sda的cgroup分配加權(quán)500
blkio.time:報(bào)告cgroup對(duì)具體設(shè)備的I/O訪問(wèn)時(shí)間。條目有三個(gè)字段主設(shè)備號(hào):從設(shè)備號(hào) 時(shí)間(ms)
echo 8:0 1500 > blkio.timeCPU子系統(tǒng)
CPU子系統(tǒng)調(diào)度對(duì)cgroup的CPU訪問(wèn)。可根據(jù)以下參數(shù)調(diào)度對(duì)CPU資源的訪問(wèn),每個(gè)參數(shù)都獨(dú)立存在于cgroup虛擬文件系統(tǒng)的偽文件中。
cpu.shares:指定在cgroup中的進(jìn)程可用的相對(duì)共享CPU時(shí)間的整數(shù)值。
舉個(gè)例子:在兩個(gè)cgroup中都將cpu.shares設(shè)定為1的任務(wù)將有相同的CPU時(shí)間,但在cgroup中將cpu.shares設(shè)定為2的任務(wù)可使用的CPU時(shí)間是在cgroup中將cpu.shares設(shè)定為1的任務(wù)可使用的CPU時(shí)間的兩倍。
cpu.rt_runtime_us:指定在某個(gè)時(shí)間段中cgroup中的任務(wù)對(duì)CPU資源的最長(zhǎng)連續(xù)訪問(wèn)時(shí)間。這個(gè)屬性是為了訪問(wèn)一個(gè)cgroup中的進(jìn)程獨(dú)占CPU時(shí)間。
舉個(gè)例子:如果cgroup中的任務(wù)應(yīng)該可以每5秒中有4秒時(shí)間訪問(wèn)CPU資源,需要將cpu.rt_runtime_us設(shè)定為4000000,并將cpu.rt_period_us設(shè)定為5000000。
cpu.rt_period_us:配合上例使用,設(shè)定時(shí)間段的長(zhǎng)度。
cpuacct子系統(tǒng)
CPU Accounting(cpuacct)子???系???統(tǒng)???自???動(dòng)???生???成??? cgroup 中???任???務(wù)???所???使???用???的??? CPU 資???源???報(bào)???告???,其???中???包???括???子???組???群???中???的???任???務(wù)???。
cpuacct.stat:報(bào)???告???這???個(gè)??? cgroup 及???其???子???組???群???中???的???任???務(wù)???使???用???用???戶(hù)???模???式???和???系???統(tǒng)???(內(nèi)???核???)模???式???消???耗???的??? CPU 循???環(huán)???數(shù)???(單???位???由???系???統(tǒng)???中???的??? USER_HZ 定???義???)。
cpuacct.usage:報(bào)???告???這???個(gè)??? cgroup 中???所???有???任???務(wù)???(包???括???層???級(jí)???中???的???低???端???任???務(wù)???)消???耗???的???總??? CPU 時(shí)???間???(納???秒???)。
cpuacct.usage_percpu:報(bào)???告???這???個(gè)??? cgroup 中???所???有???任???務(wù)???(包???括???層???級(jí)???中???的???低???端???任???務(wù)???)在???每???個(gè)??? CPU 中???消???耗???的??? CPU 時(shí)???間???(以???納???秒???為???單???位???)。
cpuset
cpuset子系統(tǒng)為cgroup分配獨(dú)立CPU和內(nèi)存節(jié)點(diǎn)。可根據(jù)以下參數(shù)指定每個(gè)cpuset,每個(gè)參數(shù)都在控制組群虛擬文件系統(tǒng)中有單獨(dú)的偽文件:
cpuset.cpus:指定允許這個(gè)cgroup中任務(wù)訪問(wèn)的CPU。這是一個(gè)用都好分開(kāi)的列表,使用小橫線(“-”)代表范圍。
舉個(gè)列子:echo 0-2,16 > cpuset.cpus 代表該cgroup可以使用CPU 0,1,2,16
cpuset.mems:指定允許這個(gè)cgroup中任務(wù)可訪問(wèn)的內(nèi)存節(jié)點(diǎn)。
總結(jié)
以上是生活随笔為你收集整理的Cgroup 研究报告的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: QEMU KVM 虚拟机移植之性能提高篇
- 下一篇: 退出出库复核是什么意思_细思极恐!为什么