
??《重識(shí)云原生系列》專題索引:
- 第一章——不謀全局不足以謀一域
- 第二章計(jì)算第1節(jié)——計(jì)算虛擬化技術(shù)總述
- 第二章計(jì)算第2節(jié)——主流虛擬化技術(shù)之VMare ESXi
- 第二章計(jì)算第3節(jié)——主流虛擬化技術(shù)之Xen
- 第二章計(jì)算第4節(jié)——主流虛擬化技術(shù)之KVM
- 第二章計(jì)算第5節(jié)——商用云主機(jī)方案
- 第二章計(jì)算第6節(jié)——裸金屬方案
- 第三章云存儲(chǔ)第1節(jié)——分布式云存儲(chǔ)總述
- 第三章云存儲(chǔ)第2節(jié)——SPDK方案綜述
- 第三章云存儲(chǔ)第3節(jié)——Ceph統(tǒng)一存儲(chǔ)方案
- 第三章云存儲(chǔ)第4節(jié)——OpenStack Swift 對(duì)象存儲(chǔ)方案
- 第三章云存儲(chǔ)第5節(jié)——商用分布式云存儲(chǔ)方案
- 第四章云網(wǎng)絡(luò)第一節(jié)——云網(wǎng)絡(luò)技術(shù)發(fā)展簡(jiǎn)述
- 第四章云網(wǎng)絡(luò)4.2節(jié)——相關(guān)基礎(chǔ)知識(shí)準(zhǔn)備
- 第四章云網(wǎng)絡(luò)4.3節(jié)——重要網(wǎng)絡(luò)協(xié)議
- 第四章云網(wǎng)絡(luò)4.3.1節(jié)——路由技術(shù)簡(jiǎn)述
- 第四章云網(wǎng)絡(luò)4.3.2節(jié)——VLAN技術(shù)
- 第四章云網(wǎng)絡(luò)4.3.3節(jié)——RIP協(xié)議
- 第四章云網(wǎng)絡(luò)4.3.4節(jié)——OSPF協(xié)議
- 第四章云網(wǎng)絡(luò)4.3.5節(jié)——EIGRP協(xié)議
- 第四章云網(wǎng)絡(luò)4.3.6節(jié)——IS-IS協(xié)議
- 第四章云網(wǎng)絡(luò)4.3.7節(jié)——BGP協(xié)議
- 第四章云網(wǎng)絡(luò)4.3.7.2節(jié)——BGP協(xié)議概述
- 第四章云網(wǎng)絡(luò)4.3.7.3節(jié)——BGP協(xié)議實(shí)現(xiàn)原理
- 第四章云網(wǎng)絡(luò)4.3.7.4節(jié)——高級(jí)特性
- 第四章云網(wǎng)絡(luò)4.3.7.5節(jié)——實(shí)操
- 第四章云網(wǎng)絡(luò)4.3.7.6節(jié)——MP-BGP協(xié)議
- 第四章云網(wǎng)絡(luò)4.3.8節(jié)——策略路由
- 第四章云網(wǎng)絡(luò)4.3.9節(jié)——Graceful Restart(平滑重啟)技術(shù)
- 第四章云網(wǎng)絡(luò)4.3.10節(jié)——VXLAN技術(shù)
- 第四章云網(wǎng)絡(luò)4.3.10.2節(jié)——VXLAN Overlay網(wǎng)絡(luò)方案設(shè)計(jì)
- 第四章云網(wǎng)絡(luò)4.3.10.3節(jié)——VXLAN隧道機(jī)制
- 第四章云網(wǎng)絡(luò)4.3.10.4節(jié)——VXLAN報(bào)文轉(zhuǎn)發(fā)過(guò)程
- 第四章云網(wǎng)絡(luò)4.3.10.5節(jié)——VXlan組網(wǎng)架構(gòu)
- 第四章云網(wǎng)絡(luò)4.3.10.6節(jié)——VXLAN應(yīng)用部署方案
- 第四章云網(wǎng)絡(luò)4.4節(jié)——Spine-Leaf網(wǎng)絡(luò)架構(gòu)
- 第四章云網(wǎng)絡(luò)4.5節(jié)——大二層網(wǎng)絡(luò)
- 第四章云網(wǎng)絡(luò)4.6節(jié)——Underlay 和 Overlay概念
- 第四章云網(wǎng)絡(luò)4.7.1節(jié)——網(wǎng)絡(luò)虛擬化與卸載加速技術(shù)的演進(jìn)簡(jiǎn)述
- 第四章云網(wǎng)絡(luò)4.7.2節(jié)——virtio網(wǎng)絡(luò)半虛擬化簡(jiǎn)介
- 第四章云網(wǎng)絡(luò)4.7.3節(jié)——Vhost-net方案
- 第四章云網(wǎng)絡(luò)4.7.4節(jié)vhost-user方案——virtio的DPDK卸載方案
- 第四章云網(wǎng)絡(luò)4.7.5節(jié)vDPA方案——virtio的半硬件虛擬化實(shí)現(xiàn)
- 第四章云網(wǎng)絡(luò)4.7.6節(jié)——virtio-blk存儲(chǔ)虛擬化方案
- 第四章云網(wǎng)絡(luò)4.7.8節(jié)——SR-IOV方案
- 第四章云網(wǎng)絡(luò)4.7.9節(jié)——NFV
- 第四章云網(wǎng)絡(luò)4.8.1節(jié)——SDN總述
- 第四章云網(wǎng)絡(luò)4.8.2.1節(jié)——OpenFlow概述
- 第四章云網(wǎng)絡(luò)4.8.2.2節(jié)——OpenFlow協(xié)議詳解
- 第四章云網(wǎng)絡(luò)4.8.2.3節(jié)——OpenFlow運(yùn)行機(jī)制
- 第四章云網(wǎng)絡(luò)4.8.3.1節(jié)——Open vSwitch簡(jiǎn)介
- 第四章云網(wǎng)絡(luò)4.8.3.2節(jié)——Open vSwitch工作原理詳解
- 第四章云網(wǎng)絡(luò)4.8.4節(jié)——OpenStack與SDN的集成
- 第四章云網(wǎng)絡(luò)4.8.5節(jié)——OpenDayLight
- 第四章云網(wǎng)絡(luò)4.8.6節(jié)——Dragonflow
-
第四章云網(wǎng)絡(luò)4.9.2節(jié)——傳統(tǒng)網(wǎng)絡(luò)卸載技術(shù)
1. cgroups概述
1.1 為什么需要cgroup
????????在Linux里,一直以來(lái)就有對(duì)進(jìn)程進(jìn)行分組的概念和需求,比如session group, progress group等,后來(lái)隨著人們對(duì)這方面的需求越來(lái)越多,比如需要追蹤一組進(jìn)程的內(nèi)存和IO使用情況等,于是出現(xiàn)了cgroup,用來(lái)統(tǒng)一將進(jìn)程進(jìn)行分組,并在分組的基礎(chǔ)上對(duì)進(jìn)程進(jìn)行監(jiān)控和資源控制管理等。
1.2 cgroups簡(jiǎn)介
????????cgroups全稱是control groups,是 Linux 內(nèi)核的一個(gè)功能,用來(lái)限制、控制與分離一個(gè)進(jìn)程組的資源(如CPU、內(nèi)存、磁盤(pán)輸入輸出等)。它是由 Google 的兩位工程師進(jìn)行開(kāi)發(fā)的,自 2008 年 1 月正式發(fā)布的 Linux 內(nèi)核 v2.6.24 開(kāi)始提供此能力。cgroups 到目前為止,有兩個(gè)大版本, cgroup v1 和 v2 。cgroup 主要限制的資源是、CPU、內(nèi)存、網(wǎng)絡(luò)、磁盤(pán) I/O。當(dāng)我們將可用系統(tǒng)資源按特定百分比分配給 cgroup 時(shí),剩余的資源可供系統(tǒng)上的其他 cgroup 或其他進(jìn)程使用。
????????cgroup 的作用基本上就是控制一個(gè)進(jìn)程或一組進(jìn)程可以訪問(wèn)或使用給定關(guān)鍵資源(CPU、內(nèi)存、網(wǎng)絡(luò)和磁盤(pán) I/O)的量。一個(gè)容器中通常運(yùn)行了多個(gè)進(jìn)程,并且您需要對(duì)這些進(jìn)程實(shí)施統(tǒng)一控制,因此 cgroup 是容器的關(guān)鍵組件,為容器虛擬化提供了最基本的保證,是構(gòu)建docker一系列虛擬化的管理工具。Kubernetes 環(huán)境使用cgroup 在 pod 級(jí)別上部署資源請(qǐng)求和限制以及對(duì)應(yīng)的 QoS 類(lèi)。
????????下圖說(shuō)明了當(dāng)您將特定比例的可用系統(tǒng)資源分配給一個(gè) cgroup(在本例中,為cgroup?1)后,剩余資源是如何在系統(tǒng)上其他 cgroup(以及各個(gè)進(jìn)程)之間進(jìn)行分配的:

