【Docker 内核详解】cgroups 资源限制(二):组织结构与基本规则、子系统简介

news2024/11/26 10:41:04

cgroups 资源限制(二):组织结构与基本规则、子系统简介

  • 1.组织结构与基本规则
  • 2.子系统简介

1.组织结构与基本规则

在之前的博客已经介绍过,传统的 Unix 任务管理,实际上是先启动 init 任务作为根节点,再由 init 节点创建子任务作为子节点,而每个子节点又可以创建新的子节点,如此往复,形成一个树状结构。而系统中的多个 cgroup 也构成类似的树状结构,子节点从父节点继承属性。

它们最大的不同在于,系统中的多个 cgroup 构成的层级并非单根结构,可以允许存在多个。如果任务模型是由 init 作为根节点构成的一棵树,那么系统中的多个 cgroup 则是由多个层级构成的森林。这样做的目的很好理解,如果只有一个层级,那么所有的任务都将被迫绑定其上的所有子系统,这会给某些任务造成不必要的限制。在 Docker 中,每个子系统独自构成一个层级,这样做非常易于管理。

了解了 cgroups 的组织结构,再来了解 cgroups、任务、子系统、层级四者间的关系及其基本规则。

规则 1:同一个层级可以附加一个或多个子系统。如下图所示,CPU 和 Memory 的子系统附加到了一个层级。

在这里插入图片描述

规则 2:一个子系统可以附加到多个层级,当且仅当目标层级只有唯一一个子系统时。下图中小圈中的数字表示子系统附加的时间顺序,CPU 子系统附加到层级 A 的同时不能再附加到层级 B,因为层级 B 已经附加了内存子系统。如果层级 B 没有附加过内存子系统,那么 CPU 子系统同时附加到两个层级是允许的。
在这里插入图片描述
规则 3:系统每次新建一个层级时,该系统上的所有任务默认加入这个新建层级的初始化 cgroup,这个 cgroup 也被称为 root cgroup。对于创建的每个层级,任务只能存在于其中一个 cgroup 中,即一个任务不能存在于同一个层级的不同 cgroup 中,但一个任务可以存在于不同层级中的多个 cgroup 中。如果操作时把一个任务添加到同一个层级中的另一个 cgroup 中,则会将它从第一个 cgroup 中移除。在下图中可以看到,httpd 任务已经加入到层级 A 中的 /cg1,而不能加入同一个层级中的 /cg2,但是可以加入层级 B 中的 /cg3

在这里插入图片描述
规则 4:任务在 fork/clone 自身时创建的子任务默认与原任务在同一个 cgroup 中,但是子任务允许被移动到不同的 cgroup 中。即 fork/clone 完成后,父子任务间在 cgroup 方面是互不影响的。下图中小圈中的数字表示任务出现的时间顺序,当 httpdfork 出另一个 httpd 时,两者在同一个层级中的同一个 cgroup 中。但是随后如果 ID 为 4840httpd 需要移动到其他 cgroup 也是可以的,因为父子任务间已经独立。总结起来就是:初始化时子任务与父任务在同一个 cgroup,但是这种关系随后可以改变。

在这里插入图片描述

2.子系统简介

子系统实际上就是 cgroups 的资源控制系统,每种子系统独立地控制一种资源,目前 Docker 使用如下 9 种子系统,其中,net_cls 子系统在内核中已经广泛实现,但是 Docker 尚未采用,Docker 在网络方面的控制方式将在后续详细介绍,以下是它们的用途。

  • blkio:可以为块设备设定输入 / 输出限制,比如物理驱动设备(包括磁盘、固态硬盘、USB 等)。
  • cpu:使用调度程序控制任务对 CPU 的使用。
  • cpuacct:自动生成 cgroup 中任务对 CPU 资源使用情况的报告。
  • cpuset:可以为 cgroup 中的任务分配独立的 CPU(此处针对多处理器系统)和内存。
  • devices:可以开启或关闭 cgroup 中任务对设备的访问。
  • freezer:可以挂起或恢复 cgroup 中的任务。
  • memory:可以设定 cgroup 中任务对内存使用量的限定,并且自动生成这些任务对内存资源使用情况的报告。
  • perf _event:使用后使 cgroup 中的任务可以进行统一的性能测试。
  • net_cls:Docker 没有直接使用它,它通过使用等级识别符(classid)标记网络数据包,从而允许 Linux 流量控制程序(Traffic ControllerTC)识别从具体 cgroup 中生成的数据包。

上述子系统如何使用虽然很重要,但是 Docker 并没有对 cgroup 本身做增强,容器用户一般也不需要直接操作 cgroup,所以这里我们只大致说明一下操作流程,让大家有一个感性的认识。

