Cgroups
Linux的命名空间(namespace)为docker提供了网络、进程、文件等隔离的功能,但是namespace并不能给docker提供物理资源的隔离,例如CPU、内存等。如果对这些物理资源不尽兴隔离的话,那么就会出现多个容器抢占资源的现象,而Cgroups就是为了解决这一问题,全称为Control groups,涵盖的范围包括但不限于CPU、内存、磁盘、I/O和网络带宽。
Cgroups是Linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制,可以实现资源更精细化的控制。
一、Cgroups组件
1、Cgroups子系统
Cgroup为每一个可以控制的硬件资源定义了一个子系统,可以通过
lssubsys -m
查看ubuntu安装方式:apt-get -y install cgroup-tools
➜ 桌面 lssubsys -m
cpuset /sys/fs/cgroup/cpuset
cpu,cpuacct /sys/fs/cgroup/cpu,cpuacct
blkio /sys/fs/cgroup/blkio
memory /sys/fs/cgroup/memory
devices /sys/fs/cgroup/devices
freezer /sys/fs/cgroup/freezer
net_cls,net_prio /sys/fs/cgroup/net_cls,net_prio
perf_event /sys/fs/cgroup/perf_event
hugetlb /sys/fs/cgroup/hugetlb
pids /sys/fs/cgroup/pids
rdma /sys/fs/cgroup/rdma#高版本新增
misc /sys/fs/cgroup/misc#(高版本新增)
具体介绍:
- cpu:限制进程的cpu使用率
- cpuacct:统计Cgroups中进程的cpu使用报告
- cpuset:为Cgroups中的进程分配单独的cpu节点或内存节点
- blkio:限制进程的输入/输出,比如磁盘、硬盘、USB等
- memory:限制进程内存使用量,并生成资源使用报告
- devices:限制进程访问设备
- freezer:挂起或恢复cgroups中的进程
- net_cls:标记cgroups中进行的网络数据包,使用Linux流量控制器(traffuc control)识别特定cgroups任务的数据包
- net_prio:动态设置每个网络接口的网络流量优先级
- hugetlb:限制Cgroups中HugeTLB(页面错误),并在页面错误期间强制执行限制。
- pids:限制Cgroups中线程和进程的数量
每一个子系统都需要与内核中的其他模块进行配合来完成对资源的限制。比如说对cpu的限制需要通过内核进程调度来配合cpu子系统来完成的;对网络数据包的控制需要Traffic Control子系统来配合完成。
2、Cgroup
Cgroup表示的是按照某种资源控制标准划分而成的任务组(进程组),可以附加一个或多个子系统。Cgroups中的资源控制是以Cgroup为单位实现的。通过Cgroup可以将一组进程和一组子系统关联起来
3、hierarchy 结构层次
hierarchy是由多个Cgroup以一个树状结构排列而成。每个hierarchy可以绑定一个或多个子系统。在一颗树里面会包含linux所有的进程,树的每个节点是一个Cgroup(或者说是进程组),会根据具体资源分配需求会将所有进程分成多个Cgroup,但需要注意的是,在同一个树种,一个进程只能属于一个Cgroup。在linux系统上,最多创建树(hierarchy)的数量等于子系统的种类数量,每个树上附加一个子系统;也可以只有一个树,把子系统都附加上去。也就是说每个子系统只能附加到一个树上。如下所示
3、一个hierarchy可以附加多个subsystem
4、一个进程可以作为多个cgroup的成员,但是这些cgroup必须在不同的hierarchy下
image-20220324113907823
5、一个进程fork出子进程时,子进程和父进程是在同一个cgroup中的,根据需要也可以移动到其他的cgroup中
参考
https://www.ichenfu.com/2017/04/25/cgroups-pids-controller/
https://man7.org/linux/man-pages/man8/tc.8.html
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/6/html/resource_management_guide/ch01
https://blog.csdn.net/qq_46595591/article/details/107634756
https://access.redhat.com/documentation/zh-cn/red_hat_enterprise_linux/6/html/resource_management_guide/sec-relationships_between_subsystems_hierarchies_control_groups_and_tasks
https://tech.meituan.com/2015/03/31/cgroups.html