国产成人精品18p,天天干成人网,无码专区狠狠躁天天躁,美女脱精光隐私扒开免费观看

Docker核心原理之 Cgroup詳解

發(fā)布時(shí)間:2021-08-15 18:37 來(lái)源: 閱讀:0 作者:聽(tīng)風(fēng)TF 欄目: 服務(wù)器 歡迎投稿:712375056

內核中強大的工具cgroup,不僅可以限制被NameSpace隔離起來(lái)的資源,還可以為資源設置權重,計算用量等

什么是cgroup

cgroup全稱(chēng)是control groups

control groups:控制組,被整合在了linux內核當中,把進(jìn)程(tasks)放到組里面,對組設置權限,對進(jìn)程進(jìn)行控制??梢岳斫鉃橛脩?hù)和組的概念,用戶(hù)會(huì )繼承它所在組的權限。

cgroups是linux內核中的機制,這種機制可以根據特定的行為把一系列的任務(wù),子任務(wù)整合或者分離,按照資源劃分的等級的不同,從而實(shí)現資源統一控制的框架,cgroup可以控制、限制、隔離進(jìn)程所需要的物理資源,包括cpu、內存、IO,為容器虛擬化提供了最基本的保證,是構建docker一系列虛擬化的管理工具

對于開(kāi)發(fā)cgroup的特點(diǎn)

API:實(shí)現管理

cgroup管理可以管理到線(xiàn)程界別

所有線(xiàn)程功能都是subsystem(子系統)統一的管理方式

子進(jìn)程和父進(jìn)程在一個(gè)cgroup里面,只需要控制父進(jìn)程就可以

cgroup的作用

cgroup的內核通過(guò)hook鉤子來(lái)實(shí)現管理進(jìn)程資源,提供了一個(gè)統一的接口,從單個(gè)進(jìn)程的資源控制到操作系統層面的虛擬卡的過(guò)渡

cgroup提供了四個(gè)功能:

  1. 資源控制:cgroup通過(guò)進(jìn)程組對資源總額進(jìn)行限制。如:程序使用內存時(shí),要為程序設定可以使用主機的多少內存,也叫作限額
  2. 優(yōu)先級分配:使用硬件的權重值。當兩個(gè)程序都需要進(jìn)程讀取cpu,哪個(gè)先哪個(gè)后,通過(guò)優(yōu)先級來(lái)進(jìn)行控制
  3. 資源統計:可以統計硬件資源的用量,如:cpu、內存…使用了多長(cháng)時(shí)間
  4. 進(jìn)程控制:可以對進(jìn)程組實(shí)現掛起/恢復的操作,

術(shù)語(yǔ)表

  • task:表示系統中的某一個(gè)進(jìn)程—PID
  • cgroup:資源控制,以控制組(cgroup)為單位實(shí)現,cgroup中有都是task,可以有多個(gè)cgroup組,可以限制不同的內容,組名不能相同。
  • subsystem:子系統。資源調度控制器。具體控制內容。如:cpu的子系統控制cpu的時(shí)間分配,內存的子系統可以控制某個(gè)cgroup內的內存使用量,硬盤(pán)的子系統,可以控制硬盤(pán)的讀寫(xiě)等等。
  • hierarchy:層級樹(shù),一堆cgroup構成,包含多個(gè)cgroup的叫層級樹(shù),,每個(gè)hierarchy通過(guò)綁定的子系統對資源進(jìn)行調度,可以包含0個(gè)或多個(gè)子節點(diǎn),子節點(diǎn)繼承父節點(diǎn)的屬性,整個(gè)系統可以有多個(gè)hierarchy,是一個(gè)邏輯概念

關(guān)系:一個(gè)cgroup里可以有多個(gè)task,subsystem相當于控制cgroup限制的類(lèi)型, hierarchy里可以有多個(gè)cgroup,一個(gè)系統可以有多個(gè)hierarchy。

層級樹(shù)的四大規則

傳統的進(jìn)程啟動(dòng),是以init為根節點(diǎn),也叫父進(jìn)程,由它來(lái)創(chuàng )建子進(jìn)程,作為子節點(diǎn),而每個(gè)子節點(diǎn)還可以創(chuàng )建新的子節點(diǎn),這樣構成了樹(shù)狀結構。而cgroup的結構跟他類(lèi)似的。子節點(diǎn)繼承父節點(diǎn)的屬性。他們最大的不同在于,系統的cgroup構成的層級樹(shù)允許有多個(gè)存在,如果進(jìn)程模型是init為根節點(diǎn)形成一個(gè)樹(shù),那cgroup的模型由多個(gè)層級樹(shù)來(lái)構成。

如果只有一個(gè)層級樹(shù),所有的task都會(huì )受到一個(gè)subsystem的相同的限制,會(huì )給不需要這種限制的task造成麻煩

