深入浅出cgroup

article/2025/10/14 11:04:35

一、什么是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 内核黑科技 | 技术文章 | 精选教程


http://chatgpt.dhexx.cn/article/3iofndaR.shtml

相关文章

Cgroup概述

一、Cgroup的目的 Cgroup和namespa类似,也是将进程进程分组,但是目的与namespace不一样,namespace是为了隔离进程组之前的资源,而Cgroup是为了对一组进程进行统一的资源监控和限制。 二、为什么需要Cgroup 在Linux里&#xf…

Cgroup是什么(相关概念、功能、作用、特点、怎么用)

文章目录 Cgroup 什么是CgroupCgroup的相关概念相互关系Cgroup的功能Cgroup的作用Cgroup的层级图及特点Cgroup怎么用 什么是Cgroup cgroups,其名称源自控制组群(control groups)的简写,是Linux内核的一个功能,用来限…

Cgroup简介-概述

Cgroup(Control Groups)是这样一种机制:它以分组的形式对进程使用系统资源的行为进行管理和控制。也就是说,用户通过cgroup对所有进程进行分组,再对该分组整体进行资源的分配和控制。 1 Cgroup的结构 cgroup中的每个分…

J2EE技术架构

一、简介 J2EE(Java 2 Platform, Enterprise Edition)是一个为大企业主机级的计算类型而设计的Java平台。Sun微系统(与其工业伙伴一起,例如IBM)设计了J2EE,以此来简化在受客户级环境下的应用开发。由于创造…

J2EE架构模型

从开始学Java Web到现在,使用的J2EE架构一步一步的在改变,从最简单的到越来越复杂,刚开始都是完全就照着每个架构的形式去开发项目,很少自己会想为什么用这样的架构好?好在哪里?现在学了这么久,…

java开发系统架构_Java开发:ECP系统J2EE架构开发平台

一 体系结构 ECP平台是一个基于J2EE架构设计的大型分布式企业协同管理平台,通过采用成熟的J2EE的多层企业架构体系,充分保证了系统的健壮性、开放性和扩展性。可选择部署于多种系统环境,满足不同类型、不同规模企业的需要。企业可以根据自己的…

J2EE的体系架构

转载自:http://zengbo0710.iteye.com/blog/79490 J2EE 即Java2平台企业版,它提供了基于组件的方式来设计、开发、组装和部署企业应用。J2EE使用多层分布式的应用模型,这个多层通常通过三层或四层来实现: 1、客户层&…

J2EE体系架构

J2EE是Java2平台企业版(Java 2 Platform,Enterprise Edition),它的核心是一组技术规范与指南,提供基于组件的方式来设计、开发、组装和部署企业应用。J2EE使用多层分布式的应用模型。 J2EE分层 客户层,执行在客户计算…

基于J2EE架构的在线考试系统-Java(报告+源码+PPT

目前国内基于B/S、C/S结构的在线考试系统产品已经有许多,本文首先介绍了这些考试系统的形成和发展过程,大致结构。然后通过仔细分析,提出了目前的这些系统还存有系统更新和维护等种种弊端,仍不够成熟。基于对现有产品的思考,结合J…

Spring 架构图

http://it.100xuexi.com/view/otdetail/20130426/38b9d40a-138b-4b24-963c-ac029b034fe7.html 1.Spring 架构图 Spring 是一个开源 框架,是为了解决企业应用程序开发复杂性而创建的。框架的主要优势之一就是其分层架构,分层架构允许您选择使用哪一个组件…

Scala安装教程

1.Scala官网滑到最下面如图: 选择Allversions 2.我们将下载2.12.16版本,如图下 3.选scala-2.12.16.zip安装 4.先将scala-2.12.16zip解压为文件夹我解压到了D盘的scalal文件夹下面 D:\scalal\scala-2.12.16

linux上安装scala教程

Scala教程 一、介绍 cala 是 Scalable Language 的简写,是一门多范式的编程语言,Scala 语言可以运行在Window、Linux、Unix、 Mac OS X等系统上。 安装scala之前,需要在linux上安装jdk,如果没有安装jdk,可以参考这篇…

Scala教程之:可变和不变集合

文章目录 mutable HashMapimmutable HashMap 集合在程序中是非常有用的,只有用好集合才能真正感受到该语言的魅力。在scala中集合主要在三个包里面:scala.collection, scala.collection.immutable和scala.collection.mutable。 scala中引入不…

Scala语法教程

第一章 Scala入门 1.1概述 Scala是一门以Java虚拟机(JVM)为运行环境并将面向对象和函数式编程的最佳特性结合在一起的 静态类型编程语言(静态语言需要提前编译的如:Java、c、c等,动态语言如:js&#xff0…

Scala入门教程

教程目录 0x00 教程内容0x01 Scala 理论1. Scala 基本概念2. Scala 交互式命令行 0x03 Scala 基本语法1. 基础语法2. 标识符3. 注释4. 数据类型5. 常量和变量6. 基本函数7. 局部应用8. 柯里化函数9. 可变长度参数10. 类11. 构造函数12. 继承13. 重载方法14. 抽象类15. 特质16. …

Scala基础教程

简介 Scala是一种结合了面向对象和函数式编程的、静态类型的高级编程语言。 Scala代码被编译成.class文件,运行在Java虚拟机(JVM)上,可以调用Java类库。 官方网站:https://www.scala-lang.org/ 官方文档:https://docs.scala-lan…

scala php,Scala 教程

Scala 教程 Scala 是一门多范式(multi-paradigm)的编程语言,设计初衷是要集成面向对象编程和函数式编程的各种特性。 Scala 运行在Java虚拟机上,并兼容现有的Java程序。 Scala 源代码被编译成Java字节码,所以它可以运行于JVM之上,…

Scala详细教程

Scala详细教程 目录 Scala详细教程 1.Scala 介绍 1.1 什么是 Scala Scala 1.2 为什么要学 Scala 2.开发环境准备 2.1 ScalaSDK 安装 2.1.1Window 下安装 ScalaSDK 2.1.2Linux 下安装 ScalaSDK 2.2 IDEA 安装 2.3 IDEAScala 插件的离线安装 2.4 IDEA 创建 HelloScala…