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详解

目录
相关文章
|
Linux 调度 Docker
cgroup技术概述
【9月更文挑战第19天】cgroup(control group)是Linux内核的一种资源控制系统,通过不同的子系统来控制进程对资源的使用,如CPU使用率、内存限制等。它通过一个专门的文件系统进行操作,可实现资源分配与限制,并支持Docker等容器技术的资源管理。
|
7月前
|
负载均衡 算法 应用服务中间件
Nginx长连接负载均衡详细说明以及案例
本文详细介绍了Nginx长连接负载均衡的配置与原理。长连接(Keepalive)允许客户端和服务器保持连接,减少建立和关闭连接的开销。Nginx支持多种负载均衡算法,如轮询、IP哈希等。通过在Nginx配置文件中使用`upstream`模块和`keepalive`指令,可以实现长连接负载均衡,从而提高系统的性能和响应速度。示例配置展示了如何设置后端服务器组、长连接数及HTTP/1.1协议,确保连接复用,降低延迟。
428 5
|
机器学习/深度学习 Serverless 计算机视觉
【YOLOv8改进 - 注意力机制】Sea_Attention: Squeeze-enhanced Axial Attention,结合全局语义提取和局部细节增强
【YOLOv8改进 - 注意力机制】Sea_Attention: Squeeze-enhanced Axial Attention,结合全局语义提取和局部细节增强
|
缓存 算法 Java
Linux内核新特性年终大盘点-安卓杀后台现象减少的背后功臣MGLRU算法简介
MGLRU是一种新型内存管理算法,它的出现是为了弥补传统LRU(Least Recently Used)和LFU(Least Frequently Used)算法在缓存替换选择上的不足,LRU和LFU的共同缺点就是在做内存页面替换时,只考虑内存页面在最近一段时间内被访问的次数和最后一次的访问时间,但是一个页面的最近访问次数少或者最近一次的访问时间较早,可能仅仅是因为这个内存页面新近才被创建,属于刚刚完成初始化的年代代页面,它的频繁访问往往会出现在初始化之后的一段时间里,那么这时候就把这种年轻代的页面迁移出去
|
11月前
|
存储 监控 安全
Linux内核调优的艺术:从基础到高级###
本文深入探讨了Linux操作系统的心脏——内核的调优方法。文章首先概述了Linux内核的基本结构与工作原理,随后详细阐述了内核调优的重要性及基本原则。通过具体的参数调整示例(如sysctl、/proc/sys目录中的设置),文章展示了如何根据实际应用场景优化系统性能,包括提升CPU利用率、内存管理效率以及I/O性能等关键方面。最后,介绍了一些高级工具和技术,如perf、eBPF和SystemTap,用于更深层次的性能分析和问题定位。本文旨在为系统管理员和高级用户提供实用的内核调优策略,以最大化Linux系统的效率和稳定性。 ###
|
存储 网络协议 容灾
降低存储网络55% 延迟!阿里云存储论文入选计算机顶会
凭借在规模化部署和应用模型上的创新,阿里云存储团队发表的技术论文《Deploying User-space TCP at Cloud Scale with LUNA》被 USENIX ATC'23 收录。
1547 4
降低存储网络55% 延迟!阿里云存储论文入选计算机顶会
|
云安全 存储 人工智能
云启智能新纪元,2024可信云大会亮点抢先看!
2024年可信云大会将于7月23-24日在京举行,聚焦云计算与人工智能融合,探讨智算服务与大模型云服务。
514 0
|
网络协议 算法 网络性能优化
|
开发工具 git
Git 中 merge 和 rebase 的区别
$ git pull --rebase和$ git pull区别 是git fetch + git merge FETCH_HEAD的缩写,所以默认情况下,git pull就是先fetch,然后执行merge操作,如果加-rebase参数,就是使用git rebase代替git merge 。
29579 0