色综合图-色综合图片-色综合图片二区150p-色综合图区-玖玖国产精品视频-玖玖香蕉视频

您的位置:首頁(yè)技術(shù)文章
文章詳情頁(yè)

Docker核心原理之 Cgroup詳解

瀏覽:156日期:2024-10-25 09:47:20

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

什么是cgroup

cgroup全稱是control groups

control groups:控制組,被整合在了linux內(nèi)核當(dāng)中,把進(jìn)程(tasks)放到組里面,對(duì)組設(shè)置權(quán)限,對(duì)進(jìn)程進(jìn)行控制。可以理解為用戶和組的概念,用戶會(huì)繼承它所在組的權(quán)限。

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

對(duì)于開發(fā)cgroup的特點(diǎn)

API:實(shí)現(xiàn)管理

cgroup管理可以管理到線程界別

所有線程功能都是subsystem(子系統(tǒng))統(tǒng)一的管理方式

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

cgroup的作用

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

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

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

術(shù)語表

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

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

層級(jí)樹的四大規(guī)則

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

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

1.同一個(gè)層級(jí)樹(hierarchy)可以附加一個(gè)或多個(gè)子系統(tǒng)(subsystem)

Docker核心原理之 Cgroup詳解

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

2.一個(gè)子系統(tǒng)(subsystem)可以附加到多個(gè)層級(jí)樹(hierarchy)中,但是僅僅是可以附加到多個(gè)沒有任何子系統(tǒng)的層級(jí)樹中。

Docker核心原理之 Cgroup詳解

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

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

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

Docker核心原理之 Cgroup詳解

系統(tǒng)每次新建一個(gè)層級(jí)樹(hierarchy)時(shí),默認(rèn)的構(gòu)成了新的層級(jí)樹的初始化的cgroup,這個(gè)cgroup被稱為root cgroup,對(duì)于你自己成功的層級(jí)樹(hierarchy)來說,task只能存在這個(gè)層級(jí)樹的一個(gè)cgroup當(dāng)中,意思就是一個(gè)層級(jí)樹中不能出現(xiàn)兩個(gè)相同的task,但是它可以存在不同的層級(jí)樹中的其他cgroup。

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

如以上圖中示例:

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

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

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

Docker核心原理之 Cgroup詳解

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

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

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

Subsystem子系統(tǒng)

subsystem究竟可以控制什么東西

通過以下的操作來驗(yàn)證

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

列出系統(tǒng)中所有的cgroup控制組

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

查看subsystem可以控制的硬件

[root@localhost ~]# lssubsys -acpusetcpu,cpuacctmemorydevicesfreezernet_cls,net_prioblkioperf_eventhugetlbpids

以上查看到的,有存在的對(duì)應(yīng)目錄,/sys/fs/cgroup

[root@localhost ~]# ll /sys/fs/cgroup/total 0drwxr-xr-x. 5 root root 0 Mar 25 04:50 blkiolrwxrwxrwx. 1 root root 11 Mar 25 04:50 cpu -> cpu,cpuacctlrwxrwxrwx. 1 root root 11 Mar 25 04:50 cpuacct -> cpu,cpuacctdrwxr-xr-x. 5 root root 0 Mar 25 04:50 cpu,cpuacctdrwxr-xr-x. 2 root root 0 Mar 25 04:50 cpusetdrwxr-xr-x. 5 root root 0 Mar 25 04:50 devicesdrwxr-xr-x. 2 root root 0 Mar 25 04:50 freezerdrwxr-xr-x. 2 root root 0 Mar 25 04:50 hugetlbdrwxr-xr-x. 5 root root 0 Mar 25 04:50 memorylrwxrwxrwx. 1 root root 16 Mar 25 04:50 net_cls -> net_cls,net_priodrwxr-xr-x. 2 root root 0 Mar 25 04:50 net_cls,net_priolrwxrwxrwx. 1 root root 16 Mar 25 04:50 net_prio -> net_cls,net_priodrwxr-xr-x. 2 root root 0 Mar 25 04:50 perf_eventdrwxr-xr-x. 5 root root 0 Mar 25 04:50 pidsdrwxr-xr-x. 5 root root 0 Mar 25 04:50 systemd

可以看到目錄中的內(nèi)容是比命令查看到的多,是因?yàn)橛袔讉€(gè)軟鏈接文件

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

Subsystem可以控制的內(nèi)容分別代表什么

編號(hào) 限制內(nèi)容 代表意思 1 blkio(對(duì)塊設(shè)備提供輸入輸出的限制) 光盤、固態(tài)磁盤、USB…。 2 cpu 可以調(diào)控task對(duì)cpu的使用。 3 cpuacct 自動(dòng)生成task對(duì)cpu資源使用情況的報(bào)告。 4 cpuset(針對(duì)多處理器的物理機(jī)使用) 對(duì)task單獨(dú)分配某個(gè)cpu使用的。 5 device(設(shè)備是指鍵盤、鼠標(biāo)…) 關(guān)閉和開啟task對(duì)設(shè)備的訪問。 6 freezer 控制task的掛起和恢復(fù),如不允許某個(gè)task使用cpu被稱之為掛起。 7 memory 控制task對(duì)內(nèi)存使用量的限定,自動(dòng)生成對(duì)內(nèi)存資源使用的報(bào)告 8 perf_event 對(duì)task可以進(jìn)行統(tǒng)一的性能測(cè)試,如探測(cè)linxu的cpu性能以及硬盤的讀寫效率等等。 9 net_cls 在docker中沒有直接被使用,它通過使用等級(jí)識(shí)別符(classid)標(biāo)記網(wǎng)絡(luò)數(shù)據(jù)包,從而允許 Linux 流量控制程序識(shí)別從具體cgroup中生成的數(shù)據(jù)包。

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

