??《重識云原生系列》專題索引:
- 第一章——不謀全局不足以謀一域
- 第二章計算第1節(jié)——計算虛擬化技術(shù)總述
- 第二章計算第2節(jié)——主流虛擬化技術(shù)之VMare ESXi
- 第二章計算第3節(jié)——主流虛擬化技術(shù)之Xen
- 第二章計算第4節(jié)——主流虛擬化技術(shù)之KVM
- 第二章計算第5節(jié)——商用云主機方案
- 第二章計算第6節(jié)——裸金屬方案
- 第三章云存儲第1節(jié)——分布式云存儲總述
- 第三章云存儲第2節(jié)——SPDK方案綜述
- 第三章云存儲第3節(jié)——Ceph統(tǒng)一存儲方案
- 第三章云存儲第4節(jié)——OpenStack Swift 對象存儲方案
- 第三章云存儲第5節(jié)——商用分布式云存儲方案
- 第四章云網(wǎng)絡(luò)第一節(jié)——云網(wǎng)絡(luò)技術(shù)發(fā)展簡述
- 第四章云網(wǎng)絡(luò)4.2節(jié)——相關(guān)基礎(chǔ)知識準(zhǔn)備
- 第四章云網(wǎng)絡(luò)4.3節(jié)——重要網(wǎng)絡(luò)協(xié)議
- 第四章云網(wǎng)絡(luò)4.3.1節(jié)——路由技術(shù)簡述
- 第四章云網(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é)議實現(xiàn)原理
- 第四章云網(wǎng)絡(luò)4.3.7.4節(jié)——高級特性
- 第四章云網(wǎng)絡(luò)4.3.7.5節(jié)——實操
- 第四章云網(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è)計
- 第四章云網(wǎng)絡(luò)4.3.10.3節(jié)——VXLAN隧道機制
- 第四章云網(wǎng)絡(luò)4.3.10.4節(jié)——VXLAN報文轉(zhuǎn)發(fā)過程
- 第四章云網(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ù)的演進簡述
- 第四章云網(wǎng)絡(luò)4.7.2節(jié)——virtio網(wǎng)絡(luò)半虛擬化簡介
- 第四章云網(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的半硬件虛擬化實現(xiàn)
- 第四章云網(wǎng)絡(luò)4.7.6節(jié)——virtio-blk存儲虛擬化方案
- 第四章云網(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運行機制
- 第四章云網(wǎng)絡(luò)4.8.3.1節(jié)——Open vSwitch簡介
- 第四章云網(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里稻轨,一直以來就有對進程進行分組的概念和需求,比如session group捌肴, progress group等薯演,后來隨著人們對這方面的需求越來越多灼卢,比如需要追蹤一組進程的內(nèi)存和IO使用情況等兑牡,于是出現(xiàn)了cgroup,用來統(tǒng)一將進程進行分組遍蟋,并在分組的基礎(chǔ)上對進程進行監(jiān)控和資源控制管理等吹害。
1.2 cgroups簡介
????????cgroups全稱是control groups,是 Linux 內(nèi)核的一個功能虚青,用來限制它呀、控制與分離一個進程組的資源(如CPU、內(nèi)存、磁盤輸入輸出等)纵穿。它是由 Google 的兩位工程師進行開發(fā)的下隧,自 2008 年 1 月正式發(fā)布的 Linux 內(nèi)核 v2.6.24 開始提供此能力。cgroups 到目前為止谓媒,有兩個大版本淆院, cgroup v1 和 v2 。cgroup 主要限制的資源是句惯、CPU土辩、內(nèi)存、網(wǎng)絡(luò)抢野、磁盤 I/O拷淘。當(dāng)我們將可用系統(tǒng)資源按特定百分比分配給 cgroup 時,剩余的資源可供系統(tǒng)上的其他 cgroup 或其他進程使用蒙保。
????????cgroup 的作用基本上就是控制一個進程或一組進程可以訪問或使用給定關(guān)鍵資源(CPU辕棚、內(nèi)存、網(wǎng)絡(luò)和磁盤 I/O)的量邓厕。一個容器中通常運行了多個進程逝嚎,并且您需要對這些進程實施統(tǒng)一控制,因此 cgroup 是容器的關(guān)鍵組件详恼,為容器虛擬化提供了最基本的保證补君,是構(gòu)建docker一系列虛擬化的管理工具。Kubernetes 環(huán)境使用cgroup 在 pod 級別上部署資源請求和限制以及對應(yīng)的 QoS 類昧互。
????????下圖說明了當(dāng)您將特定比例的可用系統(tǒng)資源分配給一個 cgroup(在本例中挽铁,為cgroup?1)后,剩余資源是如何在系統(tǒng)上其他 cgroup(以及各個進程)之間進行分配的:
cgroup 資源分配及剩余可用資源示例圖
1.3 cgroups基本概念
????????cgroups主要由task敞掘、cgroup叽掘、subsystem及hierarchy構(gòu)成:
- task:在cgroups中,task就是系統(tǒng)的一個進程玖雁。
- control group(簡寫:cgroup):控制族群就是按照某種標(biāo)準(zhǔn)劃分的進程更扁,包含一個或多個子系統(tǒng)。Cgroups 中的資源控制都是以控制族群為單位實現(xiàn)赫冬。一個進程可以加入到某個控制族群浓镜,也可從一個進程組遷移到另一個控制族群。一個進程組的進程可以使用 cgroups 以控制族群為單位分配的資源劲厌,同時受到 cgroups 以控制族群為單位設(shè)定的限制膛薛;
- hierarchy(層級樹):控制族群可以組織成 hierarchical 的形式,既一顆控制族群樹补鼻『遄模控制族群樹上的子節(jié)點控制族群是父節(jié)點控制族群的孩子雅任,繼承父控制族群的特定的屬性;hierarchy由一系列cgroup以一個樹狀結(jié)構(gòu)排列而成增淹,每個hierarchy通過綁定對應(yīng)的subsystem進行資源調(diào)度椿访;hierarchy中的cgroup節(jié)點可以包含零或多個子節(jié)點,子節(jié)點繼承父節(jié)點的屬性虑润;整個系統(tǒng)可以有多個hierarchy成玫。
- subsystem:Cgroups中的subsystem就是一個資源調(diào)度控制器(Resource Controller),比如CPU子系統(tǒng)可以控制CPU時間分配拳喻,內(nèi)存子系統(tǒng)可以限制cgroup內(nèi)存使用量哭当;子系統(tǒng)必須附加(attach)到一個層級上才能起作用,一個子系統(tǒng)附加到某個層級以后冗澈,這個層級上的所有控制族群都受到這個子系統(tǒng)的控制钦勘。但是資源調(diào)度控制器這個說法也不完全準(zhǔn)確,因為有時我們將進程分組只是為了做一些監(jiān)控亚亲,觀察一下他們的狀態(tài)彻采,比如perf_event subsystem。到目前為止捌归,Linux支持12種subsystem肛响,比如限制CPU的使用時間,限制使用的內(nèi)存惜索,統(tǒng)計CPU的使用情況特笋,凍結(jié)和恢復(fù)一組進程等。
1.3.1 相互關(guān)系
- 每次在系統(tǒng)中創(chuàng)建新層級時巾兆,該系統(tǒng)中的所有任務(wù)都是那個層級的默認 cgroup(我們稱之為 root cgroup猎物,此 cgroup 在創(chuàng)建層級時自動創(chuàng)建,后面在該層級中創(chuàng)建的 cgroup 都是此 cgroup 的后代)的初始成員角塑;
- 一個子系統(tǒng)最多只能附加到一個層級蔫磨;
- 一個層級可以附加多個子系統(tǒng);
- 一個任務(wù)可以是多個 cgroup 的成員圃伶,但是這些 cgroup 必須在不同的層級质帅;
- 系統(tǒng)中的進程(任務(wù))創(chuàng)建子進程(任務(wù))時,該子任務(wù)自動成為其父進程所在 cgroup 的成員留攒。然后可根據(jù)需要將該子任務(wù)移動到不同的 cgroup 中,但開始時它總是繼承其父任務(wù)的 cgroup嫉嘀。
????????如圖所示炼邀,CPU 和 Memory 兩個子系統(tǒng)有自己獨立的層級系統(tǒng),而又通過 Task Group 取得關(guān)聯(lián)關(guān)系
1.3.2 cgroups子系統(tǒng)
????????cgroups 為每種可以精細化控制的資源定義了一個子系統(tǒng)剪侮,典型的子系統(tǒng)如下:
- cpu 子系統(tǒng): 主要限制進程cpu的使用率(也可以理解為限制分配給cpu的core拭宁,最終限制是cpu 利用率的限制洛退;比如一共32core 分配4core ,那這個進程cpu 最大占用率 = 12.5%杰标,所以一個進程可以申請< 1core兵怯,因為最后是轉(zhuǎn)換成比率來控制的;
- cpu 子系統(tǒng)腔剂,主要限制進程的 cpu 使用率媒区。
- cpuacct 子系統(tǒng):統(tǒng)計每個進程cpu 使用率的報告,如果達到預(yù)定的上限掸犬,可以采取一定的措施袜漩;
- cpuset 子系統(tǒng):可以為進程分配單獨的cpu節(jié)點或者mem節(jié)點,可以理解為為進程分配指定的額cpu占有率湾碎,就是精細化控制cpu資源宙攻;
- memery 子系統(tǒng):可以限制進程memery 最大的使用量;
- blkio 子系統(tǒng):可以限制進程訪問的塊設(shè)備io介褥;
- device 子系統(tǒng):可以控制訪問的設(shè)備座掘;
- net_cls 子系統(tǒng):標(biāo)記cgroups 中的網(wǎng)絡(luò)數(shù)據(jù)包,然后可以使用tc模塊(traffice control) 系統(tǒng)對數(shù)據(jù)包進行控制柔滔;比如namespace NET 的可以通過這個系統(tǒng)讓namespace 內(nèi)進程可以獨立進行網(wǎng)絡(luò)通信溢陪,功能類似于自己單獨的網(wǎng)卡、單獨的帶寬廊遍;
- net_prio子系統(tǒng):這個子系統(tǒng)用來設(shè)計網(wǎng)絡(luò)流量的優(yōu)先級
- freezer 子系統(tǒng)嬉愧,可以stop或者start cgroups 管理的進程,就是監(jiān)控進程的狀態(tài)喉前,如果設(shè)置了一直是start狀態(tài)没酣,就去確定環(huán)境是否是ok,如果ok就啟動服務(wù)卵迂;
- ns子系統(tǒng): 可以控制cgroup的進程訪問不同的namespace裕便;這個配合namespace的功能實現(xiàn)容器的隔離效果;
- hugetlb子系統(tǒng):這個子系統(tǒng)主要針對于HugeTLB系統(tǒng)進行限制见咒,這是一個大頁文件系統(tǒng)偿衰。
????????這里每一個子系統(tǒng)都需要跟內(nèi)核的其他模塊配合來完成資源的控制,比如對cpu資源的控制改览,需要內(nèi)核的進程調(diào)度模塊根據(jù)cpu子系統(tǒng)的配置來完成下翎;內(nèi)存資源的限制需要內(nèi)核的內(nèi)存模塊根據(jù)memery子系統(tǒng)的配置來完成。
1.3.3 如何查看當(dāng)前系統(tǒng)支持哪些subsystem
????????可以通過查看/proc/cgroups(since Linux 2.6.24)知道當(dāng)前系統(tǒng)支持哪些subsystem宝当,下面是一個例子:
?????????從左到右视事,字段的含義分別是:
- subsystem的名字
- subsystem所關(guān)聯(lián)到的cgroup樹的ID,如果多個subsystem關(guān)聯(lián)到同一顆cgroup樹庆揩,那么他們的這個字段將一樣俐东,比如這里的cpu和cpuacct就一樣跌穗,表示他們綁定到了同一顆樹。如果出現(xiàn)下面的情況虏辫,這個字段將為0:
-
- 當(dāng)前subsystem沒有和任何cgroup樹綁定
- 當(dāng)前subsystem已經(jīng)和cgroup v2的樹綁定
- 當(dāng)前subsystem沒有被內(nèi)核開啟
- subsystem所關(guān)聯(lián)的cgroup樹中進程組的個數(shù)蚌吸,也即樹上節(jié)點的個數(shù)
- 1表示開啟,0表示沒有被開啟(可以通過設(shè)置內(nèi)核的啟動參數(shù)“cgroup_disable”來控制subsystem的開啟).
1.4 cgroups提供的功能
- 限制進程組可以使用的資源(Resource limiting ):比如memory子系統(tǒng)可以為進程組設(shè)定一個memory使用上限砌庄,進程組使用的內(nèi)存達到限額再申請內(nèi)存羹唠,就會出發(fā)OOM(out of memory)
- 進程組的優(yōu)先級控制(Prioritization ):比如可以使用cpu子系統(tǒng)為某個進程組分配cpu share
- 統(tǒng)計進程組使用的資源量(Accounting ):比如使用cpuacct子系統(tǒng)記錄某個進程組使用的cpu時間
- 進程組隔離(Isolation):比如使用ns子系統(tǒng)可以使不同的進程組使用不同的namespace,以達到隔離的目的鹤耍,不同的進程組有各自的進程肉迫、網(wǎng)絡(luò)、文件系統(tǒng)掛載空間
- 進程組控制(Control):比如使用freezer子系統(tǒng)可以將進程組掛起和恢復(fù)
參考鏈接?
linux 容器(LXC) 第4章 cgroups_caoshuming_500的博客-CSDN博客
Linux 基礎(chǔ):cgroup 原理與實現(xiàn)_CGroup_層級_控制
【docker 底層知識】cgroup 原理分析_張忠琳的博客-CSDN博客_cgroup
CGroup的原理和使用_書笑生的博客-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