1.同一個(gè)層級樹(shù)(hierarchy)可以附加一個(gè)或多個(gè)子系統(subsystem)

可以看到在一個(gè)層級樹(shù)中,有一個(gè)cpu_mem_cg的cgroup組下還有兩個(gè)子節點(diǎn)cg1和cg2,如圖所示,也就意味著(zhù)在cpu_mem_cg的組中,附加了cpu和mem內存兩個(gè)子系統,同時(shí)來(lái)控制cg1和cg2的cpu和內存的硬件資源使用

2.一個(gè)子系統(subsystem)可以附加到多個(gè)層級樹(shù)(hierarchy)中,但是僅僅是可以附加到多個(gè)沒(méi)有任何子系統的層級樹(shù)中。

如圖所示,cpu子系統先附加到層級樹(shù)A上,同時(shí)就不能附加到層級樹(shù)B上,因為B上已經(jīng)有了一個(gè)mem子系統,如果B和A同時(shí)都是沒(méi)有任何子系統時(shí),這時(shí),cpu子系統可以同時(shí)附加到A和B兩個(gè)層級樹(shù)中

言外之意就是,如果多個(gè)層級樹(shù)中都沒(méi)有子系統,這個(gè)時(shí)候一個(gè)cpu子系統依次可以附加到這些層級樹(shù)中

3.一個(gè)進(jìn)程(task)不能屬于同一個(gè)層級樹(shù)(hierarchy)的不同cgroup

系統每次新建一個(gè)層級樹(shù)(hierarchy)時(shí),默認的構成了新的層級樹(shù)的初始化的cgroup,這個(gè)cgroup被稱(chēng)為root cgroup,對于你自己成功的層級樹(shù)(hierarchy)來(lái)說(shuō),task只能存在這個(gè)層級樹(shù)的一個(gè)cgroup當中,意思就是一個(gè)層級樹(shù)中不能出現兩個(gè)相同的task,但是它可以存在不同的層級樹(shù)中的其他cgroup。

如果要將一個(gè)層級樹(shù)cgroup中的task添加到這個(gè)層級樹(shù)的其他cgroup時(shí),會(huì )被從之前task所在的cgroup移除

如以上圖中示例:

httpd已經(jīng)加入到層級樹(shù)(hierarchy)A中的cg1中,且pid為58950,此時(shí)就不能將這個(gè)httpd進(jìn)程放入到cg2中,不然cg1中的httpd進(jìn)程就會(huì )被刪除,但是可以放到層級樹(shù)(hierarchy)B的cg3控制組中

其實(shí)是為了防止出現進(jìn)程矛盾,如:在層級樹(shù)A中的cg1中存在httpd進(jìn)程,這時(shí)cpu對cg1的限制使用率為30%,cg2的限制使用率為50%,如果再將httpd進(jìn)程添加到cg2中,這時(shí)httpd的cpu使用率限制就有了矛盾。

4.剛fork出的子進(jìn)程在初始狀態(tài)與父進(jìn)程處于同一個(gè)cgroup

進(jìn)程task新開(kāi)的一個(gè)子進(jìn)程(child_task)默認是和原來(lái)的task在同一個(gè)cgroup中,但是child_task允許被移除到該層級樹(shù)的其他不同的cgroup中。

當fork剛完成之后,父進(jìn)程和子進(jìn)程是完全獨立的

如圖中所示中,httpd58950進(jìn)程,當有人訪(fǎng)問(wèn)時(shí),會(huì )fork出另外一個(gè)子進(jìn)程httpd58951,這個(gè)時(shí)候默認httpd58951和httpd58950都在cg1中,他們的關(guān)系也是父子進(jìn)程,httpd58951是可以移動(dòng)到cg2中,這時(shí)候就改變了他們的關(guān)系,都變?yōu)榱霜毩⒌倪M(jìn)程。

Subsystem子系統

subsystem究竟可以控制什么東西

通過(guò)以下的操作來(lái)驗證

[root@localhost ~]# yum -y install libcgroup-tools
安裝這個(gè)工具后就看可以通過(guò)使用cgroup命令來(lái)查看

列出系統中所有的cgroup控制組

[root@localhost ~]# lscgroup
net_cls,net_prio:/
freezer:/
hugetlb:/
cpu,cpuacct:/
cpu,cpuacct:/machine.slice
cpu,cpuacct:/user.slice
cpu,cpuacct:/system.slice
cpu,cpuacct:/system.slice/network.service
cpu,cpuacct:/system.slice/docker.service
...

查看subsystem可以控制的硬件

[root@localhost ~]# lssubsys -a
cpuset
cpu,cpuacct
memory
devices
freezer
net_cls,net_prio
blkio
perf_event
hugetlb
pids

