cgroup 简介

article/2025/10/14 11:10:41

cgroup 的功能在于将一台计算机上的资源(CPU,memory,network)进行分片,来防止进程间不利的资源抢占。

术语

cgroup:关联一组 task 和一组 subsystem 的配置参数。 一个 task 对应一个进程,cgroup 是资源分片的最小单位。
subsystem:资源管理器,一个 subsystem 对应一项资源的管理,如 cpu, cpuset,memroy 等。
hirearchy:关联一个到多个 subsystem 和一组属性结构的 cgroup 。和 cgroup 不同,hirearchy 包含的是可管理的 subsystem 而非具体参数。

由此可见,cgroup 对资源的管理是一个树形结构,类似进程。
相同点:分层结构,子进程 / cgroup 继承父进程 / cgroup。
不同点: 进程是一个单根树状结构(pid = 0 为根),而 cgroup 整体来看是一个多树的森林结构(hirearchy 为根)。

一个典型的 hirearchy 挂载目录如下:

/cgroup/
├── blkio                           <--------------- hierarchy/root cgroup                   
│   ├── blkio.io_merged             <--------------- subsystem parameter
... ...
│   ├── blkio.weight
│   ├── blkio.weight_device
│   ├── cgroup.event_control
│   ├── cgroup.procs
│   ├── lxc                         <--------------- cgroup
│   │   ├── blkio.io_merged         <--------------- subsystem parameter
│   │   ├── blkio.io_queued
... ... ...
│   │   └── tasks                   <--------------- task list
│   ├── notify_on_release
│   ├── release_agent
│   └── tasks
...

subsystem 列表:

blkio — 块存储配额 >> this subsystem sets limits on input/output access to and from block devices such as physical drives (disk, solid state, USB, etc.).

cpu — CPU时间分配限制 >> this subsystem uses the scheduler to provide cgroup tasks access to the CPU.

cpuacct — CPU资源报告 >> this subsystem generates automatic reports on CPU resources used by tasks in a cgroup.

cpuset — CPU绑定限制 >> this subsystem assigns individual CPUs (on a multicore system) and memory nodes to tasks in a cgroup.

devices — 设备权限限制 >> this subsystem allows or denies ac
cess to devices by tasks in a cgroup.

freezer — cgroup停止/恢复 >> this subsystem suspends or resumes tasks in a cgroup.

memory — 内存限制 >> this subsystem sets limits on memory use by tasks in a cgroup, and generates automatic reports on memory resources used by those tasks.

net_cls — 配合tc进行网络限制 >> this subsystem tags network packets with a class identifier (classid) that allows the Linux traffic controller (tc) to identify packets originating from a particular cgroup task.

net_prio — 网络设备优先级 >> this subsystem provides a way to dynamically set the priority of network traffic per network interface.

ns — 资源命名空间限制 >> the namespace subsystem.

cgroup 操作准则与方法

操作准则
1. 一个 hirearchy 可以由多个 subsystem。
eg.

mount -t cgroup -o cpu,cpuacct,memoy cpu_and_mem /cgroup/cpu_and_mem

这里写图片描述

  1. 一个已经挂载的 subsystem 只能被再次挂载在一个空的 hirearchy 上。(已经 mount 一个 subsystem 的 hirearchy 不能挂载在一个已经被其他 hirearchy 挂载的 subsystem)

这里写图片描述

  1. 每个 task 只能在同一个 hirearchy 的唯一一个 cgroup 里(不能再同一个个 hirearchy 下有超过一个 cgroup 的 tasks 里同时哟这个进程的 pid)

这里写图片描述

  1. 子进程在被 fork 出时自动继承父进程所在 cgroup,但是 fork 之后可以按需调整到其他 cgroup。

这里写图片描述

  1. 其他
    限制一个 task 的唯一方法就是将其加入到一个 cgroup 的 task 里。
    多个 subsystem 可以挂载到一个 hirearchy 里,然后通过不同的 cgroup 中的 subsystem 参数来对不同的 task 进行限额。
    如果一个 hirearchy 有太多 subsystem,可以考虑重构,将 subsystem 挂到独立的 hirearchy;相应的,可以将多个 hirearchy 合并成一个 hirearchy。
    因为可以之挂载少量 subsystem,可以实现只对 task 单个方面的限额;同时一个 task 可以被加到多个 hirearchy 中,从而实现对多个资源的控制。

操作方法

挂载 subsystem
利用 cgconfig 服务及其配置文件 /etc/config.conf- 服务启动时自动挂载

subsystem = /cgroup/hirearchy;

