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

(。・∀・)ノ干杯
原文地址:https://www.cnblogs.com/jyroy/p/14361035.html