cgroup 資源分配及剩余可用資源示例圖
1.3 cgroups基本概念
????????cgroups主要由task、cgroup、subsystem及hierarchy構(gòu)成:
- task:在cgroups中,task就是系統(tǒng)的一個(gè)進(jìn)程。
- control group(簡(jiǎn)寫(xiě):cgroup):控制族群就是按照某種標(biāo)準(zhǔn)劃分的進(jìn)程,包含一個(gè)或多個(gè)子系統(tǒng)。Cgroups 中的資源控制都是以控制族群為單位實(shí)現(xiàn)。一個(gè)進(jìn)程可以加入到某個(gè)控制族群,也可從一個(gè)進(jìn)程組遷移到另一個(gè)控制族群。一個(gè)進(jìn)程組的進(jìn)程可以使用 cgroups 以控制族群為單位分配的資源,同時(shí)受到 cgroups 以控制族群為單位設(shè)定的限制;
- hierarchy(層級(jí)樹(shù)):控制族群可以組織成 hierarchical 的形式,既一顆控制族群樹(shù)??刂谱迦簶?shù)上的子節(jié)點(diǎn)控制族群是父節(jié)點(diǎn)控制族群的孩子,繼承父控制族群的特定的屬性;hierarchy由一系列cgroup以一個(gè)樹(shù)狀結(jié)構(gòu)排列而成,每個(gè)hierarchy通過(guò)綁定對(duì)應(yīng)的subsystem進(jìn)行資源調(diào)度;hierarchy中的cgroup節(jié)點(diǎn)可以包含零或多個(gè)子節(jié)點(diǎn),子節(jié)點(diǎn)繼承父節(jié)點(diǎn)的屬性;整個(gè)系統(tǒng)可以有多個(gè)hierarchy。
- subsystem:Cgroups中的subsystem就是一個(gè)資源調(diào)度控制器(Resource Controller),比如CPU子系統(tǒng)可以控制CPU時(shí)間分配,內(nèi)存子系統(tǒng)可以限制cgroup內(nèi)存使用量;子系統(tǒng)必須附加(attach)到一個(gè)層級(jí)上才能起作用,一個(gè)子系統(tǒng)附加到某個(gè)層級(jí)以后,這個(gè)層級(jí)上的所有控制族群都受到這個(gè)子系統(tǒng)的控制。但是資源調(diào)度控制器這個(gè)說(shuō)法也不完全準(zhǔn)確,因?yàn)橛袝r(shí)我們將進(jìn)程分組只是為了做一些監(jiān)控,觀察一下他們的狀態(tài),比如perf_event subsystem。到目前為止,Linux支持12種subsystem,比如限制CPU的使用時(shí)間,限制使用的內(nèi)存,統(tǒng)計(jì)CPU的使用情況,凍結(jié)和恢復(fù)一組進(jìn)程等。
1.3.1 相互關(guān)系
- 每次在系統(tǒng)中創(chuàng)建新層級(jí)時(shí),該系統(tǒng)中的所有任務(wù)都是那個(gè)層級(jí)的默認(rèn) cgroup(我們稱之為 root cgroup,此 cgroup 在創(chuàng)建層級(jí)時(shí)自動(dòng)創(chuàng)建,后面在該層級(jí)中創(chuàng)建的 cgroup 都是此 cgroup 的后代)的初始成員;
- 一個(gè)子系統(tǒng)最多只能附加到一個(gè)層級(jí);
- 一個(gè)層級(jí)可以附加多個(gè)子系統(tǒng);
- 一個(gè)任務(wù)可以是多個(gè) cgroup 的成員,但是這些 cgroup 必須在不同的層級(jí);
- 系統(tǒng)中的進(jìn)程(任務(wù))創(chuàng)建子進(jìn)程(任務(wù))時(shí),該子任務(wù)自動(dòng)成為其父進(jìn)程所在 cgroup 的成員。然后可根據(jù)需要將該子任務(wù)移動(dòng)到不同的 cgroup 中,但開(kāi)始時(shí)它總是繼承其父任務(wù)的 cgroup。
????????如圖所示,CPU 和 Memory 兩個(gè)子系統(tǒng)有自己獨(dú)立的層級(jí)系統(tǒng),而又通過(guò) Task Group 取得關(guān)聯(lián)關(guān)系

1.3.2 cgroups子系統(tǒng)
????????cgroups 為每種可以精細(xì)化控制的資源定義了一個(gè)子系統(tǒng),典型的子系統(tǒng)如下:
- cpu 子系統(tǒng): 主要限制進(jìn)程cpu的使用率(也可以理解為限制分配給cpu的core,最終限制是cpu 利用率的限制;比如一共32core 分配4core ,那這個(gè)進(jìn)程cpu 最大占用率 = 12.5%,所以一個(gè)進(jìn)程可以申請(qǐng)< 1core,因?yàn)樽詈笫寝D(zhuǎn)換成比率來(lái)控制的;
- cpu 子系統(tǒng),主要限制進(jìn)程的 cpu 使用率。
- cpuacct 子系統(tǒng):統(tǒng)計(jì)每個(gè)進(jìn)程cpu 使用率的報(bào)告,如果達(dá)到預(yù)定的上限,可以采取一定的措施;
- cpuset 子系統(tǒng):可以為進(jìn)程分配單獨(dú)的cpu節(jié)點(diǎn)或者mem節(jié)點(diǎn),可以理解為為進(jìn)程分配指定的額cpu占有率,就是精細(xì)化控制cpu資源;
- memery 子系統(tǒng):可以限制進(jìn)程memery 最大的使用量;
- blkio 子系統(tǒng):可以限制進(jìn)程訪問(wèn)的塊設(shè)備io;
- device 子系統(tǒng):可以控制訪問(wèn)的設(shè)備;
- net_cls 子系統(tǒng):標(biāo)記cgroups 中的網(wǎng)絡(luò)數(shù)據(jù)包,然后可以使用tc模塊(traffice control) 系統(tǒng)對(duì)數(shù)據(jù)包進(jìn)行控制;比如namespace NET 的可以通過(guò)這個(gè)系統(tǒng)讓namespace 內(nèi)進(jìn)程可以獨(dú)立進(jìn)行網(wǎng)絡(luò)通信,功能類(lèi)似于自己?jiǎn)为?dú)的網(wǎng)卡、單獨(dú)的帶寬;
- net_prio子系統(tǒng):這個(gè)子系統(tǒng)用來(lái)設(shè)計(jì)網(wǎng)絡(luò)流量的優(yōu)先級(jí)
- freezer 子系統(tǒng),可以stop或者start cgroups 管理的進(jìn)程,就是監(jiān)控進(jìn)程的狀態(tài),如果設(shè)置了一直是start狀態(tài),就去確定環(huán)境是否是ok,如果ok就啟動(dòng)服務(wù);
- ns子系統(tǒng): 可以控制cgroup的進(jìn)程訪問(wèn)不同的namespace;這個(gè)配合namespace的功能實(shí)現(xiàn)容器的隔離效果;
- hugetlb子系統(tǒng):這個(gè)子系統(tǒng)主要針對(duì)于HugeTLB系統(tǒng)進(jìn)行限制,這是一個(gè)大頁(yè)文件系統(tǒng)。
????????這里每一個(gè)子系統(tǒng)都需要跟內(nèi)核的其他模塊配合來(lái)完成資源的控制,比如對(duì)cpu資源的控制,需要內(nèi)核的進(jìn)程調(diào)度模塊根據(jù)cpu子系統(tǒng)的配置來(lái)完成;內(nèi)存資源的限制需要內(nèi)核的內(nèi)存模塊根據(jù)memery子系統(tǒng)的配置來(lái)完成。
1.3.3 如何查看當(dāng)前系統(tǒng)支持哪些subsystem
????????可以通過(guò)查看/proc/cgroups(since Linux 2.6.24)知道當(dāng)前系統(tǒng)支持哪些subsystem,下面是一個(gè)例子:

?????????從左到右,字段的含義分別是:
- subsystem的名字
- subsystem所關(guān)聯(lián)到的cgroup樹(shù)的ID,如果多個(gè)subsystem關(guān)聯(lián)到同一顆cgroup樹(shù),那么他們的這個(gè)字段將一樣,比如這里的cpu和cpuacct就一樣,表示他們綁定到了同一顆樹(shù)。如果出現(xiàn)下面的情況,這個(gè)字段將為0:
-
- 當(dāng)前subsystem沒(méi)有和任何cgroup樹(shù)綁定
- 當(dāng)前subsystem已經(jīng)和cgroup v2的樹(shù)綁定
- 當(dāng)前subsystem沒(méi)有被內(nèi)核開(kāi)啟
- subsystem所關(guān)聯(lián)的cgroup樹(shù)中進(jìn)程組的個(gè)數(shù),也即樹(shù)上節(jié)點(diǎn)的個(gè)數(shù)
- 1表示開(kāi)啟,0表示沒(méi)有被開(kāi)啟(可以通過(guò)設(shè)置內(nèi)核的啟動(dòng)參數(shù)“cgroup_disable”來(lái)控制subsystem的開(kāi)啟).
1.4 cgroups提供的功能
- 限制進(jìn)程組可以使用的資源(Resource limiting ):比如memory子系統(tǒng)可以為進(jìn)程組設(shè)定一個(gè)memory使用上限,進(jìn)程組使用的內(nèi)存達(dá)到限額再申請(qǐng)內(nèi)存,就會(huì)出發(fā)OOM(out of memory)
- 進(jìn)程組的優(yōu)先級(jí)控制(Prioritization ):比如可以使用cpu子系統(tǒng)為某個(gè)進(jìn)程組分配cpu share
- 統(tǒng)計(jì)進(jìn)程組使用的資源量(Accounting ):比如使用cpuacct子系統(tǒng)記錄某個(gè)進(jìn)程組使用的cpu時(shí)間
- 進(jìn)程組隔離(Isolation):比如使用ns子系統(tǒng)可以使不同的進(jìn)程組使用不同的namespace,以達(dá)到隔離的目的,不同的進(jìn)程組有各自的進(jìn)程、網(wǎng)絡(luò)、文件系統(tǒng)掛載空間
- 進(jìn)程組控制(Control):比如使用freezer子系統(tǒng)可以將進(jìn)程組掛起和恢復(fù)
參考鏈接?
linux 容器(LXC) 第4章 cgroups_caoshuming_500的博客-CSDN博客
Linux 基礎(chǔ):cgroup 原理與實(shí)現(xiàn)_CGroup_層級(jí)_控制
【docker 底層知識(shí)】cgroup 原理分析_張忠琳的博客-CSDN博客_cgroup
CGroup的原理和使用_書(shū)笑生的博客-CSDN博客_cgroup原理
Linux Cgroups詳解(二) - lisperl - 博客園
Linux Cgroup系列(04):限制cgroup的內(nèi)存使用(subsystem之memory)
Linux Cgroup系列(04):限制cgroup的內(nèi)存使用(subsystem之memory) - SegmentFault 思否
Linux Cgroup系列(01):Cgroup概述 - SegmentFault 思否
深入理解 Linux Cgroup 系列(一):基本概念 - SegmentFault 思否
深入理解 Linux Cgroup 系列(二):玩轉(zhuǎn) CPU