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系统进行限制,这是一个大页文件系统
相互关系每次在系统中创建新层级时,该系统中的所有任务都是那个层级的默认cgroup(root cgroup,此cgroup在创建层级时自动创建,后面在该层级中创建的cgroup都是此cgroup的后代)的初始成员。
一个子系统最多只能附加到一个层级
一个层级可以附加多个子系统
一个任务可以是多个cgroup的成员,但是这些cgroup必须在不同的层级
系统中的进程(任务)创建子进程(任务)时,该子任务自动成为其父进程所在cgroup的成员。然后可根据需要将该子任务移动到不同的cgroup中,但开始时它总是继承其父任务的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