命令行操作

mount -t cgroup -o subsystem name /cgroup/name

取消挂载

umount /cgroup/name

eg
挂载 cpuset,cpu,cpuacct,memory 4 个 subsystem 到 /cgroup/cpu_and_mem 目录(hirearchy)

mount -t cgroup -o cpuset,cpu,cpuacct,memory cpu_and_mem cgroup/cpu_and_mem

or

mount {cpuset = /cgroup/cpu_and_mem;cpu = /cgroup/cpu;cpuacct = /cgroup/apu_and_mem;memory = /cgroup/cpu_and_mem;
}

新建 / 删除 cgroup
利用 cgroup 服务及其配置文件 /etc/cgconfig.conf- 服务启动时自动挂载

group <name> {[<permissions>] <controller> { <param name> = <param value>;...}...
}

命令行操作
新建1 cgcreate -t uid:gid -a uid:gid -g subsystem:path
新建2 mkdir /cgroup/hirearchy/name/child_name
删除1 cgdelete subsystems:path (使用 -r 递归删除)
删除2 rm -rf /cgroup/hirearchy/name/child_name (cgconfig server not running)

权限管理
利用 cgroup 服务及其配置文件 /etc/config.conf- 服务启动时自动挂载

perm {task {uid = <task user>;gid = <task group>;}admin {uid = <admin name>;gid = <admin group>;}
}

命令行操作 chown
eg

group daemons {cpuset {cpuset.mems = 0;cpuset.cpus = 0;}}group daemons/sql {perm {task {uid = root;gid = sqladmin;} admin {uid = root;gid = root;}}cpuset {cpuset.mems = 0;cpuset.cpus = 0;}}

or

