您好,登錄后才能下訂單哦!
本篇內(nèi)容主要講解“Docker中Cgroup的原理和作用”,感興趣的朋友不妨來看看。本文介紹的方法操作簡單快捷,實用性強。下面就讓小編來帶大家學(xué)習(xí)“Docker中Cgroup的原理和作用”吧!
內(nèi)核中強大的工具cgroup,不僅可以限制被NameSpace隔離起來的資源,還可以為資源設(shè)置權(quán)重,計算用量等
cgroup全稱是control groups
control groups:控制組,被整合在了linux內(nèi)核當中,把進程(tasks)放到組里面,對組設(shè)置權(quán)限,對進程進行控制??梢岳斫鉃橛脩艉徒M的概念,用戶會繼承它所在組的權(quán)限。
cgroups是linux內(nèi)核中的機制,這種機制可以根據(jù)特定的行為把一系列的任務(wù),子任務(wù)整合或者分離,按照資源劃分的等級的不同,從而實現(xiàn)資源統(tǒng)一控制的框架,cgroup可以控制、限制、隔離進程所需要的物理資源,包括cpu、內(nèi)存、IO,為容器虛擬化提供了最基本的保證,是構(gòu)建docker一系列虛擬化的管理工具
對于開發(fā)cgroup的特點
API:實現(xiàn)管理
cgroup管理可以管理到線程界別
所有線程功能都是subsystem(子系統(tǒng))統(tǒng)一的管理方式
子進程和父進程在一個cgroup里面,只需要控制父進程就可以
cgroup的內(nèi)核通過hook鉤子來實現(xiàn)管理進程資源,提供了一個統(tǒng)一的接口,從單個進程的資源控制到操作系統(tǒng)層面的虛擬卡的過渡
cgroup提供了四個功能:
資源控制:cgroup通過進程組對資源總額進行限制。如:程序使用內(nèi)存時,要為程序設(shè)定可以使用主機的多少內(nèi)存,也叫作限額
優(yōu)先級分配:使用硬件的權(quán)重值。當兩個程序都需要進程讀取cpu,哪個先哪個后,通過優(yōu)先級來進行控制
資源統(tǒng)計:可以統(tǒng)計硬件資源的用量,如:cpu、內(nèi)存…使用了多長時間
進程控制:可以對進程組實現(xiàn)掛起/恢復(fù)的操作,
術(shù)語表
task:表示系統(tǒng)中的某一個進程—PID
cgroup:資源控制,以控制組(cgroup)為單位實現(xiàn),cgroup中有都是task,可以有多個cgroup組,可以限制不同的內(nèi)容,組名不能相同。
subsystem:子系統(tǒng)。資源調(diào)度控制器。具體控制內(nèi)容。如:cpu的子系統(tǒng)控制cpu的時間分配,內(nèi)存的子系統(tǒng)可以控制某個cgroup內(nèi)的內(nèi)存使用量,硬盤的子系統(tǒng),可以控制硬盤的讀寫等等。
hierarchy:層級樹,一堆cgroup構(gòu)成,包含多個cgroup的叫層級樹,,每個hierarchy通過綁定的子系統(tǒng)對資源進行調(diào)度,可以包含0個或多個子節(jié)點,子節(jié)點繼承父節(jié)點的屬性,整個系統(tǒng)可以有多個hierarchy,是一個邏輯概念
關(guān)系:一個cgroup里可以有多個task,subsystem相當于控制cgroup限制的類型, hierarchy里可以有多個cgroup,一個系統(tǒng)可以有多個hierarchy。
傳統(tǒng)的進程啟動,是以init為根節(jié)點,也叫父進程,由它來創(chuàng)建子進程,作為子節(jié)點,而每個子節(jié)點還可以創(chuàng)建新的子節(jié)點,這樣構(gòu)成了樹狀結(jié)構(gòu)。而cgroup的結(jié)構(gòu)跟他類似的。子節(jié)點繼承父節(jié)點的屬性。他們最大的不同在于,系統(tǒng)的cgroup構(gòu)成的層級樹允許有多個存在,如果進程模型是init為根節(jié)點形成一個樹,那cgroup的模型由多個層級樹來構(gòu)成。
如果只有一個層級樹,所有的task都會受到一個subsystem的相同的限制,會給不需要這種限制的task造成麻煩
1.同一個層級樹(hierarchy)可以附加一個或多個子系統(tǒng)(subsystem)
可以看到在一個層級樹中,有一個cpu_mem_cg的cgroup組下還有兩個子節(jié)點cg1和cg2,如圖所示,也就意味著在cpu_mem_cg的組中,附加了cpu和mem內(nèi)存兩個子系統(tǒng),同時來控制cg1和cg2的cpu和內(nèi)存的硬件資源使用
2.一個子系統(tǒng)(subsystem)可以附加到多個層級樹(hierarchy)中,但是僅僅是可以附加到多個沒有任何子系統(tǒng)的層級樹中。
如圖所示,cpu子系統(tǒng)先附加到層級樹A上,同時就不能附加到層級樹B上,因為B上已經(jīng)有了一個mem子系統(tǒng),如果B和A同時都是沒有任何子系統(tǒng)時,這時,cpu子系統(tǒng)可以同時附加到A和B兩個層級樹中
言外之意就是,如果多個層級樹中都沒有子系統(tǒng),這個時候一個cpu子系統(tǒng)依次可以附加到這些層級樹中
3.一個進程(task)不能屬于同一個層級樹(hierarchy)的不同cgroup
系統(tǒng)每次新建一個層級樹(hierarchy)時,默認的構(gòu)成了新的層級樹的初始化的cgroup,這個cgroup被稱為root cgroup,對于你自己成功的層級樹(hierarchy)來說,task只能存在這個層級樹的一個cgroup當中,意思就是一個層級樹中不能出現(xiàn)兩個相同的task,但是它可以存在不同的層級樹中的其他cgroup。
如果要將一個層級樹cgroup中的task添加到這個層級樹的其他cgroup時,會被從之前task所在的cgroup移除
如以上圖中示例:
httpd已經(jīng)加入到層級樹(hierarchy)A中的cg1中,且pid為58950,此時就不能將這個httpd進程放入到cg2中,不然cg1中的httpd進程就會被刪除,但是可以放到層級樹(hierarchy)B的cg3控制組中
其實是為了防止出現(xiàn)進程矛盾,如:在層級樹A中的cg1中存在httpd進程,這時cpu對cg1的限制使用率為30%,cg2的限制使用率為50%,如果再將httpd進程添加到cg2中,這時httpd的cpu使用率限制就有了矛盾。
4.剛fork出的子進程在初始狀態(tài)與父進程處于同一個cgroup
進程task新開的一個子進程(child_task)默認是和原來的task在同一個cgroup中,但是child_task允許被移除到該層級樹的其他不同的cgroup中。
當fork剛完成之后,父進程和子進程是完全獨立的
如圖中所示中,httpd58950進程,當有人訪問時,會fork出另外一個子進程httpd58951,這個時候默認httpd58951和httpd58950都在cg1中,他們的關(guān)系也是父子進程,httpd58951是可以移動到cg2中,這時候就改變了他們的關(guān)系,都變?yōu)榱霜毩⒌倪M程。
subsystem究竟可以控制什么東西
通過以下的操作來驗證
[root@localhost ~]# yum -y install libcgroup-tools 安裝這個工具后就看可以通過使用cgroup命令來查看
列出系統(tǒng)中所有的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
以上查看到的,有存在的對應(yīng)目錄,/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
可以看到目錄中的內(nèi)容是比命令查看到的多,是因為有幾個軟鏈接文件
# 以下三個都屬于cpu,cpuacct cpu -> cpu,cpuacct cpuacct -> cpu,cpuacct cpu,cpuacct # 以下三個都屬于net_cls,net_prio net_cls -> net_cls,net_prio net_prio -> net_cls,net_prio net_cls,net_prio
Subsystem可以控制的內(nèi)容分別代表什么
編號 | 限制內(nèi)容 | 代表意思 |
---|---|---|
1 | blkio(對塊設(shè)備提供輸入輸出的限制) | 光盤、固態(tài)磁盤、USB…。 |
2 | cpu | 可以調(diào)控task對cpu的使用。 |
3 | cpuacct | 自動生成task對cpu資源使用情況的報告。 |
4 | cpuset(針對多處理器的物理機使用) | 對task單獨分配某個cpu使用的。 |
5 | device(設(shè)備是指鍵盤、鼠標…) | 關(guān)閉和開啟task對設(shè)備的訪問。 |
6 | freezer | 控制task的掛起和恢復(fù),如不允許某個task使用cpu被稱之為掛起。 |
7 | memory | 控制task對內(nèi)存使用量的限定,自動生成對內(nèi)存資源使用的報告 |
8 | perf_event | 對task可以進行統(tǒng)一的性能測試,如探測linxu的cpu性能以及硬盤的讀寫效率等等。 |
9 | net_cls | 在docker中沒有直接被使用,它通過使用等級識別符(classid)標記網(wǎng)絡(luò)數(shù)據(jù)包,從而允許 Linux 流量控制程序識別從具體cgroup中生成的數(shù)據(jù)包。 |
注意:到現(xiàn)在為止,還沒有可以對容器硬盤大小進行限制的工具,只能限制硬盤的讀寫頻率
查看cgroup中的CPU控制中的tasks文件,存放了對文件中的進程的cpu的控制,如果要添加某個進程對cpu的控制,將進程的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)境中,由于在內(nèi)核中,所以它是自動增加的
cgroup真正的工作原理就是hook鉤子,cgroup的實現(xiàn)本質(zhì)上是給系統(tǒng)進程掛上鉤子實現(xiàn)的,當task進程運行的過程中,設(shè)計到某個資源是,就會觸發(fā)鉤子上附帶的subsystem子系統(tǒng)進行資源檢測,最終根據(jù)資源類別的不同使用對應(yīng)的技術(shù)進行資源限制和優(yōu)先級分配。
鉤子是怎么實現(xiàn)的
簡單來說,linux中管理task進程的數(shù)據(jù)結(jié)構(gòu),在cgroup的每個task設(shè)置一個關(guān)鍵詞,將關(guān)鍵詞都指向鉤子,叫做指針。
一個task只對應(yīng)一個指針結(jié)構(gòu)時,一個指針結(jié)構(gòu)可以被多個task進行使用
當一個指針一旦讀取到唯一指針數(shù)據(jù)的內(nèi)容,task就會被觸發(fā),就可以進行資源控制
在實際的使用過程中,用戶需要使用mount來掛載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的掛載
可以看到每一個cgoup后面的目錄,如/sys/fs/cgroup/cpu,cpuacct
,說明httpd進程受到了cpu使用的限制,該文件中還有很多類似的掛載項,可以看到的有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 ...
這就是通過mount控制cgroup的,所有的程序都是這樣的,子系統(tǒng)上所有的系統(tǒng)都把文件mount上以后,就可以像操作系統(tǒng)一樣操作cgroup和層級樹進行管理,包括權(quán)限管理、子文件系統(tǒng),除了cgroup文件系統(tǒng)以外,內(nèi)核中沒有為cgroup的訪問提供添加其他任何的操作,想要去操作cgroup,就必須使用mount掛到某一個cgroup控制組內(nèi)才行。
我們需要知道每一個硬件資源的具體怎么去控制的操作
如:
cgroup組中的cpu目錄里具體的每一項的具體的含義,都是對cpu具體的控制的細節(jié)
[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
這些具體的使用方法會在下一篇文章中來逐個去解釋用法
-c/--cpu-shares:限制cpu優(yōu)先級 -m/--memory:限制內(nèi)存的使用容量 --memory-swap:限制內(nèi)存+swap的大小 --blkil-weight bps/iops --device-read-bps --device-write-bps --device-read-iops --device-write-iops
具體使用方法:cpu、內(nèi)存、blkio
cgroup目錄結(jié)構(gòu)如下
/sys/fs/cgroup
中存放了所有進程的硬件資源控制
/sys/fs/cgroup/{cpu,memory,blkio...}/
目錄下存放了特定硬件資源的默認的非docker進程的控制,docker的進程號不會在這些目錄下
/sys/fs/cgroup/cpu/docker/
目錄下存放了docker在主機內(nèi)的進程控制
/sys/fs/cgroup/cpu/docker/容器id/
目錄下存放了對docker產(chǎn)生的容器的控制
到此,相信大家對“Docker中Cgroup的原理和作用”有了更深的了解,不妨來實際操作一番吧!這里是億速云網(wǎng)站,更多相關(guān)內(nèi)容可以進入相關(guān)頻道進行查詢,關(guān)注我們,繼續(xù)學(xué)習(xí)!
免責聲明:本站發(fā)布的內(nèi)容(圖片、視頻和文字)以原創(chuàng)、轉(zhuǎn)載和分享為主,文章觀點不代表本網(wǎng)站立場,如果涉及侵權(quán)請聯(lián)系站長郵箱:is@yisu.com進行舉報,并提供相關(guān)證據(jù),一經(jīng)查實,將立刻刪除涉嫌侵權(quán)內(nèi)容。