一、簡介
Cgroups,也稱為Control Groups,是linux內核實現的即使調度及資源限制的工具。它通過將進程組織在層次結構中,並對每個組件分配和限制資源使用,來實現資源限制與監管。
在默認配置下,每個進程可以優先佔用系統的資源,這樣就可能出現某個進程獨佔的情況,並佔用所有CPU和內存資源導致系統卡死。此時,cgroups可以幫助管理員限制進程佔用資源的數量,這使得管理員可以更好地管理和控制系統,並且可以避免某個進程搶佔系統的所有資源。
二、Cgroups的層次結構
Cgroups的層次結構類似於樹形結構,最頂部的所屬的組稱為根組。下面是根組下的兩個組example和test,以此類推。
/ |--example | |--- 1.processA | |--- 2.processB | |--- 3.processC | |--test | |--- 4.processD | |--- 5.processE | |--- 6.processF |
Cgroups目錄樹的每個節點包含一個子系統,用於控制或限制一個特定的子集資源。這些資源包括CPU、內存、IO等。
三、Cgroups的組設置
Cgroups的設置是一種基於文件系統的API。/sys/fs/cgroup目錄下保存了有關所有cgroups和子系統的信息、文件和目錄。
可以通過mkdir命令在任意目錄下創建一個cgroup以及所有子cgroups,並且可以使用config文件中的配置參數來初始化。
$ mkdir /sys/fs/cgroup/cpu/example $ mkdir /sys/fs/cgroup/cpu/test $ mkdir /sys/fs/cgroup/memory/example $ mkdir /sys/fs/cgroup/memory/test
Cgroups的繼承規則:
可以將子組繼承其父組的參數。可以使用 「/」字元將多個組合成一個路徑。這意味著具有相同父組(或祖先組)的子組可以分別繼承行為。 如果沒找到相應的資源參數,則將默認使用同一父組的參數。
/cgroup1 /cgroup2 /cgroup1/group1 /cgroup2/group2
group1和group2在匹配資源參數時,將分別使用 /cgroup1 和 /cgroup2中的任何參數,以及任何匹配的默認參數。
四、Cgroups的子系統
CPU子系統
CPU控制子系統被用於限制CPU處理時間。下面是一些示例:
$ mkdir /sys/fs/cgroup/cpu/example $ echo 20000 > /sys/fs/cgroup/cpu/example/cpu.cfs_quota_us $ echo 50000 > /sys/fs/cgroup/cpu/example/cpu.cfs_period_us
在處理器周期(周期單位為微秒)中,限制CPU計算使用時間。例如,如果想限制使用「進程X」在一秒鐘內的CPU時間只有20%,就需要設置cpu.cfs_quota_us參數為20000,cpu.cfs_period_us則為100000,則周期為100毫秒。cpu.cfs_quota_us設置為20000意味著在一個周期內,「進程X」只能使用20%的CPU時間,即20000微秒。
內存子系統
內存控制子系統用於限制進程使用的內存。例如:
$ mkdir /sys/fs/cgroup/memory/example $ echo 10000000 > /sys/fs/cgroup/memory/example/memory.limit_in_bytes
此處,設置容器組的內存限制為10MB,使用 memory.limit_in_bytes 參數。 如果進程試圖超過限制,進程將無法通過內存操作系統(mmap),sbrk調用等向內存請求進行擴展。 此外,進程也無法fork(2)到內存資源超過指定限制的新進程。
IO子系統
使用IO子系統限制容器內進程的磁碟I/O是一個很好的想法,這樣可以確保傳入的請求不會對磁碟造成壓力過大。
$ mkdir /sys/fs/cgroup/blkio/test $ echo "8:0 1048576" > /sys/fs/cgroup/blkio/test/blkio.throttle.read_bps_device
此示例使用容器BPS方式限制磁碟讀取的最大值為1M位元組/秒,這可以通過塊設備映射到容器中。它通過在 “/sys/fs/cgroup/blkio/test/blkio.throttle.read_bps_device”文件中添加 「[MAJOR]:[MINOR] BPS」讀寫設備限制來實現。由於Linux內核是模塊化的,因此固定的塊設備可以通過命令「lsblk」工具查看。
五、Cgroups的優缺點
優點
Cgroups正確地實現以資源為中心的管理策略,使得使用多個用戶或應用程序在同一伺服器上的多個任務時的資源分配更加公平。此外,cgroups還能夠為每個任務分配獨立的虛擬資源。
缺點
由於最初設計時是為Linux內核2.6版本編寫的,隨著內核的版本更迭,cgroups的介面、使用方法和實現方式也發生了變化。同時使用多個cgroups也會增加管理員的額外負擔,同時由於其使用獨立的虛擬資源,如果不合理地使用可能造成浪費。
六、總結
Cgroups是linux內核中一個強大、高效和實用的工具,可以幫助管理員對系統資源進行有效的分配和限制。從Cgroups的一個簡單的例子中可以看出,它可以用於限制資源(例如CPU時間和內存)和I/O操作。它可以保證進程在運行時不會損害其他進程並導致系統崩潰。儘管Cgroups存在一些適用問題,但是它一個非常強大、穩定且高效的工具。
原創文章,作者:小藍,如若轉載,請註明出處:https://www.506064.com/zh-tw/n/277468.html