Linux Cgroup v2 簡易實作 CPU 管理
前言
在目前環境中很常使用到的 容器化 主要就是透過 Linux kernel 的資源隔離來做到的
因此要弄懂容器怎麼做到資源管理,就必須要理解 Cgroup (control group) Linux namespace, overlay2 等等的
那這一篇會聚焦在運算資源 (CPU) 上面做一個很簡單的實作
Cgroup v2 (control group)
CGroup 所管理的對象是 process (PID) 。用來限制、隔離資源使用,分配資源
其中可分配的資源包含:CPU 的時間,記憶體,網路裝置等等,可以在系統上輸入指令cat /sys/fs/cgroup/cgroup.controllers
會出現 cpuset cpu io memory hugetlb pids rdma misc 等等的
本篇會聚焦於 cpuset cpu 這兩項
之前第一次用的時候使用 ubuntu 20.04,預設還是使用 Cgroup v1,不過在 ubuntu 22.04 (kernel 5.15) 下已經改成預設使用 v2 了
環境描述
- 在 Win10 使用
VMware Workstation 16 Player開啟虛擬機- 虛擬機規格不拘,但我的環境是使用 2 CPU 來測試
- 虛擬機 OS:
ubuntu 22.04 - kernel 版本:
5.15.0-39-generic
測試檔案
測試的方式是透過 yes 這隻程式會不斷產生資料的特性,再使用 timeout 來控制時間,透過比對產生的資料量來比較說是否有限制成功 process 存取 CPU 的時間
測試一共會進行兩次,第一次是無限制的情況,第二次則是加上 Cgroup 來控制
這邊先附上程式,說明完之後再來看執行結果
1 |
|
說明
一開始可以先使用 mount | grep cgroup 來檢查 Cgroup 在系統上的掛載點,以及是否使用 v2 版本

在 /sys/fs/cgroup 這個目錄下有很多檔案,而如果在該目錄新增新的目錄的話,會發現裡面自動多了很多檔案,我們就是透過這些檔案來使用 Cgroup
要注意這個目錄預設是由 root 所擁有,因此要修改的話就一般使用者必須使用 sudo

這裡面的檔案會根據 cgroup.controllers, cgroup.subtree_control 這兩個檔案做變動,先對這兩個檔案做一個簡單的解釋:
cgroup.controllers裡面會記錄說目前設定要管理的資源- 有
cpuset cpu io memory pids等等,
- 有
cgroup.subtree_control設定子目錄實際上管理什麼資源- 為
cgroup.controllers的子集 echo '+pids -memory' > x/y/cgroup.subtree_control這個是 man page 裡面的範例,這個檔案會去檢查字串然後調整要加入的內容 (也就是加入用 + 扣除用 -)
- 為
我們先把我們需要管理的 cpu cpuset 加進根目錄的檔案 /sys/fs/cgroup/cgroup.subtree_control
1
2echo "+cpu +cpuset" | sudo tee /sys/fs/cgroup/cgroup.subtree_control
cat /sys/fs/cgroup/cgroup.subtree_control # 看一下有沒有加成功
接下來需要一個子目錄用來測試用,在我的例子裡是取名叫做 low ,並且對其中的三個檔案增加內容
cpuset.cpus:指定要使用哪一顆 CPU (從0開始算)- 以我的環境有雙核,該檔案預設為
0-1,若要指定使用第一顆核心就改成0
- 以我的環境有雙核,該檔案預設為
cpu.max:使用兩個參數來控制 CPU 的占比- 預設為
max 100000而我設定20000 100000代表最多只能使用到 20% 的時間
- 預設為
cgroup.procs: 放入要控制的 PID, 在程式碼中使用$$來帶入- 會將該 PID 底下的所有 sub-process 自動加入
1 | sudo mkdir /sys/fs/cgroup/low |
執行結果
1 | ./cpuset.sh |

產生的資料量沒有那麼精確的是 1/5 (20%),但是可以看出 CPU 有受到限制,並且也會隨著占比的值有所區隔
而如果想要確定是不是真的 20% ,可以手動的執行一個 yes 指令,然後把他的 PID 丟進去再使用 top 觀察,就可以看到 20% 了
1 | # 執行兩個,把其中一個的 PID 記下來丟進去 |

後記
這篇的內容主要算是複習用,東西很簡單很單純,不過不常使用的話還是很容易忘記
做一點簡單的例子來讓自己加深印象~
參考資料
cgroups(7) - Linux manual page (man7.org)
详解Cgroup V2 | Zorro’s Linux Book (zorrozou.github.io)
Redhat 文件
Linux Cgroup v2 簡易實作 CPU 管理
https://raylin9981.github.io/2022/07/03/Linux-Cgroup-V2-簡易實作/