mkdir -p /cgroup/red/daemons/sql
chown root:root /cgroup/red/daemons/sql/*
chown root:sqladmin /cgroup/red/daemons/sql/tasks
echo 0 > /cgroup/red/daemons/cpuset.mems
echo 0 > /cgroup/red/daemons/cpuset.cpus
echo 0 > /cgroup/red/daemons/sql/cpuset.mems
echo 0 > /cgroup/red/daemons/sql/cpuset.cpus

cgroup 参数设定

命令行1 cgset -r parameter=value path_to_cgroup
命令行2 cgset --copy-from path_to_source_cgroup path_to_target_cgroup
文件 echo value > path_to_cgroup/parameter

eg

cgset -r cpuset.cpus=0-1 group1
cgset --copy-from group1/ group2/
echo 0-1 > /cgroup/cpuset/group1/cpuset.cpus

添加 task

命令行添加进程 cgclassify -g subsystem:path_to_cgroup pidlist
文件添加进程 echo pid > path_tocgroup/tasks
在 cgroup 中启动进程 cgexec -g subsystem:path_to_cgroup command arguments
在 cgroup 中启动服务 echo 'CGROUP_DAEMON="subsystem:control_group"' >> /etc/sysconfig/<service>
利用 cgrulesengd 服务初始化,在配置文件 /etc/cgrules.conf 中

user<:command> subsystems control_group其中:
+用户user的所有进程的subsystems限制的group为control_group
+<:command>是可选项,表示对特定命令实行限制
+user可以用@group表示对特定的 usergroup 而非user
+可以用*表示全部
+%表示和前一行的该项相同

eg

  cgclassify -g cpu,memory:group1 1701 1138echo -e "1701\n1138" |tee -a /cgroup/cpu/group1/tasks /cgroup/memory/group1/taskscgexec -g cpu:group1 lynx http://www.redhat.comsh -c "echo \$$ > /cgroup/lab1/group1/tasks && lynx http://www.redhat.com"

subsystem 配置

blkio - BLOCK IO 限制

commonblkio.io_serviced - 报告CFQ scheduler统计的此cgroup对特定设备的IO操作(read, write, sync, or async)次数 - device_types:node_numbers operation numberblkio.io_service_bytes - 报告CFQ scheduler统计的此cgroup对特定设备的IO操作(read, write, sync, or async)数据量 - device_types:node_numbers operation bytesblkio.io_service_time - 报告CFQ scheduler统计的此cgroup对特定设备的IO操作(read, write, sync, or async)时间(单位ns) - device_types:node_numbers operation timeProportional weight division 策略 - 按比例分配block io资源blkio.weight - 100-1000的相对权重,会被blkio.weight_device的特定设备权重覆盖blkio.weight_device - 特定设备的权重 - device_types:node_numbers weightI/O throttling (Upper limit) 策略 - 设定IO操作上限每秒读/写数据上限 
blkio.throttle.read_bps_device - device_types:node_numbers bytes_per_second blkio.throttle.write_bps_device - device_types:node_numbers bytes_per_second每秒读/写操作次数上限 
blkio.throttle.read_iops_device - device_types:node_numbers operations_per_second blkio.throttle.write_iops_device - device_types:node_numbers operations_per_second每秒具体操作(read, write, sync, or async)的控制 blkio.throttle.io_serviced - device_types:node_numbers operation operations_per_second blkio.throttle.io_service_bytes - device_types:node_numbers operation bytes_per_second

cpu - CPU 使用时间限额

CFS(Completely Fair Scheduler)策略 - CPU最大资源限制cpu.cfs_period_us, cpu.cfs_quota_us - 必选 - 二者配合,前者规定时间周期(微秒)后者规定cgroup最多可使用时间(微秒),实现task对单个cpu的使用上限(cfs_quota_us是cfs_period_us的两倍即可限定在双核上完全使用)。cpu.stat - 记录cpu统计信息,包含 nr_periods(经历了几个cfs_period_us), nr_throttled (cgroup里的task被限制了几次), throttled_time (cgroup里的task被限制了多少纳秒)cpu.shares - 可选 - cpu轮转权重的相对值RT(Real-Time scheduler)策略 - CPU最小资源限制cpu.rt_period_us, cpu.rt_runtime_us
二者配合使用规定cgroup里的task每cpu.rt_period_us(微秒)必然会执行cpu.rt_runtime_us(微秒)

cpuacct - CPU 资源报告

cpuacct.usage - cgroup中所有task的cpu使用时长(纳秒)
cpuacct.stat - cgroup中所有task的用户态和内核态分别使用cpu的时长
cpuacct.usage_percpu - cgroup中所有task使用每个cpu的时长

memory - 内存限制

memory.usage_in_bytes - 报告内存限制byte
memory.memsw.usage_in_bytes - 报告cgroup中进程当前所用内存+swap空间
memory.max_usage_in_bytes - 报告cgoup中的最大内存使用
memory.memsw.max_usage_in_bytes - 报告最大使用到的内存+swap
memory.limit_in_bytes - cgroup - 最大内存限制,单位k,m,g. -1代表取消限制
memory.memsw.limit_in_bytes - 最大内存+swap限制,单位k,m,g. -1代表取消限制

以上就是 cgroup 的简单介绍。


http://chatgpt.dhexx.cn/article/npVAlhWi.shtml

相关文章

cgroup基础介绍

一项新概念的产生&#xff0c;必然有其原因&#xff0c;cgroup也不例外&#xff0c;最初由谷歌工程师Paul Menage和Rohit Seth提出【1】&#xff1a;因为计算机硬件能力越来越强大&#xff0c;为了提高机器的使用效率&#xff0c;可以在同一台机器上运行不同运算模型的工作。开…

深入浅出cgroup

一、什么是cgroup Cgroup是linux内核用来控制系统资源的机制&#xff0c;它将操作系统中的所有进程以组为单位划分&#xff0c;给这一组进程定义对某一类资源特定的访问权限。Cgroup用子系统&#xff08;subsystem&#xff09;来描述所能控制的系统资源&#xff0c;子系统具有多…

Cgroup概述

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

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

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

Cgroup简介-概述

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

J2EE技术架构

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

J2EE架构模型

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

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

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

J2EE的体系架构

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

J2EE体系架构

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

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

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

Spring 架构图

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

Scala安装教程

1.Scala官网滑到最下面如图&#xff1a; 选择Allversions 2.我们将下载2.12.16版本&#xff0c;如图下 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 的简写&#xff0c;是一门多范式的编程语言&#xff0c;Scala 语言可以运行在Window、Linux、Unix、 Mac OS X等系统上。 安装scala之前&#xff0c;需要在linux上安装jdk&#xff0c;如果没有安装jdk&#xff0c;可以参考这篇…

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

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

Scala语法教程

第一章 Scala入门 1.1概述 Scala是一门以Java虚拟机&#xff08;JVM&#xff09;为运行环境并将面向对象和函数式编程的最佳特性结合在一起的 静态类型编程语言&#xff08;静态语言需要提前编译的如&#xff1a;Java、c、c等&#xff0c;动态语言如&#xff1a;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文件&#xff0c;运行在Java虚拟机(JVM)上&#xff0c;可以调用Java类库。 官方网站&#xff1a;https://www.scala-lang.org/ 官方文档&#xff1a;https://docs.scala-lan…