Cgroup基础概念

简介: ## What is Cgroup? Cgroups 是 control groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。最初由 google 的工程师提出,后来被整合进 Linux 内核。Cgroups 也是 LXC 为实现虚拟化所使用的资源管理手段,可以说没有 cgro

What is Cgroup?

Cgroups 是 control groups 的缩写,是 Linux 内核提供的一种可以限制、记录、隔离进程组(process groups)所使用的物理资源(如:cpu,memory,IO等等)的机制。最初由 google 的工程师提出,后来被整合进 Linux 内核。Cgroups 也是 LXC 为实现虚拟化所使用的资源管理手段,可以说没有 cgroups 就没有 LXC。

摘自Linux Cgroups详解(王喆锋)

What Cgroup can do?

1.限制进程组可以使用的资源数量,限制进程最大使用的内存等
2.进程组的优先级控制,比如为某个进程组分配特定的cpu share
3.记录进程组使用的资源数量,比如记录某个进程CPU的使用时间
4.进程组隔离,比如通过namespace以达到隔离的目的
5.进程组控制,比如可以将进程组挂起或恢复

整理自linux Cgroup详解(王喆锋)

Cgroup Model

进程模型

在说Cgroup的模型之前,先回顾下进程模型,在linux系统上,所有的进程都有一个共同的父进程,叫做init进程,这个进程在内核启动的时候开始执行,然后通过init进程启动其他的进程,这些进程都是init的子进程。因为所有的进程都有一个共同的父进程。那么linux的进程模型就是一个单继承层次的模型,或者称之为树状模型。除此之外每一个linux进程但是除了init进程,都继承了一些环境变量(例如PATH环境变量)

Cgroup Model

Cgroup其实和进程类似:Cgroup也是继承体系,并且子cgroup继承其父cgroup的某些属性,两者最基本的差别在于,进程是单继承体系。而Cgroup可以存在多个不同的继承体系.(意思就是可以有多个单继承体系,每个单继承体系互不影响)

Some concepts of Cgroup

在Cgroup中有这样四个概念,可以说理解了这四个概念,那么对于如何使用cgroup,将会是如鱼得水。

  • Subsystems: 称之为子系统,一个子系统就是一个资源控制器,比如 cpu子系统就是控制cpu时间分配的一个控制器。
  • Hierarchies: 可以称之为层次体系也可以称之为继承体系,指的是Control Groups是按照层次体系的关系进行组织的。
  • Control Groups: 一组按照某种标准划分的进程。进程可以从一个Control Groups迁移到另外一个Control Groups中,同时Control Groups中的进程也会受到这个组的资源限制。
  • Tasks: 在cgroups中,Tasks就是系统的一个进程。

Subsystems

在Red_Hat_Enterprise_Linux-6系列的linux中,默认提供了如下子系统。

  • blkio这个子系统为块设备设定输入/输出限制,比如物理设备(磁盘,固态硬盘,USB 等等) 。
  • cpu这个子系统使用调度程序提供对 CPU 的 cgroup 任务访问。
  • cpuacct这个子系统自动生成 cgroup 中任务所使用的 CPU 报告。
  • cpuset这个子系统为 cgroup 中的任务分配独立 CPU(在多核系统)和内存节点。
  • devices这个子系统可允许或者拒绝 cgroup 中的任务访问设备。
  • freezer这个子系统挂起或者恢复 cgroup 中的任务。
  • memory这个子系统设定 cgroup 中任务使用的内存限制,并自动生成由那些任务使用的内存资源报告。
  • net_cls这个子系统使用等级识别符(classid)标记网络数据包,可允许 Linux 流量控制程序(tc)识别从具体 cgroup 中生成的数据包。
  • ns名称空间子系统。

Relationships Between Subsystems, Hierarchies, Control Groups and Tasks

这个部分恐怕是这篇文章的重点了吧,这个部分我主要参考红帽的关于资源管理的手册在这个部分通过引入4条规则,来帮助我们更好的去理解这个四者的关系。

  • 规则1,一个单继承体系(单层次体系)可以附加1个或者多个子系统
    screenshot

在上面的这个图中,Cpu和Memory两个子系统附加到了cpu_mem_cg的这个继承体系中cg1和cg2是两个Control Groups,但是需要注意的是,如果此前有Cpu或者Memory子系统附加到其它继承体系中的,那么Cpu或者Memory就不能再次附加到cpu_mem_cg这个继承体系中了。

  • 规则2,一个子系统,不能被附加到多个继承体系中。
    screenshot