Linux 中 cgroup 的实现形式表现为一个文件系统,因此需要 mount 这个文件系统才能够使用(也有可能已经 mount 好了),挂载成功后,就能看到各类子系统。

在这里插入图片描述

cpu 子系统为例,先看一下挂载了这个子系统的控制组下的文件。

在这里插入图片描述

/sys/fs/cgroupcpu 子目录下创建控制组,控制组目录创建成后,它下面就会有很多类似的文件了。

在这里插入图片描述

下面的例子展示了如何限制 PID 为 18828 的进程的 cpu 使用配额:

在这里插入图片描述

>>> 其实都属于输出重定向,都可以输出内容到指定文件。

  • > 会覆盖目标的原有内容,当文件存在时,会先删除原文件,再重新创建文件,然后把内容写入该文件(即清空了原文件),否则直接创建文件。
  • >> 会在目标原有内容后追加内容,当文件存在时直接在文件末尾进行内容追加,不会删除原文件,否则直接创建文件。

在 Docker 的实现中,Docker daemon 会在单独挂载了每一个子系统的控制组目录(比如 /sys/fs/cgroup/cpu)下创建一个名为 docker 的控制组,然后在 docker 控制组里面,再为每个容器创建一个以容器 ID 为名称的容器控制组,这个容器里的所有进程的进程号都会写到该控制组 tasks 中,并且在控制文件(比如 cpu.cfs_quota_us)中写入预设的限制参数值。综上,docker 组的层级结构如下。

在这里插入图片描述
在这里插入图片描述
关于 Docker 如何实现 cgroup 的配置的问题,将会在后续有关 libcontainer 的博客里解释。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1146912.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java项目之宠物医院信息管理系统(ssm框架)

项目简介 宠物医院信息管理系统实现了以下功能: 管理员:个人中心、用户管理、医生管理、医学知识管理、科室信息管理、医生信息管理、预约挂号管理、医嘱信息管理、药品信息管理、订单信息管理、留言板管理、系统管理。用户:个人中心、预约…

MC红石粉、红石火把、中继器学习笔记

红石粉 按右键可以改变它的形态红石线的强度会从15递减至0。红石线可以往上爬一格,但是不能爬2格以上的。 红石线在非实体方块只能往上爬而不能往下爬 做一个可控制的轨道运输 玩生存的我一直想做一个可控制的铁轨,遇到的一个问题就是,矿…

ROS笔记之visualization_msgs-Marker的mesh_resource导入外部模型学习

ROS笔记之visualization_msgs-Marker的mesh_resource学习 code review! 文章目录 ROS笔记之visualization_msgs-Marker的mesh_resource学习1.运行2.文件结构3.main.cc 参考博文 1.kitti之ros可视化_学习笔记–第4课:车子模型的添加 2.rviz进行kitti数据集可视化时…

SAP从入门到放弃系列之QM动态修改(Dynamic Modification)

目录 一、 概念二、系统操作 一、 概念 结合样本确定,动态修改也发挥着重要作用。根据先前检验的结果,动态修改会自动减少或增加 样本的大小。设置一定的规则,可以减少或增加检验中涉及的工作,也可节约检验成本。但是注意这种情况…

UE VaRest 从本地读取写入JSON(蓝图)

写入简单JSON到本地项目目录 写入位置:项目根目录 文件名:writjson.Json 写入内容:{“ke1”:“key1value”,“ke2”:“ke2value”} 从本地项目目录加载json 加载位置:项目根目录 文件名:writjson.Json 加载内容&…

Photoshop(PS)安装教程(2023最新最详细图文教程)