cgroup的工作原理

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

[root@localhost ~]# cat /sys/fs/cgroup/cpu/tasks 12456789...68469685086852668567

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

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

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

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

一個(gè)task只對(duì)應(yīng)一個(gè)指針結(jié)構(gòu)時(shí),一個(gè)指針結(jié)構(gòu)可以被多個(gè)task進(jìn)行使用

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

在實(shí)際的使用過程中,用戶需要使用mount來掛載cgroup控制組

在目錄中可以看到,比如httpd程序,pid號(hào)為69060

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

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

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

[root@localhost ~]# cat /proc/69060/mountsrootfs / rootfs rw 0 0/dev/mapper/centos-root / xfs rw,seclabel,relatime,attr2,inode64,noquota 0 0devtmpfs /dev devtmpfs rw,seclabel,nosuid,size=914476k,nr_inodes=228619,mode=755 0 0tmpfs /dev/shm tmpfs rw,seclabel,nosuid,nodev 0 0devpts /dev/pts devpts rw,seclabel,nosuid,noexec,relatime,gid=5,mode=620,ptmxmode=000 0 0mqueue /dev/mqueue mqueue rw,seclabel,relatime 0 0hugetlbfs /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 0cgroup /sys/fs/cgroup/net_cls,net_prio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,net_prio,net_cls 0 0cgroup /sys/fs/cgroup/freezer cgroup rw,seclabel,nosuid,nodev,noexec,relatime,freezer 0 0cgroup /sys/fs/cgroup/hugetlb cgroup rw,seclabel,nosuid,nodev,noexec,relatime,hugetlb 0 0cgroup /sys/fs/cgroup/cpu,cpuacct cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuacct,cpu 0 0cgroup /sys/fs/cgroup/cpuset cgroup rw,seclabel,nosuid,nodev,noexec,relatime,cpuset 0 0cgroup /sys/fs/cgroup/devices cgroup rw,seclabel,nosuid,nodev,noexec,relatime,devices 0 0cgroup /sys/fs/cgroup/memory cgroup rw,seclabel,nosuid,nodev,noexec,relatime,memory 0 0cgroup /sys/fs/cgroup/blkio cgroup rw,seclabel,nosuid,nodev,noexec,relatime,blkio 0 0cgroup /sys/fs/cgroup/pids cgroup rw,seclabel,nosuid,nodev,noexec,relatime,pids 0 0cgroup /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和層級(jí)樹進(jìn)行管理,包括權(quán)限管理、子文件系統(tǒng),除了cgroup文件系統(tǒng)以外,內(nèi)核中沒有為cgroup的訪問提供添加其他任何的操作,想要去操作cgroup,就必須使用mount掛到某一個(gè)cgroup控制組內(nèi)才行。

資源控制操作

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

如:

cgroup組中的cpu目錄里具體的每一項(xiàng)的具體的含義,都是對(duì)cpu具體的控制的細(xì)節(jié)

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

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

Docker命令行限制內(nèi)容

-c/--cpu-shares:限制cpu優(yōu)先級(jí)-m/--memory:限制內(nèi)存的使用容量--memory-swap:限制內(nèi)存+swap的大小--blkil-weightbps/iops--device-read-bps--device-write-bps--device-read-iops--device-write-iops

具體使用方法:cpu、內(nèi)存、blkio

cgroup目錄結(jié)構(gòu)如下

Docker核心原理之 Cgroup詳解

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

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

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

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

到此這篇關(guān)于Docker核心原理之 Cgroup詳解的文章就介紹到這了,更多相關(guān)Docker核心原理內(nèi)容請(qǐng)搜索好吧啦網(wǎng)以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持好吧啦網(wǎng)!

標(biāo)簽: Docker
相關(guān)文章:
主站蜘蛛池模板: 老湿菠萝蜜在线看 | 国产在线观看免费一级 | 国产在线精品一区二区不卡 | 91看片淫黄大片欧美看国产片 | 中日毛片| 成年18网站免费视频网站 | 国产精品九九视频 | 欧美精品国产制服第一页 | 偷拍视频一区在线观看 | 国产欧美另类久久精品91 | 鸥美毛片 | 手机免费看毛片 | 精品国产高清a毛片无毒不卡 | 中文字幕精品一区二区精品 | 欧美大尺码毛片 | 日韩丝袜美腿 | 老司机午夜性生免费福利 | 欧美成人免费午夜全 | 一级毛片不卡免费看老司机 | 一级做α爱过程免费视频 | 日韩在线精品视频 | 久久精品国产精品青草 | 免费久久精品视频 | 99久久香蕉国产线看观香 | 久久免费视频6 | 狠狠色丁香婷婷综合小时婷婷 | 欧美在线一区二区三区精品 | 美女被免费视频的网站 | 午夜性刺激免费视频观看不卡专区 | 久久久久久久网站 | 日韩一级片在线观看 | 国产精品精品国产 | 欧美乱爱 | 欧美亚洲日本韩国一级毛片 | 日韩在线亚洲 | 亚洲欧洲国产视频 | 中国a毛片| 中文字幕亚洲精品第一区 | 亚洲天堂中文网 | 国产精品久久久久影视不卡 | www.av网|