cgroup v2介紹及測試

介紹

cgroup是Linux內核允許將流程組織為分層的功能,然後可以限制其使用各種類型資源的組
並進行監控。內核的cgroup接口通過偽文件系統,稱為cgroupfs。分組在核心cgroup內核代碼,
而資源跟蹤和限制是在一組每個資源類型的子系統(內存,CPU,等等)。

術語

cgroup是綁定到一組的進程的集合。通過cgroup文件系統定義的限制或參數
子系統是一個內核組件,可修改cgroup中的進程,
已經實現了各種子系統,使諸如限制CPU 時間和可以使用的內存,
佔用CPU時間由cgroup使用,並凍結和恢復執行cgroup中的進程。
子系統有時也稱為資源控制者。
控制器的cgroup按層次結構排列。
通過創建,刪除和重命名cgroup 文件系統來定義層次結構
在每個級別的層次中,可以定義屬性(例如限制),
cgroup提供的限制,控制和計費通常在定義屬性的cgroup之下的整個子層次結構中有效。
因此,例如,子級cgroup不能超過層次結構中較高級別的cgroup上的限制

V1和V2歷史

cgroups實現的最初版本是在Linux中2.6.24。隨著時間的推移,
各種cgroup控制器已添加到允許管理各種類型的資源。
然而這些控制器的開發在很大程度上是不協調的,
結果是控制器和控制器之間出現了許多不一致之處
cgroup層次結構的管理變得相當複雜。
由於最初的cgroups實現存在問題(cgroups版本1)從Linux 3.10開始,開始了新的工作,
正交實施以解決這些問題。最初標記實驗性的,並且隱藏在-o DEVELsane_behavior掛載後面
選項,最終制作了新版本(cgroups版本2)正式發佈Linux 4.5。
儘管cgroups v2旨在替代cgroups v1,但是較舊的系統繼續存在(出於兼容性原因,
不太可能被刪除)。目前,cgroups v2僅實現 cgroups v1中可用的控制器子集。兩個系統
已實現,因此v1控制器和v2控制器都可以安裝在同一系統上。因此,例如,可以使用
在版本2下受支持的控制器,同時使用版本2尚不支持的版本1控制器這些控制器。唯一的限制是控制器


不能同時在cgroups v1層次結構和在cgroups v2層次結構中。

子系統

cgroup分為以下子系統:

  • cpu 子系統,主要限制進程的 cpu 使用率。
  • cpuacct 子系統,可以統計 cgroups 中的進程的 cpu 使用報告。
  • cpuset 子系統,可以為 cgroups 中的進程分配單獨的 cpu 節點或者內存節點。
  • memory 子系統,可以限制進程的 memory 使用量。
  • blkio 子系統,可以限制進程的塊設備 io。
  • devices 子系統,可以控制進程能夠訪問某些設備。
  • net_cls 子系統,可以標記 cgroups 中進程的網絡數據包,然後可以使用 tc 模塊(traffic control)對數據包進行控制。
  • net_prio — 這個子系統用來設計網絡流量的優先級
  • freezer 子系統,可以掛起或者恢復 cgroups 中的進程。
  • ns 子系統,可以使不同 cgroups 下面的進程使用不同的 namespace
  • hugetlb — 這個子系統主要針對於HugeTLB系統進行限制,這是一個大頁文件系統。
  • perf_event - 對cgroup中的進程組進行性能監控
  • net_prio - 對每個網絡接口指定優先級
  • pids - 限制在cgroup中創建的進程數量
  • rdma - cgroup中使用的rdma

實踐

升級內核

rpm --import https://www.elrepo.org/RPM-GPG-KEY-elrepo.org
rpm -Uvh http://www.elrepo.org/elrepo-release-7.0-2.el7.elrepo.noarch.rpm
yum --enablerepo=elrepo-kernel install kernel-ml kernel-ml-devel
grub2-set-default 0

修改內核參數禁用V1

/etc/default/grub
GRUB_CMDLINE_LINUX添加cgroup_no_v1=all
grub2-mkconfig -o /boot/grub2/grub.cfg

限制進程IO

mkdir /cgroup2
# 掛載cgroup
mount -t cgroup2 nodev /cgroup2

# 為子樹添加io子系統
echo "+io" > /cgroup2/cgroup.subtree_control
# 驗證是否開啟
cat /cgroup2/cg2/cgroup.controllers
# 查看 文件系統設備號
lsblk
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sr0 11:0 1 41M 0 rom
vda 253:0 0 50G 0 disk
└─vda1 253:1 0 50G 0 part /

# 限制設備IO

echo "253:0 wbps=1048576" > /cgroup2/cg2/io.max
# 測試 這裡要設置一個比較大的文件,不然看不出效果
dd if=/dev/zero of=/tmp/file1 bs=512M count=1

注意:上面步驟我們可以看到我們對設備進行了限制,cgroup本身無法對分區進行限制,
凡是我們可以通過lvm使用分區創建LV,從而對LV進行限制


分享到:


相關文章: