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