以上查看到的,有存在的對應目錄,/sys/fs/cgroup

[root@localhost ~]# ll /sys/fs/cgroup/
total 0
drwxr-xr-x. 5 root root  0 Mar 25 04:50 blkio
lrwxrwxrwx. 1 root root 11 Mar 25 04:50 cpu -> cpu,cpuacct
lrwxrwxrwx. 1 root root 11 Mar 25 04:50 cpuacct -> cpu,cpuacct
drwxr-xr-x. 5 root root  0 Mar 25 04:50 cpu,cpuacct
drwxr-xr-x. 2 root root  0 Mar 25 04:50 cpuset
drwxr-xr-x. 5 root root  0 Mar 25 04:50 devices
drwxr-xr-x. 2 root root  0 Mar 25 04:50 freezer
drwxr-xr-x. 2 root root  0 Mar 25 04:50 hugetlb
drwxr-xr-x. 5 root root  0 Mar 25 04:50 memory
lrwxrwxrwx. 1 root root 16 Mar 25 04:50 net_cls -> net_cls,net_prio
drwxr-xr-x. 2 root root  0 Mar 25 04:50 net_cls,net_prio
lrwxrwxrwx. 1 root root 16 Mar 25 04:50 net_prio -> net_cls,net_prio
drwxr-xr-x. 2 root root  0 Mar 25 04:50 perf_event
drwxr-xr-x. 5 root root  0 Mar 25 04:50 pids
drwxr-xr-x. 5 root root  0 Mar 25 04:50 systemd

可以看到目錄中的內容是比命令查看到的多,是因為有幾個(gè)軟鏈接文件

# 以下三個(gè)都屬于cpu,cpuacct
cpu -> cpu,cpuacct
cpuacct -> cpu,cpuacct
cpu,cpuacct
# 以下三個(gè)都屬于net_cls,net_prio
net_cls -> net_cls,net_prio
net_prio -> net_cls,net_prio
net_cls,net_prio

Subsystem可以控制的內容分別代表什么

注意:到現在為止,還沒(méi)有可以對容器硬盤(pán)大小進(jìn)行限制的工具,只能限制硬盤(pán)的讀寫(xiě)頻率

cgroup的工作原理

查看cgroup中的CPU控制中的tasks文件,存放了對文件中的進(jìn)程的cpu的控制,如果要添加某個(gè)進(jìn)程對cpu的控制,將進(jìn)程的pid加入tasks文件即可,包括其他的硬件資源控制也是如此

[root@localhost ~]# cat /sys/fs/cgroup/cpu/tasks 
1
2
4
5
6
7
8
9
...
68469
68508
68526
68567

在生產(chǎn)環(huán)境中,由于在內核中,所以它是自動(dòng)增加的

cgroup真正的工作原理就是hook鉤子,cgroup的實(shí)現本質(zhì)上是給系統進(jìn)程掛上鉤子實(shí)現的,當task進(jìn)程運行的過(guò)程中,設計到某個(gè)資源是,就會(huì )觸發(fā)鉤子上附帶的subsystem子系統進(jìn)行資源檢測,最終根據資源類(lèi)別的不同使用對應的技術(shù)進(jìn)行資源限制和優(yōu)先級分配。

鉤子是怎么實(shí)現的

簡(jiǎn)單來(lái)說(shuō),linux中管理task進(jìn)程的數據結構,在cgroup的每個(gè)task設置一個(gè)關(guān)鍵詞,將關(guān)鍵詞都指向鉤子,叫做指針。

一個(gè)task只對應一個(gè)指針結構時(shí),一個(gè)指針結構可以被多個(gè)task進(jìn)行使用

當一個(gè)指針一旦讀取到唯一指針數據的內容,task就會(huì )被觸發(fā),就可以進(jìn)行資源控制

在實(shí)際的使用過(guò)程中,用戶(hù)需要使用mount來(lái)掛載cgroup控制組

在目錄中可以看到,比如httpd程序,pid號為69060

[root@localhost ~]# yum -y install httpd^C
[root@localhost ~]# systemctl start httpd^C
[root@localhost ~]# netstat -anput | grep 80
tcp6       0      0 :::80           :::*          LISTEN      69060/httpd

查看它pid號目錄中的mounts文件,存放了大量的關(guān)于cgroup的掛載

可以看到每一個(gè)cgoup后面的目錄,如/sys/fs/cgroup/cpu,cpuacct,說(shuō)明httpd進(jìn)程受到了cpu使用的限制,該文件中還有很多類(lèi)似的掛載項,可以看到的有blkio/perf_event/memory等的硬件資源控制。

