一、什么是cgroup

Cgroup是linux内核用来控制系统资源的机制,它将操作系统中的所有进程以组为单位划分,给这一组进程定义对某一类资源特定的访问权限。Cgroup用子系统(subsystem)来描述所能控制的系统资源,子系统具有多种类型,每个类型的子系统都代表一种系统资源,比如freezer、CPU、memory、IO等。以freezer子系统为例,这个子系统可以对一组线程批量冻结,使用下面命令将打开freezer子系统:mount cgroup none /dev/freezer freezer

该命令将子系统挂载于/dev/freezer目录,接下来可以在/dev/freezer目录下创建若干个目录,例如目录top、background,每个目录代表一组线程的资源分配行为,以cgroup实例描述,那么多级的目录以cgroup实例的形式组成了一个树形结构。接下来,可以给top组或者background组配置组内进程,

echo 1199 > /dev/freezer/top/cgroup.procs

当前cgroup版本已经不支持同一进程组内不同线程分属于子系统内不同cgroup。配置完top组内的线程后,可以通过操作freezer.state节点配置组内所有线程冻结:

echo FROZEN > /dev/freezer/top/freezer.state

解冻组内所有线程:

echo THAW > /dev/freezer/top/freezer.state

二、关键数据结构以及相互关系

Cgroup子系统以cgroup_subsys结构体描述,子系统中每个目录由cgroup结构体描述,这个目录维护了一组线程的资源访问属性。子系统的cgroup_subsys结构体通过cgroup_root结构体与子系统根目录的cgroup建立联系。目录之间的树形结构通过cgroup结构体中的cgroup_subsys_state结构体描述,cgroup_subsys_state结构体中有指向父目录的parent 指针、以及兄弟和孩子链表。如图:

由于线程与cgroup目录具有多对多的关系,即一个cgroup目录中含有多个线程,一个线程属于不同子系统中的多个cgroup。linux通过css_set结构体以及cgrp_cset_link结构体来描述这个多对多的关系。css_set结构代表一组线程,这些线程在各个子系统内属于同一cgroup目录;cgrp_cset_link代表一个css_set和一个cgroup的映射关系,cgroup有一个cgrp_cset_link链表,通过这个链表可以找到这个 cgroup目录下所有线程组成的css_set,同样,css_set也维护一个cgrp_cset_link链表,通过这个链表,可以找到这个css_set在各个子系统中所归属的cgroup。如下图css_set Z下的所有线程属于freezer子系统的cgroupA以及memory子系统的cgroupC, css_set X下的所有线程属于freezer子系统的cgroupA:

三、cgroup核心逻辑

当某个子系统被挂载使能后,系统中所有线程默认处于子系统根目录所代表的cgroup实例中。

1. 配置task到目标cgroup

用户或者应用程序通过往cgroup.procs节点写入pid,cgroup.procs节点的write函数对应到cgroup_procs_write。

cgroup_kn_lock_live函数根据当前节点目录解析到该目录所对应的cgroup实体,通过写权限检查以后,进入到主逻辑cgroup_attach_task函数里。

cgroup_migrate_prepare_dst函数保存当前task所在css_set结构,

cgroup_migrate_prepare_dst函数利用保存的当前css_set,查找是否存在满足条件的目标css_set,如果不存在满足条件的目标css_set,则创建一个新的css_set,插入多对多二维关系链表中。接下来cgroup_migrate函数将task从源css_set迁移到目标css_set中。

2. 操控cgroup属性

以freezer子系统为例,通过freezer.state节点控制cgroup组的冻结与解冻,这个节点对应到freezer_write函数,实际的逻辑在freezer_change_state函数中。

freezer_change_state函数第一个参数属于freezer结构体,它通过内嵌的cgroup_subsys_state结构与cgroup关联,也就是说每个freezer结构体直接对应到freezer子系统的一个目录。接下来看函数逻辑,css_for_each_descendant_pre循环体里对当前目录以及每个子孙目录所代表cgroup实体执行freezer_apply_state函数。freezer_apply_state函数通过调用freeze_cgroup和unfreeze_cgroup函数实际操作cgroup内每个task的冻结与解冻。

四、小结

cgroup除了实现了freezer子系统,还实现了控制组IO调度的blkio cgroup、控制cpu核资源组分配的cpuset cgroup、控制cpu运行时间组分配的cpu cgroup、控制memory组分配的momory cgroup以及控制网络带宽组分配的cls_net cgroup,相关代码读者可自行研究。

参考资料:

1.https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/kernel/cgroup/cgroup.c?h=v5.4.143

2.https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/kernel/cgroup/legacy_freezer.c?h=v5.4.143

3.https://git.kernel.org/pub/scm/linux/kernel/git/stable/linux.git/tree/kernel/cgroup/freezer.c?h=v5.4.143

长按关注

内核工匠微信

