Linux CGroup入門


Linux cgroup

Linux CGroup全稱Linux Control Group, 是Linux內核的一個功能,用來限制,控制與分離一個進程組群的資源(如CPU、內存、磁盤輸入輸出等)。Linux CGroupCgroup 可讓您為系統中所運行任務(進程)的用戶定義組群分配資源 — 比如 CPU 時間、系統內存、網絡帶寬或者這些資源的組合。您可以監控您配置的 cgroup,拒絕 cgroup 訪問某些資源,甚至在運行的系統中動態配置您的 cgroup。

主要功能

  • 限制資源使用:比如內存使用上限、文件系統的緩存限制
  • 優先級控制:CPU利用和磁盤IO
  • 掛起、恢復某些進程

相關概念

  • 任務:task,任務就是一個進程
  • 控制族群:control group,是一組按照某種標准划分的進程。cgroups中的資源控制都是以控制族群為單位實現。一個進程可以加入某個控制族群,也可以從一個進程組遷移到另一個控制族群。一個進程組的進程可以使用cgroups以控制族群為單位分配資源,同時受到cgroups以控制族群為單位設定的限制
  • 層級:hierarchy,控制族群可以組織成hierarchical的形式,即一棵控制族群樹。控制族群樹上的子節點控制族群是父節點控制族群的孩子,繼承父控制族群的特定的屬性
  • 子系統:subsystem,一個子系統就是一個資源控制器。子系統必須附加到一個層級上才能起作用,一個子系統附加到某個層級以后,這個層級上的所有控制族群都受到這個子系統的控制。

cgroup子系統

  • cpu子系統:限制進程的cpu使用率
  • cpuacct子系統:可以統計cgroup中的進程的cpu使用報告
  • cpuset子系統:可以限制進程的memory使用量
  • memory子系統:可以限制進程的塊設備IO
  • blkio子系統:可以控制進程能夠訪問某些設備
  • devices子系統:可以控制進程能夠訪問某些設備
  • net_cls子系統:可以標記cgroup中進程的網絡數據包,使用tc(traffic control)模塊對數據包進行控制
  • net_prio子系統:設計網絡流量的優先級
  • freezer子系統:掛起或恢復cgroup中的進程
  • ns子系統:使不同的cgroup下面的進程使用不同的namespace
  • hugetlb子系統:針對於HugeTLB系統進行限制,這是一個大頁文件系統

相互關系

  1. 每次在系統中創建新層級時,該系統中的所有任務都是那個層級的默認cgroup(root cgroup,此cgroup在創建層級時自動創建,后面在該層級中創建的cgroup都是此cgroup的后代)的初始成員。
  2. 一個子系統最多只能附加到一個層級
  3. 一個層級可以附加多個子系統
  4. 一個任務可以是多個cgroup的成員,但是這些cgroup必須在不同的層級
  5. 系統中的進程(任務)創建子進程(任務)時,該子任務自動成為其父進程所在cgroup的成員。然后可根據需要將該子任務移動到不同的cgroup中,但開始時它總是繼承其父任務的cgroup。

圖 1. CGroup 層級圖

如圖所示的 CGroup 層級關系顯示,CPU 和 Memory 兩個子系統有自己獨立的層級系統,而又通過 Task Group 取得關聯。

利用cgroup查看進程

cd /proc/XXXX(PID)
cat cgroup

如下圖所示:

jyroy@server3:~$ cd /proc/12055
jyroy@server3:/proc/12055$ cat cgroup
12:hugetlb:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
11:blkio:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
10:perf_event:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
9:rdma:/
8:devices:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
7:freezer:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
6:cpuset:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
5:memory:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
4:net_cls,net_prio:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
3:cpu,cpuacct:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
2:pids:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
1:name=systemd:/docker/c70bfdccf2cf8a5b9108a0d2ede079c7869e5e223ba410060a9064fc09d929a8
0::/system.slice/containerd.service

然后就可以利用docker容器的id查看docker的情況

jyroy@server3:/proc/12055$ docker ps -a | grep c70bfdc
c70bfdccf2cf     pytorch-orion-dev:cu10.0-torch1.5-py36      "bash"      4 days ago        Up 4 days        pytorch-dev-jyroy                                                     

參考文獻

CGroup介紹、應用實例及原理描述:https://www.ibm.com/developerworks/cn/linux/1506_cgroup/index.html

Linux cgroup總結:https://www.cnblogs.com/menkeyi/p/10941843.html


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM