Linux
下的cgroups
溃蔫,全稱叫Control Groups
健提,最初由Google工程師提出并實現(xiàn),linux從2.6開始將這個特性納入內(nèi)核伟叛。cgroups主要對進程按組(Group
)進行資源配額的控制私痹,包括CPU、內(nèi)存统刮、IO等紊遵,相比古老的ulimit
,cgroups更為平滑和易用侥蒙,成為容器技術(shù)(比如docker
)的基礎(chǔ)暗膜。
cgroups的形態(tài)
-
hierarchy
:cgroups從用戶態(tài)看,提供了一種叫cgroup
類型的文件系統(tǒng)(Filesystem)
鞭衩,這是一種虛擬的文件系統(tǒng)学搜,并不真正保存文件娃善,類似/proc
。通過對這個文件系統(tǒng)的操作(讀瑞佩,寫会放,創(chuàng)建子目錄),告訴內(nèi)核钉凌,你希望內(nèi)核如何控制進程對資源的使用咧最。文件系統(tǒng)本身是層級的,所以構(gòu)成了hierarchy
御雕。 -
task
:進程(process
)在cgroups中稱為task矢沿,taskid
就是pid
。 -
subsystem
:cgroups支持的所有可配置的資源稱為subsystem酸纲。例如cpu
是一種subsystem捣鲸,memory
也是一種subsystem。linux內(nèi)核在演進過程中subsystem是不斷增加的闽坡。 -
libcgroup
:一個開源軟件栽惶,提供了一組支持cgroups的應(yīng)用程序和庫,方便用戶配置和使用cgroups疾嗅。目前許多發(fā)行版都附帶這個軟件外厂。
事實上,使用cgroups是非常簡單的代承,幾行shell命令就可以汁蝶。下面以CPU子系統(tǒng)為例,來嘗試控制一個進程的CPU利用率论悴。
掛載cgroup文件系統(tǒng)
首先掛載cgroup文件系統(tǒng):
# mkdir -p /cgroup/mave
# mount -t cgroup -o cpu mave /cgroup/mave
# cat /proc/mounts
...
mave /cgroup/mave cgroup rw,relatime,cpu 0 0
上面的命令掛載了一個cpu
子系統(tǒng)掖棉,目錄為/cgroup/mave
,名字叫mave
膀估。cpu子系統(tǒng)用于控制進程的cpu總體占用率幔亥,是最常用的子系統(tǒng)。內(nèi)核會根據(jù)配額的設(shè)置在調(diào)度進程上做出相應(yīng)的調(diào)整察纯。
觀察/cgroup/mave
目錄:
# ls /cgroup/mave
cgroup.event_control
cpu.cfs_period_us
cpu.rt_period_us
cpu.shares
notify_on_release
cgroup.procs
cpu.cfs_quota_us
cpu.rt_runtime_us
cpu.stat
release_agent
tasks
這些文件是自動創(chuàng)建出來的帕棉,且都跟cpu這個子系統(tǒng)有關(guān)。不同的子系統(tǒng)會創(chuàng)建出不同的文件捐寥。我們重點關(guān)注:
- cpu.cfs_period_us
- cpu.cfs_quota_us
- tasks
tasks
這個文件里面可以寫入一個或多個taskid
(pid)笤昨,/cgroup/mave
這個組中的配額設(shè)置將影響這些task祖驱。
cpu.cfs_period_us
# cat /cgroup/mave/cpu.cfs_period_us
100000
表示將cpu時間片分成100000
份握恳。
cpu.cfs_quota_us
# cat /cgroup/mave/cpu.cfs_period_us
200000
表示當(dāng)前這個組中的task(/cgroup/mave/tasks
中的taskid
)將分配多少比例的cpu時間片。由于是雙核cpu捺僻,這里就表示最多可以用到200%
的CPU乡洼。
創(chuàng)建一個控制組
盡管根目錄(/cgroup/mave
)也可以設(shè)置配額崇裁,但是習(xí)慣上,我們在這個目錄下創(chuàng)建一個目錄束昵,作為一個控制組
拔稳,這個控制組可以單獨設(shè)置配額,而不影響其他控制組
:
# mkdir /cgroup/mave/steam
# ls /cgroup/mave/steam
cgroup.event_control
cpu.cfs_period_us
cpu.rt_period_us
cpu.shares
notify_on_release
cgroup.procs
cpu.cfs_quota_us
cpu.rt_runtime_us
cpu.stat
tasks
可以看到锹雏,創(chuàng)建的steam
目錄下也會自動創(chuàng)建出一堆cpu子系統(tǒng)相關(guān)的文件巴比,幾乎和根目錄(/cgroup/mave
)完全一樣。現(xiàn)在我們再來理解一下什么是hierarchy
:
hierarchy
就是一個帶有繼承關(guān)系的目錄層次礁遵,每一層形成一個控制組
轻绞,單獨控制其中的task。
一個文件系統(tǒng)可以同時掛載多種子系統(tǒng)
手動設(shè)置配額
采集器進程在不受限制的情況下全速采集佣耐,CPU占用率達到50%
:
將5000寫入cpu.cfs_quota_us
政勃,表示希望CPU占用率控制在(5000/100000=5%)以內(nèi):
# echo 5000 > /cgroup/mave/steam/cpu.cfs_quota_us
然后將進程號30126
寫入tasks
:
# echo 30126 >> /cgroup/mave/steam/tasks
觀察cpu占用率,瞬間降到4%
兼砖。
自動設(shè)置
可以看到奸远,使用cgroups十分簡單,效果很好讽挟。然而懒叛,進程id并不是每次都保持不變。我們需要一些自動化的機制耽梅。上文提到過libcgroup芍瑞,這個庫提供了掛載、配置和運行的程序和庫褐墅。
附:cgroups中的子系統(tǒng)
- blkio 設(shè)置限制每個塊設(shè)備的輸入輸出控制拆檬。例如:磁盤,光盤以及usb等等妥凳。
- cpu 使用調(diào)度程序為cgroup任務(wù)提供cpu的訪問竟贯。
- cpuacct 產(chǎn)生cgroup任務(wù)的cpu資源報告。
- cpuset 如果是多核心的cpu逝钥,這個子系統(tǒng)會為cgroup任務(wù)分配單獨的cpu和內(nèi)存屑那。
- devices 允許或拒絕cgroup任務(wù)對設(shè)備的訪問。
- freezer 暫停和恢復(fù)cgroup任務(wù)艘款。
- memory 設(shè)置每個cgroup的內(nèi)存限制以及產(chǎn)生內(nèi)存資源報告持际。
- net_cls 標(biāo)記每個網(wǎng)絡(luò)包以供cgroup方便使用。
- ns 名稱空間子系統(tǒng)哗咆。
- perf_event 增加了對每group的監(jiān)測跟蹤的能力蜘欲,即可以監(jiān)測屬于某個特定的group的所有線程以及運行在特定CPU上的線程,此功能對于監(jiān)測整個group非常有用晌柬。