Linux 内核黑科技 | 技术文章 | 精选教程

深入浅出cgroup相关推荐

  1. 深入浅出Docker(一):Docker核心技术预览

    [编者按]Docker是PaaS供应商dotCloud开源的一个基于LXC 的高级容器引擎,源代码托管在 GitHub 上, 基于Go语言开发并遵从Apache 2.0协议开源.Docker提供了一种 ...

  2. Kubernetes入门——深入浅出讲Docker

    作者简介: 李子昂 百度基础架构部研发工程师 负责百度分布式Redis平台的研发和运维 专注于基础架构中间件的研发和优化 本文基于『云原生基础知识概述及实践』系列视频课程--『Kubernetes入门 ...

  3. 《深入浅出DPDK》读书笔记(四):并行计算-SIMD是Single-Instruction Multiple-Data(单指令多数据)

    本文内容为读书笔记,摘自<深入浅出DPDK>. 47.提高处理器主频率对于性能的提升作用是明显而直接的.但一味地提高频率很快会触及频率墙,因为处理器的功耗正比于主频的三次方. 48.提高并 ...

  4. 深入浅出Docker(五):基于Fig搭建开发环境

    本文原创版权归 infoq 肖德时 所有,此处为技术收藏,如有再转,请于篇头保留原创作者及出处,以示尊重! 作者: 肖德时 原文: http://www.infoq.com/cn/articles/d ...

  5. 深入浅出Docker(二):Docker命令行探秘

    本文原创版权归 infoq 肖德时 所有,此处为技术收藏,如有再转,请于篇头保留原创作者及出处,以示尊重! 作者: 肖德时 原文: http://www.infoq.com/cn/articles/d ...

  6. 《深入浅出Docker》学习笔记

    <深入浅出Docker>学习笔记 第三章:docker 安装 linux服务器安装:-略 windows服务器安装:-略 确认安装结果 docker --version 第四章:纵观DOc ...

  7. Python --深入浅出Apriori关联分析算法(二) Apriori关联规则实战

    上一篇我们讲了关联分析的几个概念,支持度,置信度,提升度.以及如何利用Apriori算法高效地根据物品的支持度找出所有物品的频繁项集. Python --深入浅出Apriori关联分析算法(一) 这次 ...

  8. MSDN Webcast“深入浅出ASP.NET AJAX系列”

    课程: ASP.NET AJAX深入浅出系列课程(1):ASP.NET AJAX 概述(3月13日):对于ASP.NET AJAX的大致功能进行概述和演示,通过简单的演示让听众了解到ASP.NET A ...

  9. 5.3Role和Claims授权「深入浅出ASP.NET Core系列」

    5.3Role和Claims授权「深入浅出ASP.NET Core系列」 原文:5.3Role和Claims授权「深入浅出ASP.NET Core系列」 希望给你3-5分钟的碎片化学习,可能是坐地铁. ...

最新文章

  1. 修改git的远程仓库命令
  2. 中国计算机学会CCF推荐国际学术会议和期刊目录-计算机科学理论
  3. 提升网络可靠性的双网卡绑定7种模式
  4. HDU4539+状态压缩DP
  5. Android之给控件添加水纹波效果
  6. 搭建一个简单的Spring boot+maven项目
  7. AndroidStudio_百度人脸识别离线SDK_代码分析_使用流程_随时更新---Android原生开发工作笔记217
  8. C++查看数据存储大小端模式
  9. 打印十字图-蓝桥杯历届试题
  10. disable menu item
  11. JavaScript高级程序设计(第三版)阅读笔记
  12. python怎么判断质数和合数_用java如何写代码去判断质数和合数
  13. 魔兽、星际和红警的比较
  14. AMR文件格式的解释
  15. 表情识别 [传统方法 VS 深度学习方法]
  16. 使用百度在某个网站内进行搜索
  17. 重置 winsocks
  18. DOS命令dir是否能查看隐藏文件夹
  19. python爬取大众点评数据_python爬虫实例详细介绍之爬取大众点评的数据
  20. ERP的五大核心思想

热门文章

  1. Django实现迷你淘宝(四) --- 基于Bootstrap的商品页面设计与美化
  2. 2020年最新SCI期刊影响因子以及JCR分区表
  3. 青锋开源架构-springboot2.6.x+vue3-antdesign-vite之搭建IDEA+Maven+JDK+Mysql开发环境
  4. 阅读Improving Convolutional Networks with Self-Calibrated Convolutions
  5. 一个故事看懂机械硬盘原理
  6. 【Unity学习】完全基于Ultimate Replay 2.0的UI回放系统
  7. php正则表达式参考规则
  8. java收藏功能思路,互联网产品中的“收藏”功能思路
  9. 基于java的网上人才招聘系统
  10. 《诸神之眼:Nmap网络安全审计技术揭秘》读书笔记