cgroup是control group的缩写,字面意思是控制组,控制什么? 什么组? 操做系统是资源管家,为进程分配各类资源,这些资源有CPU, 内存,块设备等。如何为一组进程(一个进程是一组进程的特例)对资源的使用进行量化记帐和限制?cgroup就是解决这个问题的,提供一个统一的机制,各子系统根据这个机制实现自身控制策略。css
进程组是如何组织的? 答案:层级 (hierarchy)。进程按层级组织,各子系统(subsystem)按照自身资源分配策略在层级树上进行资源分配。打个比方,每一个人像是一个进程,有户口所在地如中国X省Y市,户籍就是进程组,有三个层级国省市,社会有各类资源好比教育子系统,假如我是Y市某个学校的学生,那么教育部门就会给这个学校分配老师和设施等资源。html
举个来自内核文档(Documentation/cgroup-v1/cgroups.txt)中的栗子。试想,一个大学的服务器有不一样用户:学生,教授和系统任务。那这个服务器的资源可能须要这样安排。CPU:linux
CPU : "Top cpuset" / \ CPUSet1 CPUSet2 | | (Professors) (Students) In addition (system tasks) are attached to topcpuset (so that they can run anywhere) with a limit of 20%
内存:算法
Memory : Professors (50%), Students (30%), system (20%)
磁盘:数组
Disk : Professors (50%), Students (30%), system (20%)
网络:浏览器
Network : WWW browsing (20%), Network File System (60%), others (20%) / \ Professors (15%) students (5%)
好比浏览器firefox走的WWW服务,管理员能够写脚本程序知道哪类用户教授仍是学生在使用firefox, 而后作以下控制:服务器
# echo browser_pid > /sys/fs/cgroup/<restype>/<userclass>/tasks
假如管理员体察民情,到了晚上,想给学生给多网络资源,好让学生能够玩网络游戏放松一下。管理能够在网络子系统里新建一个资源组,放宽流量限制,暂时把学生启动的进程放到新建的资源组里:网络
# echo pid > /sys/fs/cgroup/network/<new_class>/tasks (after some time) # echo pid > /sys/fs/cgroup/network/<orig_class>/tasks
这个文档有配图有文字讲的比较清楚:Relationships Between Subsystems, Hierarchies, Control Groups and Tasks。框架
/cpu_mem_cg | <-------------CPU +-----/cg1 | <-------------Memory +-----/cg2 |
虽然2015年Tejun重写了cgroup v2, 可是cgroup v1版的文档仍是有参考意义。主流发行版尚未用那么新的内核,应该还都在使用cgroup v1。这里简单摘录一下cgroup-v1文关于实现的文档。ide
cgroup在内核中是这样作的:
cgroup实现了相似procfs内存文件系统,即cgroup
文件系统。挂载时,默认状况下, cgroup文件系统会把全部子系统添加到层级中。用户能够经过挂载参数如mount -t cgroup -o cpu cgroup /sys/cgroup/cpu
来选择附加到层级中的子系统。
其实内核文档对实现讲的并不清楚,可参考这个博客Cgroup框架分析。
cgroups 子系统有多种, 如cpu, memory, 更全介绍参考Cgroup简介-概述。笔者暂时只对blkio子系统感兴趣。blkio资源控制模式有两种: weight 和 bandwidth limit, 即便权重,或带宽(iops)限制。权重的方式只有在IO调度器为cfq时才有用,可是目前blk-mq设备不支持任何调度器。
IO相关的还有cgroup writeback, 由于回写跟内存子系统和blkio子系统都有关系。值得一提的是该功能须要文件系统的支持,目前ext4和btrfs能够支持。
这部分后面须要研究下限流算法和代码。