1. cgroup 简介
cgroups 是Linux内核提供的一种可以限制单个进程或者多个进程所使用资源的机制,可以对 cpu,内存等资源实现精细化的控制,开发者可以通过cgroups 提供的精细化控制能力,限制某一个或者某一组进程的资源使用,比如在一个既部署了前端 web 服务,也部署了后端计算模块的八核服务器上,可以使用 cgroups 限制 web server 仅可以使用其中的六个核,把剩下的两个核留给后端计算模块。 cgroup是linux内核资源虚拟化的技术基石,LXC(linux Containers)和docker 容器所用到的资源隔离技术就是cgroup。
2. cgroup 使用
linux cgroup其实就是linux通过虚拟文件系统(VFS)通过文件的方式将cgroups的功能和配置暴露给用户,并将具体的实现细节隐藏起来,给用户态提供一个统一的文件系统API接口。在我的ubuntu系统中,在sys/fs 目录下有一个cgroup的目录, 这个目录下有很多的文件目录,例如cpu、memory等等,这些都是cgroup的子系统,每个系统用于不同的资源限制和管理。创建分组cgroup可以直接在cgroup下的CPU目录下创建自己的cgroup,mkdir test_g1创建目录就可以了,删除目录同样使用 rm -rf test_g1就可以了,其中的 cgroup.procs 中的就是该 cgroup 下的进程列表。
3. cgroup 实验
下面将分别进行几组室验对比一下分组的功能和室验结果。
3.1 cpu限制测试
首先启动一个终端执行程序: ./fake_make -j2, 在没有任何限制的情况下,CPU使用到100%(双核200%)
然后将刚启动的进程3616 加入到刚创建的cgroup test_g1 下。sudo sh -c "echo 3616 > cgroup.procs"
复制
然后通过如下命令,设置test_g1组的CPU占比为20%。
sudo sh -c "echo 20000 > cpu.cfs_quota_us"
复制
当设置了test_g1组的CPU占比为20%,实验结果如下:

同样的,当设置了test_g1组的CPU占比为150%,实验结果如下:
设置CPU占比
| 20%
| 80%
| 100%
| 150%
| 200%
| 250%
|
测试结果
| 20%
| 80%
| 100%
| 150%
| 200%
| 200%
|
结论:普通进程,加入到了cgroup中,则cpu使用率会按照分配的比例进行,但是不能超过CPU最大使用率(单核100%,双核200%)。
3.2 实验2
启动2个终端任务,其中一个加入cgroup,另一个不加入cgroup。同样分别修改cpu.cfs_quota_us值为20000,80000,100000,150000, 设置test_g1组的cpu占比为20%,结果如下:
设置test_g1组的CPU占比为200%,实验结果如下:

其他实验结果如下表:
cpu占比设置
| 20%
| 80%
| 100% | 150% | 200%
| 250%
|
加入cgroup
| 20%
| 66%
| 66%
| 65% | 66% | 66% |
没有加入cgroup
| 180%
| 133%
| 133% | 133% | 133% | 133% |
结论:普通进程是两个线程,但是加入到cgroup的是fakemake进程虽然也是两个线程,但是是一个调度单元,相当于一个调度单元和两个普通线程竞争所以这个普通进程占用的其实是2/3的CPU。
3.3 实验3
启动两个终端,都加入到同一个cgroup中,然后修改cpu的占比为20%,结果如下:

其他实验结果如下:
cpu占比设置
| 20%
| 80%
| 100% | 150% | 200%
| 250%
|
进程3616 | 10%
| 40%
| 50% | 75% | 100% | 100% |
进程3800 | 10%
| 40% | 50% | 75% | 100% | 100% |
结论:当两个进程加入了同一个组内,则会在组内按比例分配CPU使用,由于终端1和终端2进程分别都是2个线程,因此cpu都是均分的,但是组的总占比不超过设置的值或最大CPU占比。
3.4 实验4
分别创建两个组test_g1和test_g2,然后启动终端1进程并加入到test_g1组中,启动终端2进程加入到test_g2中。并启动一个单独的进程,不加入任何组。
设置test_g1和test_g2组的CPU占比为20%时候,则这两个组的任务cpu占比分别为20%,未加入组的进程占比为160%,结果如下:
设置test_g1和test_g2组的CPU占比为200%时候,结果如下:
结论:组1和组2可以看作一个进程竞争,没有加入组的则为2个普通线程。因此,没有加入组的进程占比占1/2,test_g1组和test_g2组分别占1/4CPU。设置test_g1和test_g2占比低于50%比例时候,比如20%,则分别占比20%。当设置组1和组2的cpu占比超过50%时,则组1和组2的cpu占比最多为50%。
4、总结
当进程加入到cgroup组中,则可以看成1个普通线程进行竞争,其cpu占比不超过设置值或cpu最大占比。组内的进程在此基础上进行分配CPU资源。