[root@localhost ~]# cat /proc/69060/mounts
rootfs / rootfs rw 0 0
/dev/mapper/centos-root / xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0
devtmpfs /dev devtmpfs rw,seclabel,nosuid,size=914476k,nr_inodes=228619,mode=755 0 0
tmpfs /dev/shm tmpfs rw,seclabel,nosuid,nodev 0 0
devpts /dev/pts devpts rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0
mqueue /dev/mqueue mqueue rw,seclabel,relatime 0 0
hugetlbfs /dev/hugepages hugetlbfs rw,seclabel,relatime 0 0
...
cgroup /sys/fs/cgroup/systemd cgroup rw,seclabel,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd 0 0
cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,net_prio,net_cls 0 0
cgroup /sys/fs/cgroup/freezer cgroup rw,seclabel,nosuid,nodev,noexec,relatime,freezer 0 0
cgroup /sys/fs/cgroup/hugetlb cgroup rw,seclabel,nosuid,nodev,noexec,relatime,hugetlb 0 0
cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0
cgroup /sys/fs/cgroup/cpuset cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuset 0 0
cgroup /sys/fs/cgroup/devices cgroup rw,seclabel,nosuid,nodev,noexec,relatime,devices 0 0
cgroup /sys/fs/cgroup/memory cgroup rw,seclabel,nosuid,nodev,noexec,relatime,memory 0 0
cgroup /sys/fs/cgroup/blkio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,blkio 0 0
cgroup /sys/fs/cgroup/pids cgroup rw,seclabel,nosuid,nodev,noexec,relatime,pids 0 0
cgroup /sys/fs/cgroup/perf_event cgroup rw,seclabel,nosuid,nodev,noexec,relatime,perf_event 0 0
...

這就是通過(guò)mount控制cgroup的,所有的程序都是這樣的,子系統上所有的系統都把文件mount上以后,就可以像操作系統一樣操作cgroup和層級樹(shù)進(jìn)行管理,包括權限管理、子文件系統,除了cgroup文件系統以外,內核中沒(méi)有為cgroup的訪(fǎng)問(wèn)提供添加其他任何的操作,想要去操作cgroup,就必須使用mount掛到某一個(gè)cgroup控制組內才行。

資源控制操作

我們需要知道每一個(gè)硬件資源的具體怎么去控制的操作

如:

cgroup組中的cpu目錄里具體的每一項的具體的含義,都是對cpu具體的控制的細節

[root@localhost ~]# cd /sys/fs/cgroup/cpu
[root@localhost cpu]# ls
cgroup.clone_children  cpuacct.stat          cpu.cfs_quota_us   cpu.stat           system.slice
cgroup.event_control   cpuacct.usage         cpu.rt_period_us   machine.slice      tasks
cgroup.procs           cpuacct.usage_percpu  cpu.rt_runtime_us  notify_on_release  user.slice
cgroup.sane_behavior   cpu.cfs_period_us     cpu.shares         release_agent

這些具體的使用方法會(huì )在下一篇文章中來(lái)逐個(gè)去解釋用法

Docker命令行限制內容

-c/--cpu-shares:限制cpu優(yōu)先級

-m/--memory:限制內存的使用容量
--memory-swap:限制內存+swap的大小

--blkil-weight
bps/iops
--device-read-bps
--device-write-bps
--device-read-iops
--device-write-iops

具體使用方法:、、

cgroup目錄結構如下

/sys/fs/cgroup中存放了所有進(jìn)程的硬件資源控制

/sys/fs/cgroup/{cpu,memory,blkio...}/目錄下存放了特定硬件資源的默認的非docker進(jìn)程的控制,docker的進(jìn)程號不會(huì )在這些目錄下

/sys/fs/cgroup/cpu/docker/目錄下存放了docker在主機內的進(jìn)程控制

/sys/fs/cgroup/cpu/docker/容器id/目錄下存放了對docker產(chǎn)生的容器的控制

到此這篇關(guān)于Docker核心原理之 Cgroup詳解的文章就介紹到這了,更多相關(guān)Docker核心原理內容請搜索腳本之家以前的文章或繼續瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!

免責聲明:本站發(fā)布的內容(圖片、視頻和文字)以原創(chuàng )、來(lái)自本網(wǎng)站內容采集于網(wǎng)絡(luò )互聯(lián)網(wǎng)轉載等其它媒體和分享為主,內容觀(guān)點(diǎn)不代表本網(wǎng)站立場(chǎng),如侵犯了原作者的版權,請告知一經(jīng)查實(shí),將立刻刪除涉嫌侵權內容,聯(lián)系我們QQ:712375056,同時(shí)歡迎投稿傳遞力量。

日韩一区二区三区无码免费视频| 国内精品久久久久AV福利秒拍| 亚洲AV永久无码精品九之| 国产精品无码免费专区午夜| 在线www最新版资源| 国产女人水真多18毛片18精品|