linux 的 cgroups 詳解

引子

[root@dev215 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)

基本概念

子系統

我們看下都有哪些子系統。

[root@dev215 ~]# mount -t cgroup
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,net_prio,net_cls)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,pids)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuset)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,memory)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,hugetlb)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,perf_event)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,blkio)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,devices)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,cpuacct,cpu)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,seclabel,freezer)

cgroup 形態

cgroups 層級結構(Hierarchy)

內核使用 cgroup 結構體來表示一個 control group 對某一個或者某幾個 cgroups 子系統的資源限制。cgroup 結構體可以組織成一顆樹的形式,每一棵 cgroup 結構體組成的樹稱之爲一個 cgroups 層級結構。

cgroups 層級結構可以 attach 一個或者幾個 cgroups 子系統,當前層級結構可以對其 attach 的 cgroups 子系統進行資源的限制。每一個 cgroups 子系統只能被 attach 到一個 cpu 層級結構中。

好好理解下這個圖即可: 

創建了 cgroups 層級結構中的節點(cgroup 結構體)之後,可以把進程加入到某一個節點的控制任務列表中,一個節點的控制列表中的所有進程都會受到當前節點的資源限制。同時某一個進程也可以被加入到不同的 cgroups 層級結構的節點中,因爲不同的 cgroups 層級結構可以負責不同的系統資源。所以說進程和 cgroup 結構體是一個多對多的關係。 

上面這個圖從整體結構上描述了進程與 cgroups 之間的關係。最下面的 P 代表一個進程。每一個進程的描述符中有一個指針指向了一個輔助數據結構 css_set(cgroups subsystem set)。指向某一個 css_set 的進程會被加入到當前 css_set 的進程鏈表中。一個進程只能隸屬於一個 css_set,一個 css_set 可以包含多個進程,隸屬於同一 css_set 的進程受到同一個 css_set 所關聯的資源限制。

上圖中的”M×N Linkage” 說明的是 css_set 通過輔助數據結構可以與 cgroups 節點進行多對多的關聯。但是 cgroups 的實現不允許 css_set 同時關聯同一個 cgroups 層級結構下多個節點。這是因爲 cgroups 對同一種資源不允許有多個限制配置。

一個 css_set 關聯多個 cgroups 層級結構的節點時,表明需要對當前 css_set 下的進程進行多種資源的控制。而一個 cgroups 節點關聯多個 css_set 時,表明多個 css_set 下的進程列表受到同一份資源的相同限制。

我們來實際操作下:

# 進入cpu的文件系統
[root@dev215 ]# cd /sys/fs/cgroup/cpu
#掛載cpu子系統test
[root@dev215 cpu]# mkdir test
# 操作系統自動生成了對應子系統對應的資源限制文件
[root@dev215 test]# ls
cgroup.clone_children  cgroup.procs  cpuacct.usage         cpu.cfs_period_us  cpu.rt_period_us   cpu.shares  notify_on_release
cgroup.event_control   cpuacct.stat  cpuacct.usage_percpu  cpu.cfs_quota_us   cpu.rt_runtime_us  cpu.stat    tasks
#我們寫一個死循環來測試下
[root@dev215 cpu]# while : ; do : ; done &
[1] 21699  #死循環的進程號

我們可以看到 21699 把進程打滿了

之前我們創建的 cpu 子系統,沒有說明對哪些資源做怎麼樣的限制,我們操作下

# 配置test對子進程21699起作用
[root@dev215 cpu]# echo 21699 > test/tasks 
# cpu.cfs_quota_us 默認是-1 表示不限制,最大值100000,寫50000表示50%
[root@dev215 cpu]# echo 50000 > test/cpu.cfs_quota_us

我們再 top 看下

cpu 已經限制在了 50% 了。

此處有兩個參數:

容器技術就是通過這一系列的子系統來限制資源的使用。

參考:

https://www.cnblogs.com/menkeyi/p/10941843.html

本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源https://mp.weixin.qq.com/s/l94R4-QvUcHDguslGhM7Eg