cgroup是control group的简称,称为控制组,主要是为系统用户提供不同类型的资源分配和限制功能,是实现docker的基础。
cgroup主要的功能可以归纳如下:
1、资源限制:资源限制主要体现在进程运行过程中所需要的资源,例如cpu使用配额、内存大小、磁盘访问等
2、设置程序的优先级: 程序的执行优先级可以通过对cpu的使用以及I/O带宽的限制
3、系统资源使用统计:统计cpu运行时间,统计内存使用,统计程序wakeup次数等。
4、进程控制:对cpu进行带宽限制,可以控制进程的运行和挂起。
cgroup子系统目前有下列几种:
1. devices 进程范围设备权限
2. cpuset 分配进程可使用的 CPU数和内存节点
3. cpu 控制CPU占有率
4. cpuacct 统计CPU使用情况,例如运行时间,throttled时间
5. memory 限制内存的使用上限
6. freezer 暂停 Cgroup 中的进程
7. net_cls 配合 tc(traffic controller)限制网络带宽
8. net_prio 设置进程的网络流量优先级
9. huge_tlb 限制 HugeTLB 的使用
10. perf_event 允许 Perf 工具基于 Cgroup 分组做性能检测
在学习cgroup的时候,本人认为可以分为如下几个阶段:
1、学会使用它,知道怎么挂载、卸载,怎么创建子系统、怎么设置参数。
2、知道每个子系统参数设置的意义,并能熟练修改并且了解修改后发生的变化
3、分析cgroup框架,分析出cgroup之间错综复杂的调用流程,关键结构体之间是怎么联系起来的
4、结合源码分析各子系统各参数的设置的调用流程,并能说明其是怎么实现资源限制的。
5、熟悉cgroup v1和cgroup v2的区别,对比起优劣,并能对cgroup v2中好的方面进行借鉴和改造。
6、发现cgroup在使用中带来的问题,分析原因并优化之。