linux 的 cgroups 詳解
引子
-
利用 linux namespace 隔離資源;
-
利用 cgroups 限制資源的使用;
-
利用 chroot 改變進程的根目錄到指定的目錄;
[root@dev215 ~]# cat /etc/redhat-release
CentOS Linux release 7.6.1810 (Core)
基本概念
-
限制資源使用,各種子系統的資源限制;
-
優先級控制,cpu 使用、內存、磁盤 io 吞吐等;
-
資源使用報告,可以用來計費;
-
控制,掛起、恢復進程;
子系統
我們看下都有哪些子系統。
[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)
-
systemd 是維護的自己使用子系統;
-
net_cls,net_prio :可以標記 cgroups 中進程的網絡數據包,然後可以使用 tc 模塊(traffic control)對數據包進行控制;
-
pids:可以限制 cgroup 的進程數,裏面有各種策略;
-
cpuset:如果爲多核 cpu,可以爲 cgroups 中的任務分配單獨的 cpu 和內存;
-
memory :設置每個 cgroup 的內存限制以及產生內存資源報告
-
hugetlb:這個子系統主要針對於 HugeTLB 系統進行限制,這是一個大頁文件系統;
-
perf_event:增加了對每 group 的監測跟蹤的能力,即可以監測屬於某個特定的 group 的所有線程以及運行在特定 CPU 上的線程,此功能對於監測整個 group 非常有用
-
blkio:可以限制進程的塊設備(磁盤、usb)的輸入 / 輸出存取限制;
-
devices:可以控制進程能夠訪問某些設備
-
cpu:主要限制進程的 cpu 使用率
-
cpuacct:可以統計 cgroups 中的進程使用 cpu 的資源報告
-
freezer:可以掛起或者恢復 cgroups 中的進程
cgroup 形態
-
hierarchy: cgroups 從用戶態看,提供了一種組 cgroup 類型的文件系統(Filesystem), 這是一組虛擬的文件系統,通過對這個文件系統的配置,告訴內核,如何希望對哪些進程使用多少資源。文件系統本身是層級的,所以構成了 hierarchy。
-
task:進程在 cgroups 中稱爲 task,taskid 就是 pid;
-
subsystem:cgroup 支持的所有可配置的資源稱爲子系統,如:cpu、內存、網絡等都是子系統;
-
libcgroup: 一個開源的軟件,提供一組 cgroups 的應用程序和庫;
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% 了。
此處有兩個參數:
-
cpu.cfs_quota_us 默認值 - 1,此值越高 cpu 使用率越高
-
cpu.cfs_period_us 默認值 100000,表示 cpu 的時間片分爲 100000 份,此值越低 cpu 使用越高
容器技術就是通過這一系列的子系統來限制資源的使用。
參考:
https://www.cnblogs.com/menkeyi/p/10941843.html
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/l94R4-QvUcHDguslGhM7Eg