目录 一.简介 二.安装步骤 软件:PS版本:2023语言:简体中文大小:3.20G系统要求:Win10(1903)及以上版本,64位操作系统硬件要求:CPU2.0GHz 内存8G(或更高,不支持…

第 369 场 LeetCode 周赛题解

A 找出数组中的 K-or 值 模拟 class Solution { public:int findKOr(vector<int> &nums, int k) {vector<int> cnt(32);for (auto x: nums)for (int i 0; i < 32; i)if (x >> i & 1)cnt[i];int res 0;for (int i 0; i < 32; i)if (cnt[i] &…

Elasticsearch:标量量化 101 - scalar quantization 101

作者&#xff1a;BENJAMIN TRENT 什么是标量量化以及它是如何工作的&#xff1f; 大多数嵌入模型输出 float32 向量值。 虽然这提供了最高的保真度&#xff0c;但考虑到向量中实际重要的信息&#xff0c;这是浪费的。 在给定的数据集中&#xff0c;嵌入永远不需要每个单独维度…

微信公众号集成文心一言API

要将微信公众号集成文心一言API&#xff0c;并使用Python语言和Flask技术实现&#xff0c;可以按照以下步骤进行操作&#xff1a; 安装必要的依赖项&#xff1a;首先&#xff0c;确保你的开发环境中已安装了Python和Flask库。你可以使用pip命令来安装它们&#xff0c;例如&…

区块链技术与应用 【全国职业院校技能大赛国赛题目解析】第六套区块链系统部署与运维

第六套区块链系统部署与运维题目 环境 : ubuntu20 fisco : 2.8.0 子任务1-2-1: 搭建区块链系统并验证 题意: P2P起始端口 30500 channel起始端口 20500 JSONRPC 8945 使用Docker配置 使用 build_chain.sh 文件 进行生成节点文件 root@192-168-19-133:/yijiu/mode6# bas…

MySQL数据库#4

外键(表与表之间的关系) 什么是外键&#xff1a; 外键是指关系数据库中一个表中的字段&#xff0c;它与另一个表的主键相关联&#xff0c;用于建立两个表之间的关联关系。外键可以用来确保数据的完整性&#xff0c;通过检查关联表的主键来限制对于某个表的操作。当对主表进行操…

批量去除pdf每一页相同未知的同样的内容

例如我想去除每一页右下角的www.alevelcollege.com ①打开acrobat pro ②编辑文件和图像 ③ctrlF输入字符串www.alevelcollege.com替换为空 ④鼠标点击替换 ⑤回车键按下不放&#xff0c;会自动翻页&#xff0c;直到翻页到最后一页。

Spring Cloud Alibaba 教程 | Nacos 篇

Spring Cloud Alibaba 教程 | Nacos 篇 ​ 写在前面的话&#xff1a; 本笔记在参考网上视频以及博客的基础上&#xff0c;只做个人学习笔记&#xff0c;如有侵权&#xff0c;请联系删除&#xff0c;谢谢&#xff01; 1、使用nacos做服务的注册和发现 1、父工程项目pom <!…

三十九、【进阶】MySQL索引失效情况1

1、在索引列上进行运算操作 &#xff08;1&#xff09;基础表格 phone字段&#xff0c;存在一个单列索引。 &#xff08;2&#xff09;在索引列上进行运算操作 可以看到&#xff0c;在对phone字段进行运算操作之后&#xff0c;查询方式会变为“全表扫描”&#xff0c;导致索引…

【JAVA学习笔记】 51 - 日期类

项目代码 一、第一代日期类 1.Date: 精确到亳秒&#xff0c;代表特定的瞬间 2.SimpleDateFormat:格式和解析日期的类 3.SimpleDateFormat格式化和解析日期的具体类。它允许进行格式化(日期> 文本)、解析(文本->日期)和规范化 public class Date01 {public static voi…

C# Socket通信从入门到精通(5)——单个同步TCP服务器C#代码实现

前言: 我们在开发TCP通信程序时,除了开发TCP客户端程序,有时候我们也需要开发TCP服务器程序,这在实际项目中是经常会遇到的,所以说掌握TCP服务器程序的开发是一项必备的技能,尤其在上位机软件开发领域,掌握TCP服务器程序的开发是走向高级工程师的必经之路,也是面试必考…

山西电力市场日前价格预测【2023-10-30】

日前价格预测 预测说明&#xff1a; 如上图所示&#xff0c;预测明日&#xff08;2023-10-30&#xff09;山西电力市场全天平均日前电价为309.35元/MWh。其中&#xff0c;最高日前电价为400.33元/MWh&#xff0c;预计出现在18:15。最低日前电价为0.00元/MWh&#xff0c;预计出…

Qt实现卡牌对对碰游戏

效果 闲来无事&#xff0c;实现一个对对碰游戏&#xff0c;卡牌样式是火影动漫。 先上效果&#xff1a; 卡牌对对碰_火影主题 玩法 启动游戏&#xff0c;进入第一关卡&#xff0c;所有卡牌都为未翻开状态&#xff0c;即背面朝上&#xff1b;点击卡牌&#xff0c;则将卡牌翻开…

06、SpringCloud -- 订单详情界面实现

目录 订单详情界面实现需求:代码前端后端controllerservicemapperdomain效果:订单详情界面实现 需求: 现在的订单详情界面是这样的。需要获取订单的数据对这个详情页面进行渲染 代码 前端 后端 controller

C语言基础简述(一)

目录 1. 标准输入输出库 2. 定义变量 3. 关于基本数据类型 3.1 计算机如何存储数据 3.2 基本数据类型 3.2.1 数值类型 3.2.1.1 整数类型 3.2.1.2 浮点数类型 3.2.2 字符类型 3.2.2.1 ASCII表 4. 进制数之间的转换 4.1 十进制整数和二进制之间的相互转换 5. C语言运…