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

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

生活随笔

當(dāng)前位置: 首頁(yè) > 编程资源 > 编程问答 >内容正文

编程问答

Cgroup 研究报告

發(fā)布時(shí)間:2025/3/15 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 Cgroup 研究报告 小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

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):

mount -t cgroup -o 子系統(tǒng)名 層級(jí)名(目錄名) /sys/fs/cgroup/層級(jí)名(目錄名)

我們可以使用 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_mem

Cgroup創(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系:

yum install libcgroup

debian系:

sudo apt-get install cgroup-bin

cgroup服務(wù)的啟動(dòng)和停止(cgroup啟動(dòng)時(shí)會(huì)自動(dòng)讀取配置文件/etc/cgconfg.conf,根據(jù)其內(nèi)容創(chuàng)建和掛載指定的cgroup子系統(tǒng)):

service cgconfig start|stop

cgconfig配置文件分析

/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.shares

Cgroup子系統(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

echo 500 > blkio.weight

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

echo 8:0 500 > blkio.weight_device

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.time

CPU子系統(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)題。

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