【重识云原生】第六章容器6.1.7.2节——cgroups原理剖析
??《重識(shí)云原生系列》專題索引:
?第四章云網(wǎng)絡(luò)4.9.1節(jié)——網(wǎng)絡(luò)卸載加速技術(shù)綜述
第四章云網(wǎng)絡(luò)4.9.2節(jié)——傳統(tǒng)網(wǎng)絡(luò)卸載技術(shù)
第四章云網(wǎng)絡(luò)4.9.3.1節(jié)——DPDK技術(shù)綜述
第四章云網(wǎng)絡(luò)4.9.3.2節(jié)——DPDK原理詳解
第四章云網(wǎng)絡(luò)4.9.4.1節(jié)——智能網(wǎng)卡SmartNIC方案綜述
第四章云網(wǎng)絡(luò)4.9.4.2節(jié)——智能網(wǎng)卡實(shí)現(xiàn)
第六章容器6.1.1節(jié)——容器綜述
第六章容器6.1.2節(jié)——容器安裝部署
第六章容器6.1.3節(jié)——Docker常用命令
第六章容器6.1.4節(jié)——Docker核心技術(shù)LXC
第六章容器6.1.5節(jié)——Docker核心技術(shù)Namespace
第六章容器6.1.6節(jié)—— Docker核心技術(shù)Chroot
第六章容器6.1.7.1節(jié)——Docker核心技術(shù)cgroups綜述
第六章容器6.1.7.2節(jié)——cgroups原理剖析
第六章容器6.1.7.3節(jié)——cgroups數(shù)據(jù)結(jié)構(gòu)剖析
第六章容器6.1.7.4節(jié)——cgroups使用
第六章容器6.1.8節(jié)——Docker核心技術(shù)UnionFS
第六章容器6.1.9節(jié)——Docker鏡像技術(shù)剖析
第六章容器6.1.10節(jié)——DockerFile解析
第六章容器6.1.11節(jié)——docker-compose容器編排
第六章容器6.1.12節(jié)——Docker網(wǎng)絡(luò)模型設(shè)計(jì)
第六章容器6.2.1節(jié)——Kubernetes概述
第六章容器6.2.2節(jié)——K8S架構(gòu)剖析
第六章容器6.3.1節(jié)——K8S核心組件總述
第六章容器6.3.2節(jié)——API Server組件
第六章容器6.3.3節(jié)——Kube-Scheduler使用篇
第六章容器6.3.4節(jié)——etcd組件
第六章容器6.3.5節(jié)——Controller Manager概述
第六章容器6.3.6節(jié)——kubelet組件
第六章容器6.3.7節(jié)——命令行工具kubectl
第六章容器6.3.8節(jié)——kube-proxy
第六章容器6.4.1節(jié)——K8S資源對(duì)象總覽
第六章容器6.4.2.1節(jié)——pod詳解
第六章容器6.4.2.2節(jié)——Pod使用(上)
第六章容器6.4.2.3節(jié)——Pod使用(下)
第六章容器6.4.3節(jié)——ReplicationController
第六章容器6.4.4節(jié)——ReplicaSet組件
第六章容器基礎(chǔ)6.4.5.1節(jié)——Deployment概述
第六章容器基礎(chǔ)6.4.5.2節(jié)——Deployment配置詳細(xì)說(shuō)明
第六章容器基礎(chǔ)6.4.5.3節(jié)——Deployment實(shí)現(xiàn)原理解析
第六章容器基礎(chǔ)6.4.6節(jié)——Daemonset
第六章容器基礎(chǔ)6.4.7節(jié)——Job
第六章容器基礎(chǔ)6.4.8節(jié)——CronJob
2 cgroups原理解析
????????上面是說(shuō)的cgroups 是內(nèi)核提供的功能,但現(xiàn)在我們?cè)谟脩艨臻g想使用的是cgroup的功能。其原理是:linux 內(nèi)核有一個(gè)很強(qiáng)大的模塊叫做VFS(vritual File System),VFS 把具體的文件系統(tǒng)的細(xì)節(jié)隱藏起來(lái),給用戶態(tài)進(jìn)程提供一個(gè)完備的文件系統(tǒng)API接口。linux 也是通過(guò)VFS 把cgroups 功能暴漏給用戶態(tài)進(jìn)程的,cgroups 與VFS 之間的銜接部分叫做cgroups 文件系統(tǒng)。
????????用戶態(tài)進(jìn)程對(duì)groups 文件系統(tǒng)的操作,通過(guò)VFS 轉(zhuǎn)換成cgroups 層級(jí)結(jié)構(gòu)的維護(hù)。
2.1 cgroups 層級(jí)樹(shù)的四大規(guī)則
????????傳統(tǒng)的進(jìn)程啟動(dòng),是以init為根節(jié)點(diǎn),也叫父進(jìn)程,由它來(lái)創(chuàng)建子進(jìn)程,作為子節(jié)點(diǎn),而每個(gè)子節(jié)點(diǎn)還可以創(chuàng)建新的子節(jié)點(diǎn),這樣構(gòu)成了樹(shù)狀結(jié)構(gòu)。而cgroup的結(jié)構(gòu)也是類似的,子節(jié)點(diǎn)繼承父節(jié)點(diǎn)的屬性。他們最大的不同在于,系統(tǒng)的cgroup構(gòu)成的層級(jí)樹(shù)允許有多個(gè)存在,如果進(jìn)程模型是init為根節(jié)點(diǎn)形成一個(gè)樹(shù),那cgroup的模型由多個(gè)層級(jí)樹(shù)來(lái)構(gòu)成。
????????內(nèi)核使用 cgroup 結(jié)構(gòu)體來(lái)表示一個(gè) control group 對(duì)某一個(gè)或者某幾個(gè) cgroups 子系統(tǒng)的資源限制。cgroup 結(jié)構(gòu)體可以組織成一顆樹(shù)的形式,每一棵cgroup 結(jié)構(gòu)體組成的樹(shù)稱之為一個(gè) cgroups 層級(jí)樹(shù)。
1. 同一個(gè)cgroups層級(jí)樹(shù)可以 attach 一個(gè)或者幾個(gè) cgroups 子系統(tǒng)(subsystem),當(dāng)前層級(jí)樹(shù)可以對(duì)其 attach 的 cgroups 子系統(tǒng)進(jìn)行資源的限制。每一個(gè) cgroups 子系統(tǒng)只能被 attach 到一個(gè)層級(jí)樹(shù)中。
2. 創(chuàng)建了 cgroups 層級(jí)樹(shù)中的節(jié)點(diǎn)(cgroup 結(jié)構(gòu)體)之后,可以把進(jìn)程加入到某一個(gè)節(jié)點(diǎn)的控制任務(wù)列表中,一個(gè)節(jié)點(diǎn)的控制列表中的所有進(jìn)程都會(huì)受到當(dāng)前節(jié)點(diǎn)的資源限制。同時(shí)某一個(gè)進(jìn)程也可以被加入到不同的 cgroups 層級(jí)樹(shù)的節(jié)點(diǎn)中,因?yàn)椴煌?cgroups 層級(jí)樹(shù)可以負(fù)責(zé)不同的系統(tǒng)資源。所以說(shuō)進(jìn)程和 cgroup 結(jié)構(gòu)體是一個(gè)多對(duì)多的關(guān)系。
????????上面這個(gè)圖從整體結(jié)構(gòu)上描述了進(jìn)程與 cgroups 之間的關(guān)系。最下面的P代表一個(gè)進(jìn)程。每一個(gè)進(jìn)程的描述符中有一個(gè)指針指向了一個(gè)輔助數(shù)據(jù)結(jié)構(gòu)css_set(cgroups subsystem set)。 指向某一個(gè)css_set的進(jìn)程會(huì)被加入到當(dāng)前css_set的進(jìn)程鏈表中。一個(gè)進(jìn)程只能隸屬于一個(gè)css_set,一個(gè)css_set可以包含多個(gè)進(jìn)程,隸屬于同一css_set的進(jìn)程受到同一個(gè)css_set所關(guān)聯(lián)的資源限制。
????????上圖中的”M×N Linkage”說(shuō)明的是css_set通過(guò)輔助數(shù)據(jù)結(jié)構(gòu)可以與 cgroups 節(jié)點(diǎn)進(jìn)行多對(duì)多的關(guān)聯(lián)。但是 cgroups 的實(shí)現(xiàn)不允許css_set同時(shí)關(guān)聯(lián)同一個(gè)cgroups層級(jí)樹(shù)下多個(gè)節(jié)點(diǎn)。 這是因?yàn)?cgroups 對(duì)同一種資源不允許有多個(gè)限制配置。
????????一個(gè)css_set關(guān)聯(lián)多個(gè) cgroups 層級(jí)樹(shù)的節(jié)點(diǎn)時(shí),表明需要對(duì)當(dāng)前css_set下的進(jìn)程進(jìn)行多種資源的控制。而一個(gè) cgroups 節(jié)點(diǎn)關(guān)聯(lián)多個(gè)css_set時(shí),表明多個(gè)css_set下的進(jìn)程列表受到同一份資源的相同限制。
3. 一個(gè)task不能存在于同一個(gè)hierarchy的不同cgroup,但可以存在在不同hierarchy中的多個(gè)cgroup
????????系統(tǒng)每次新建一個(gè)hierarchy(即層級(jí)樹(shù))時(shí),該系統(tǒng)上的所有task默認(rèn)構(gòu)成了這個(gè)新建的hierarchy的初始化cgroup,這個(gè)cgroup也稱為root cgroup。
????????對(duì)于你創(chuàng)建的每個(gè)hierarchy,task只能存在于其中一個(gè)cgroup中,即一個(gè)task不能存在于同一個(gè)hierarchy的不同cgroup中,但是一個(gè)task可以存在在不同hierarchy中的多個(gè)cgroup中。
????????如果操作時(shí)把一個(gè)task添加到同一個(gè)hierarchy中的另一個(gè)cgroup中,則會(huì)從第一個(gè)cgroup中移除。
????????如下圖,cpu和memory被附加到cpu_mem_cg的hierarchy。而net_cls被附加到net hierarchy。并且httpd進(jìn)程被同時(shí)加到了cpu_mem_cg hierarchy的cg1 cgroup中和net hierarchy的cg3 cgroup中。并通過(guò)兩個(gè)hierarchy的subsystem分別對(duì)httpd進(jìn)程進(jìn)行cpu,memory及網(wǎng)絡(luò)帶寬的限制。
4. 子task繼承父task cgroup的關(guān)系
????????系統(tǒng)中的任何一個(gè)task(Linux中的進(jìn)程)fork自己創(chuàng)建一個(gè)子task(子進(jìn)程)時(shí),子task會(huì)自動(dòng)的繼承父task cgroup的關(guān)系,在同一個(gè)cgroup中,但是子task可以根據(jù)需要移到其它不同的cgroup中。父子task之間是相互獨(dú)立不依賴的。
????????如下圖,httpd進(jìn)程在cpu_and_mem hierarchy的/cg1 cgroup中并把PID 4537寫到該cgroup的tasks中。
????????之后httpd(PID=4537)進(jìn)程fork一個(gè)子進(jìn)程httpd(PID=4840)與其父進(jìn)程在同一個(gè)hierarchy的統(tǒng)一個(gè)cgroup中,但是由于父task和子task之間的關(guān)系獨(dú)立不依賴的,所以子task可以移到其它的cgroup中。
?2.2 cgroup 的組成
????????cgroup 代表“控制組”,并且不會(huì)使用大寫。cgroup 是一種分層組織進(jìn)程的機(jī)制, 沿層次結(jié)構(gòu)以受控的方式分配系統(tǒng)資源。我們通常使用單數(shù)形式用于指定整個(gè)特征,也用作限定符如 “cgroup controller” 。
????????cgroup 主要有兩個(gè)組成部分:
- core - 負(fù)責(zé)分層組織過(guò)程;
- controller - 通常負(fù)責(zé)沿層次結(jié)構(gòu)分配特定類型的系統(tǒng)資源。每個(gè) cgroup 都有一個(gè)?cgroup.controllers?文件,其中列出了所有可供 cgroup 啟用的控制器。當(dāng)在?cgroup.subtree_control?中指定多個(gè)控制器時(shí),要么全部成功,要么全部失敗。在同一個(gè)控制器上指定多項(xiàng)操作,那么只有最后一個(gè)生效。每個(gè) cgroup 的控制器銷毀是異步的,在引用時(shí)同樣也有著延遲引用的問(wèn)題;
????????所有 cgroup 核心接口文件都以?cgroup?為前綴。每個(gè)控制器的接口文件都以控制器名稱和一個(gè)點(diǎn)為前綴。控制器的名稱由小寫字母和“”組成,但永遠(yuǎn)不會(huì)以“”開(kāi)頭。
2.2.1 cgroup 的核心文件
- cgroup.type - (單值)存在于非根 cgroup 上的可讀寫文件。通過(guò)將“threaded”寫入該文件,可以將 cgroup 轉(zhuǎn)換為線程 cgroup,可選擇 4 種取值,如下:
- domain - 一個(gè)正常的有效域 cgroup
- domain threaded - 線程子樹(shù)根的線程域 cgroup
- domain invalid - 無(wú)效的 cgroup
- threaded - 線程 cgroup,線程子樹(shù)
- cgroup.procs - (換行分隔)所有 cgroup 都有的可讀寫文件。每行列出屬于 cgroup 的進(jìn)程的 PID。PID 不是有序的,如果進(jìn)程移動(dòng)到另一個(gè) cgroup ,相同的 PID 可能會(huì)出現(xiàn)不止一次;
- cgroup.controllers - (空格分隔)所有 cgroup 都有的只讀文件。顯示 cgroup 可用的所有控制器;
- cgroup.subtree_control - (空格分隔)所有 cgroup 都有的可讀寫文件,初始為空。如果一個(gè)控制器在列表中出現(xiàn)不止一次,最后一個(gè)有效。當(dāng)指定多個(gè)啟用和禁用操作時(shí),要么全部成功,要么全部失敗。
- 以“+”為前綴的控制器名稱表示啟用控制器
- 以“-”為前綴的控制器名稱表示禁用控制器
- cgroup.events - 存在于非根 cgroup 上的只讀文件。
- populated - cgroup 及其子節(jié)點(diǎn)中包含活動(dòng)進(jìn)程,值為1;無(wú)活動(dòng)進(jìn)程,值為0.
- frozen - cgroup 是否被凍結(jié),凍結(jié)值為1;未凍結(jié)值為0.
- cgroup.threads - (換行分隔)所有 cgroup 都有的可讀寫文件。每行列出屬于 cgroup 的線程的 TID。TID 不是有序的,如果線程移動(dòng)到另一個(gè) cgroup ,相同的 TID 可能會(huì)出現(xiàn)不止一次。
- cgroup.max.descendants - (單值)可讀寫文件。最大允許的 cgroup 子節(jié)點(diǎn)數(shù)量。
- cgroup.max.depth - (單值)可讀寫文件。低于當(dāng)前節(jié)點(diǎn)最大允許的樹(shù)深度。
- cgroup.stat - 只讀文件。
- nr_descendants - 可見(jiàn)后代的 cgroup 數(shù)量。
- nr_dying_descendants - 被用戶刪除即將被系統(tǒng)銷毀的 cgroup 數(shù)量。
- cgroup.freeze - (單值)存在于非根 cgroup 上的可讀寫文件。默認(rèn)值為0。當(dāng)值為1時(shí),會(huì)凍結(jié) cgroup 及其所有子節(jié)點(diǎn) cgroup,會(huì)將相關(guān)的進(jìn)程關(guān)停并且不再運(yùn)行。凍結(jié) cgroup 需要一定的時(shí)間,當(dāng)動(dòng)作完成后, cgroup.events 控制文件中的 “frozen” 值會(huì)更新為“1”,并發(fā)出相應(yīng)的通知。cgroup 的凍結(jié)狀態(tài)不會(huì)影響任何 cgroup 樹(shù)操作(刪除、創(chuàng)建等);
- cgroup.kill - (單值)存在于非根 cgroup 上的可讀寫文件。唯一允許值為1,當(dāng)值為1時(shí),會(huì)將 cgroup 及其所有子節(jié)點(diǎn)中的 cgroup 殺死(進(jìn)程會(huì)被 SIGKILL 殺掉)。一般用于將一個(gè) cgroup 樹(shù)殺掉,防止葉子節(jié)點(diǎn)遷移;
2.3子系統(tǒng)接口/參數(shù)
2.3.1 cpu子系統(tǒng):用于限制進(jìn)程的 CPU 利用率
CPU資源的控制有兩種策略:
- 一種是完全公平調(diào)度 (CFS:Completely Fair Scheduler)策略,提供了限額和按比例分配兩種方式進(jìn)行資源控制;
- 另一種是實(shí)時(shí)調(diào)度(Real-Time Scheduler)策略,針對(duì)實(shí)時(shí)進(jìn)程按周期分配固定的運(yùn)行時(shí)間。配置時(shí)間都以微秒(μs)為單位,文件名中用us表示。
CFS調(diào)度策略下的配置:
- 設(shè)定CPU使用周期使用時(shí)間上限
- cpu.cfs_period_us:規(guī)定CPU的時(shí)間周期(單位是微秒)。最大值是1秒,最小值是1000微秒。如果在一個(gè)單CPU的系統(tǒng)內(nèi),要保證一個(gè)cgroup 內(nèi)的任務(wù)在1秒的CPU周期內(nèi)占用0.2秒的CPU時(shí)間,可以通過(guò)設(shè)置cpu.cfs_quota_us 為200000和cpu.cfs_period_us 為 1000000。必須與cfs_quota_us配合使用。
- cpu.cfs_quota_us :在單位時(shí)間內(nèi)(即cpu.cfs_period_us設(shè)定值)可用的CPU最大時(shí)間(單位是微秒)。cpu.cfs_quota_us值可以大于cpu.cfs_period_us值,例如在一個(gè)雙CPU的系統(tǒng)內(nèi),想要一個(gè)cgroup內(nèi)的進(jìn)程充分的利用2個(gè)CPU,可以設(shè)定cpu.cfs_quota_us為 200000 及cpu.cfs_period_us為 100000,當(dāng)設(shè)定cpu.cfs_quota_us為-1時(shí),表明不受限制,同時(shí)這也是默認(rèn)值。
- cpu.stat:統(tǒng)計(jì)信息,包含nr_periods(表示經(jīng)歷了幾個(gè)cfs_period_us周期)、nr_throttled(表示task被限制的次數(shù))及throttled_time(表示task被限制的總時(shí)長(zhǎng))。
- 按權(quán)重比例設(shè)定CPU的分配
- cpu.shares:cpu比重分配。通過(guò)一個(gè)整數(shù)的數(shù)值來(lái)調(diào)節(jié)cgroup所占用的cpu時(shí)間。例如,有2個(gè)cgroup(假設(shè)為CPU1,CPU2),其中一個(gè)(CPU1)cpu.shares設(shè)定為100另外一個(gè)(CPU2)設(shè)為200,那么CPU2所使用的cpu時(shí)間將是CPU1所使用時(shí)間的2倍。cpu.shares?的值必須為2或者高于2。
????????RT調(diào)度策略下的配置 實(shí)時(shí)調(diào)度策略與公平調(diào)度策略中的按周期分配時(shí)間的方法類似,也是在周期內(nèi)分配一個(gè)固定的運(yùn)行時(shí)間。
- cpu.rt_period_us :設(shè)定周期時(shí)間。
- cpu.rt_runtime_us:設(shè)定周期中的運(yùn)行時(shí)間。
2.3.2 cpuacct子系統(tǒng):用于統(tǒng)計(jì)各個(gè) Cgroup 的 CPU 使用情況
????????這個(gè)子系統(tǒng)的配置是cpu子系統(tǒng)的補(bǔ)充,提供CPU資源用量的統(tǒng)計(jì),時(shí)間單位都是納秒。
- cpuacct.stat:統(tǒng)計(jì)cgroup中所有任務(wù)的用戶和內(nèi)核分別使用CPU的時(shí)長(zhǎng)
- cpuacct.usage:統(tǒng)計(jì)cgroup中所有任務(wù)的CPU使用時(shí)長(zhǎng)(納秒)
- cpuacct.usage_percpu:統(tǒng)計(jì)cgroup中所有任務(wù)使用的每個(gè)cpu的時(shí)間(納秒)
2.3.3 cpuset子系統(tǒng):為一組進(jìn)程分配指定的CPU和內(nèi)存節(jié)點(diǎn)
????????為task分配獨(dú)立CPU資源的子系統(tǒng),參數(shù)較多,這里只選講兩個(gè)必須配置的參數(shù),同時(shí)Docker中目前也只用到這兩個(gè)。
- cpuset.cpus:允許cgroup中的進(jìn)程使用的CPU列表。如0-2,16代表?0,1,2,16這4個(gè)CPU
- cpuset.mems:允許cgroup中的進(jìn)程使用的內(nèi)存節(jié)點(diǎn)列表。如0-2,16代表 0,1,2,16這4個(gè)可用節(jié)點(diǎn)
- cpuset.memory_migrate:當(dāng)cpuset.mems變化時(shí)內(nèi)存頁(yè)上的數(shù)據(jù)是否遷移(默認(rèn)值0,不遷移;1,遷移)
- cpuset.cpu_exclusive:cgroup是否獨(dú)占cpuset.cpus 中分配的cpu 。(默認(rèn)值0,共享;1,獨(dú)占),如果設(shè)置為1,其他cgroup內(nèi)的cpuset.cpus值不能包含有該cpuset.cpus內(nèi)的值
- cpuset.mem_exclusive:是否獨(dú)占memory,(默認(rèn)值0,共享;1,獨(dú)占)
- cpuset.mem_hardwall:cgroup中任務(wù)的內(nèi)存是否隔離,(默認(rèn)值0,不隔離;1,隔離,每個(gè)用戶的任務(wù)將擁有獨(dú)立的空間)
- cpuset.sched_load_balance:cgroup的cpu壓力是否會(huì)被平均到cpuset中的多個(gè)cpu上。(默認(rèn)值1,啟用負(fù)載均衡;0,禁用。)
2.3.4 memory子系統(tǒng):限制cgroup所能使用的內(nèi)存上限
- memory.limit_in_bytes:設(shè)定最大的內(nèi)存使用量,可以加單位(k/K,m/M,g/G)不加單位默認(rèn)為bytes
- memory.soft_limit_in_bytes:和 memory.limit_in_bytes 的差異是,這個(gè)限制并不會(huì)阻止進(jìn)程使用超過(guò)限額的內(nèi)存,只是在系統(tǒng)內(nèi)存不足時(shí),會(huì)優(yōu)先回收超過(guò)限額的進(jìn)程占用的內(nèi)存,使之向限定值靠攏。該值應(yīng)小于memory.limit_in_bytes設(shè)定值
- memory.memsw.limit_in_bytes:設(shè)定最大的內(nèi)存+swap的使用量
- memory.oom_control:當(dāng)進(jìn)程出現(xiàn)Out of Memory時(shí),是否進(jìn)行kill操作。默認(rèn)值0,kill;設(shè)置為1時(shí),進(jìn)程將進(jìn)入睡眠狀態(tài),等待內(nèi)存充足時(shí)被喚醒
- memory.force_empty:當(dāng)設(shè)置為0時(shí),清空該group的所有內(nèi)存頁(yè);該選項(xiàng)只有在當(dāng)前group沒(méi)有tasks才可以使用
- memory.stat:統(tǒng)計(jì)內(nèi)存使用情況。各項(xiàng)單位為字節(jié)
????????統(tǒng)計(jì)相關(guān)特性:
- memory.usage_bytes:報(bào)???告???該??? cgroup中???進(jìn)???程???使???用???的???當(dāng)???前???總???內(nèi)???存???用???量(以字節(jié)為單位)。
- memory.max_usage_bytes:報(bào)???告???該??? cgroup 中???進(jìn)???程???使???用???的???最???大???內(nèi)???存???用???量。
- memory.failcnt:報(bào)???告???內(nèi)???存???達(dá)???到???在??? memory.limit_in_bytes設(shè)???定???的???限???制???值???的???次???數(shù)???。
- memory.stat:包含大量的內(nèi)存統(tǒng)計(jì)數(shù)據(jù)。各項(xiàng)單位為字節(jié)。
- cache:頁(yè)???緩???存???,包???括??? tmpfs(shmem),單位為字節(jié)。
- rss:匿???名???和??? swap 緩???存???,不???包???括??? tmpfs(shmem),單位為字節(jié)。
- mapped_file:memory-mapped 映???射???的???文???件???大???小???,包???括??? tmpfs(shmem),單???位???為???字???節(jié)???。
- pgpgin:存???入???內(nèi)???存???中???的???頁(yè)???數(shù)???。
- pgpgout:從???內(nèi)???存???中???讀???出???的???頁(yè)???數(shù)。
- swap:swap 用???量???,單???位???為???字???節(jié)???。
- active_anon:在???活???躍???的???最???近???最???少???使???用???(least-recently-used,LRU)列???表???中???的???匿???名???和??? swap 緩???存???,包???括??? tmpfs(shmem),單???位???為???字???節(jié)???。
- inactive_anon:不???活???躍???的??? LRU 列???表???中???的???匿???名???和??? swap 緩???存???,包???括??? tmpfs(shmem),單???位???為???字???節(jié)。
- active_file:活???躍??? LRU 列???表???中???的??? file-backed 內(nèi)???存???,以???字???節(jié)???為???單???位。
- inactive_file:不???活???躍??? LRU 列???表???中???的??? file-backed 內(nèi)???存???,以???字???節(jié)???為???單???位。
- unevictable:無(wú)???法???再???生???的???內(nèi)???存???,以???字???節(jié)???為???單???位???。
- hierarchical_memory_limit:包???含??? memory cgroup 的???層???級(jí)???的???內(nèi)???存???限???制???,單???位???為???字???節(jié)???。
- hierarchical_memsw_limit:包???含??? memory cgroup 的???層???級(jí)???的???內(nèi)???存???加??? swap 限???制???,單???位???為???字???節(jié)???。
2.3.5 blkio子系統(tǒng):限制cgroup對(duì)IO的使用
- blkio.weight:設(shè)置權(quán)值,范圍在[100, 1000],屬于比重分配,不是絕對(duì)帶寬。因此只有當(dāng)不同 Cgroup 爭(zhēng)用同一個(gè) 阻塞設(shè)備時(shí)才起作用
- blkio.weight_device:對(duì)具體設(shè)備設(shè)置權(quán)值。它會(huì)覆蓋上面的選項(xiàng)值
- blkio.throttle.read_bps_device:對(duì)具體的設(shè)備,設(shè)置每秒讀磁盤的帶寬上限
- blkio.throttle.write_bps_device:對(duì)具體的設(shè)備,設(shè)置每秒寫磁盤的帶寬上限
- blkio.throttle.read_iops_device:對(duì)具體的設(shè)備,設(shè)置每秒讀磁盤的IOPS帶寬上限
- blkio.throttle.write_iops_device:對(duì)具體的設(shè)備,設(shè)置每秒寫磁盤的IOPS帶寬上限
2.3.6 devices子系統(tǒng):限定cgroup內(nèi)的進(jìn)程可以訪問(wèn)的設(shè)備
- devices.allow:允許訪問(wèn)的設(shè)備。文件包括4個(gè)字段:type(設(shè)備類型), major(主設(shè)備號(hào)), minor(次設(shè)備號(hào)), and access(訪問(wèn)方式);
- type
- a — 適用所有設(shè)備,包括字符設(shè)備和塊設(shè)備
- b — 塊設(shè)備
- c — 字符設(shè)備
- major, minor
- 9:*
- *:*
- 8:1
- access
- r — 讀
- w — 寫
- m — 創(chuàng)建不存在的設(shè)備
- devices.deny:禁止訪問(wèn)的設(shè)備,格式同devices.allow;
- devices.list:顯示目前允許被訪問(wèn)的設(shè)備列表;
2.3.7 freezer子系統(tǒng):暫停或恢復(fù)任務(wù)
- freezer.state:當(dāng)前cgroup中進(jìn)程的狀態(tài)
- FROZEN:掛起進(jìn)程
- FREEZING:進(jìn)程正在掛起中
- THAWED:激活進(jìn)程
1. 掛起進(jìn)程時(shí),會(huì)連同子進(jìn)程一同掛起。
2. 不能將進(jìn)程移動(dòng)到處于FROZEN狀態(tài)的cgroup中。
3. 只有FROZEN和THAWED可以被寫進(jìn)freezer.state中, FREEZING則不能。
2.4 cgroup 文件系統(tǒng)實(shí)現(xiàn)
????????VFS虛擬文件系統(tǒng)轉(zhuǎn)換,處理與Unix標(biāo)準(zhǔn)文件系統(tǒng)的所有系統(tǒng)調(diào)用。VFS對(duì)用戶提供統(tǒng)一的讀寫接口,用戶調(diào)用讀寫等函數(shù)時(shí),內(nèi)核則調(diào)用特定的文件系統(tǒng)實(shí)現(xiàn)。文件在內(nèi)核內(nèi)存中是一個(gè)file數(shù)據(jù)結(jié)構(gòu)來(lái)表示的。這個(gè)數(shù)據(jù)結(jié)構(gòu)包含一個(gè)f_op的字段,該字段中包含了一組指向特定文件系統(tǒng)實(shí)現(xiàn)的函數(shù)指針。當(dāng)用戶執(zhí)行read()操作時(shí),內(nèi)核調(diào)用sys_read(),然后sys_read()查找到指向該文件屬于的文件系統(tǒng)的讀函數(shù)指針,并調(diào)用它,即file->f_op->read()。
????????基于VFS實(shí)現(xiàn)的文件系統(tǒng),都必須實(shí)現(xiàn)定義這些對(duì)象,并實(shí)現(xiàn)這些對(duì)象中定義的函數(shù)指針。
????????cgroup文件系統(tǒng)的定義:
static struct file_system_type cgroup_fs_type = {
????????.name = "cgroup",
????????.get_sb = cgroup_get_sb,
????????.kill_sb = cgroup_kill_sb,
};
????????這里有定義了兩個(gè)函數(shù)指針,定義了一個(gè)文件系統(tǒng)必須實(shí)現(xiàn)了的兩個(gè)操作get_sb、kill_sb,即獲得超級(jí)塊和釋放超級(jí)塊。這兩個(gè)操作會(huì)在使用mount系統(tǒng)調(diào)用掛載cgroup文件系統(tǒng)時(shí)使用。
參考鏈接?
徹底搞懂容器技術(shù)的基石: cgroup
linux 容器(LXC) 第4章 cgroups_caoshuming_500的博客-CSDN博客
Cgroup原理及使用 - zhrx - 博客園
Linux 基礎(chǔ):cgroup 原理與實(shí)現(xiàn)_CGroup_層級(jí)_控制
【docker 底層知識(shí)】cgroup 原理分析_張忠琳的博客-CSDN博客_cgroup
CGroup的原理和使用_書笑生的博客-CSDN博客_cgroup原理
Docker核心原理之 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概述
Linux Cgroup系列(01):Cgroup概述 - SegmentFault 思否
深入理解 Linux Cgroup 系列(一):基本概念
深入理解 Linux Cgroup 系列(一):基本概念 - SegmentFault 思否
深入理解 Linux Cgroup 系列(二):玩轉(zhuǎn) CPU
深入理解 Linux Cgroup 系列(二):玩轉(zhuǎn) CPU - SegmentFault 思否
深入理解 Linux Cgroup 系列(三):內(nèi)存 - SegmentFault 思否
總結(jié)
以上是生活随笔為你收集整理的【重识云原生】第六章容器6.1.7.2节——cgroups原理剖析的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: 史上最强的超级爆笑锦集
- 下一篇: HDU5619 Jam's store(