其实这条规则我已经在规则1中简单的进行了阐述,上面的这副图中,可以看书CPU已经被附加到左侧的cpu_cg这个继承体系中了,当cpu要再次被附加到cpu_mem_cg的时候,会发生附加失败。

  • 规则3,每当在系统中创建一个继承体系的时候,会默认再创建一个control groups,并且这个control groups被称之为root cgroup,此时整个系统中的tasks(进程)都属于这个root cgroup。系统中的进程,在一个继承体系中都明确的属于一个control groups,并且这个进程可以从一个control groups移动到另外一个control groups中,但是需要主要的是,在一个继承体系中
    一个进程是没办法同时属于两个control groups的,但是一个进程可以同时属于两个不同的继承体系中的control groups。

screenshot
在上面的这副图中可以看出httpd这个进程无法同时属于A继承体系中的cg1和cg2这两个control groups,但是httpd进程却可以同时属于A继承体系中的cg1和B继承体系中的cg3。

  • 规则4,系统上的任何task(进程)通过fork创建子task(进程)的时候,这个子task(进程),自动继承其父task(进程)的control groups,成为这个control groups的一员。此后这个子task(进程)可以移动到其他control groups中,父task(进程)和子task(进程)完全独立。
    screenshot

在上面的这副图中,可以看出httpd进程fork出来的子进程仍然是属于cg1这个control group的。

Reference

本文主要参考红帽关于资源管理的红皮书。和王喆锋的Linux Cgroups详解
Red_Hat_Enterprise_Linux-6-Resource_Management_Guide-en-US
Linux Cgroups详解

目录
相关文章
|
2天前
|
Linux 调度 Docker
cgroup技术概述
【9月更文挑战第19天】cgroup(control group)是Linux内核的一种资源控制系统,通过不同的子系统来控制进程对资源的使用,如CPU使用率、内存限制等。它通过一个专门的文件系统进行操作,可实现资源分配与限制,并支持Docker等容器技术的资源管理。
|
19天前
|
Ubuntu
systemd挂载cgroup文件系统流程简要分析
systemd挂载cgroup文件系统流程简要分析
|
2月前
|
监控 安全 Linux
systemd-cgls:Linux中的Cgroup层级结构查看利器
`systemd-cgls`是Linux工具,用于查看Cgroup层级结构,协助管理员管理资源。它以树形结构显示cgroup及其资源使用,用于监控、性能调优和安全隔离。通过`--no-page`, `--all`, `--full`等参数可定制输出。结合`systemd-cgtop`等工具,定期监控和配置资源限制,实现系统优化。
|
4月前
|
消息中间件 Linux
Linux进程间通信(IPC)教程 Linux共享内存介绍:介绍POSIX共享内存的基本概念、用途和编程实践
Linux进程间通信(IPC)教程 Linux共享内存介绍:介绍POSIX共享内存的基本概念、用途和编程实践
102 2
|
10月前
|
消息中间件 Linux 调度
【Linux】进程间通信的有关基础概念
【Linux】进程间通信的有关基础概念
|
Linux API C语言
cgroup V1和V2的原理和区别
cgroup V1和V2的原理和区别
|
存储 Linux 文件存储
【Linux】文件系统的基本概念
【Linux】文件系统的基本概念
【Linux】文件系统的基本概念
|
存储 Kubernetes 应用服务中间件
k8s之Pod基础概念 (下)
Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行的StatefulSet和Deployment等控制器对象,用于暴露Pod应用的Service和Ingress对象,为Pod提供存储的PersistentVolume存储资源对象等
k8s之Pod基础概念 (下)
|
存储 Kubernetes 网络协议
k8s之Pod基础概念 (上)
Pod是kubernetes中最小的资源管理组件,Pod也是最小化运行容器化应用的资源对象。一个Pod代表着集群中运行的一个进程。kubernetes中其他大多数组件都是围绕着Pod来进行支撑和扩展Pod功能的,例如,用于管理Pod运行的StatefulSet和Deployment等控制器对象,用于暴露Pod应用的Service和Ingress对象,为Pod提供存储的PersistentVolume存储资源对象等
k8s之Pod基础概念 (上)
|
运维 小程序 Linux
systemd攻略之三:如何利用systemd控制cgroup,实战
经过最近研究,发现对systemd如何利用cgroup的实例少之又少,而且,很多人搞不清,在el7上,如果想使用cgroup到底怎么使用?到底该如何systemd为一个进程或者服务利用cgroup?
4530 1
systemd攻略之三:如何利用systemd控制cgroup,实战