Docker Cgroups
Docker中利用namespace來(lái)做權(quán)限控制,用cgroups來(lái)做資源控制,這兩個(gè)都是非常重要的,下面是整理了一些關(guān)于cgroups相關(guān)的。
cgroups全稱(chēng)control groups ,是Linux內(nèi)核提供的一種機(jī)制,用來(lái)限制、控制與分離一個(gè)進(jìn)程組的資源(如CPU、內(nèi)存、磁盤(pán)輸入輸出等)。
cgroups最初的目標(biāo)是為資源管理提供的一個(gè)統(tǒng)一的框架,即整合現(xiàn)有的cpuset等子系統(tǒng),也為未來(lái)開(kāi)發(fā)新的子系統(tǒng)提供接口。現(xiàn)在的cgroups適用于多種應(yīng)用場(chǎng)景,從單個(gè)進(jìn)程的資源控制,到實(shí)現(xiàn)操作系統(tǒng)層次的虛擬化,cgroups提供了以下功能:
cgroup的API以一個(gè)偽文件系統(tǒng)的方式實(shí)現(xiàn),即用戶可以通過(guò)文件操作實(shí)現(xiàn)cgroup的組織管理。
cgroup 的組織管理操作單元可以細(xì)粒度到線程級(jí)別,用戶態(tài)代碼也可以針對(duì)系統(tǒng)分配的資源創(chuàng)建和銷(xiāo)毀cgroup,從而實(shí)現(xiàn)資源再分配和管理。
所有資源管理的功能都以subsystem(子系統(tǒng))的方式實(shí)現(xiàn)。
子進(jìn)程創(chuàng)建之初與其父進(jìn)程處于同一個(gè)cgroups的控制組。
術(shù)語(yǔ):
task(任務(wù))
系統(tǒng)中的進(jìn)程。
cgroup(控制組)
cgroups中的資源控制都以cgroup為單位實(shí)現(xiàn)。cgroup表示按某種資源控制標(biāo)準(zhǔn)劃分而成的任務(wù)組,包含一個(gè)或多個(gè)子系統(tǒng)。一個(gè)任務(wù)可以加入某個(gè)cgroup,也可以從某個(gè)cgroup遷移到另外一個(gè)cgroup。
?
subsystem(子系統(tǒng))
cgroups中的subsystem就是一個(gè)資源調(diào)度控制器(Resource Controller)。比如CPU子系統(tǒng)可以控制CPU時(shí)間分配,內(nèi)存子系統(tǒng)可以限制cgroup內(nèi)存使用量。
?
hierarchy(層級(jí)樹(shù))
hierarchy由一系列cgroup以一個(gè)樹(shù)狀結(jié)構(gòu)排列而成,每個(gè)hierarchy通過(guò)綁定對(duì)應(yīng)的subsystem進(jìn)行資源調(diào)度。hierarchy中的cgroup節(jié)點(diǎn)可以包含0或者多個(gè)子節(jié)點(diǎn),子節(jié)點(diǎn)繼承父節(jié)點(diǎn)屬性。整個(gè)系統(tǒng)可以有多個(gè)hierarchy。
?
cgroup是分層管理的,類(lèi)似進(jìn)程,且子cgroup會(huì)繼承上級(jí)cgroup的一些屬性。
?
下面簡(jiǎn)單做一個(gè)對(duì)指定進(jìn)程cpu使用率限制的例子感受下。
先用mount命令查看掛載目錄
mount -t cgroup
?
cd 過(guò)去創(chuàng)建一個(gè)測(cè)試的節(jié)點(diǎn)(文件夾)
cd /sys/fs/cgroup/cpu
sudo mkdir cpu_limit_demo
?
創(chuàng)建好cpu_limit_demo目錄后cd過(guò)去會(huì)發(fā)現(xiàn)系統(tǒng)會(huì)自動(dòng)創(chuàng)建很多文件。
?
跟上一層路徑下面的文件很像,可以理解成是樹(shù)的更深一個(gè)層的節(jié)點(diǎn)。
?
cfs_period 和 cfs_quota兩個(gè)文件,這兩個(gè)參數(shù)需要組合使用,可以用來(lái)限制進(jìn)程在長(zhǎng)度為cfs_period 的一段時(shí)間內(nèi),只能被分配到總量為cfs_quota 的 CPU 時(shí)間。
看下默認(rèn)值:
?
-1表示不啟用,假如現(xiàn)在想控制某個(gè)進(jìn)程cpu上限是50%,就在quota里面直接插入一個(gè)50000(period的一半)。
?
先跑一個(gè)whlie1 把 cpu 打滿
while : ; do : ; done &
?
然后執(zhí)行 echo 50000 > cpu.cfs_quota_us?限制50% 使用率,然后再把需要限制的pid卸載tasks里面 echo 30880 > tasks
?
還有很多其他限制例子,可以看下這個(gè)
https://www.cnblogs.com/wdliu/p/10509045.html
?
?
?
?
?
總結(jié)
以上是生活随笔為你收集整理的Docker Cgroups的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: Docker 底层实现
- 下一篇: Docker 修改运行中的容器端口映射