首页 > 其他分享 >玩转 Cgroup 系列之三:挑战手动管理 Cgroup

玩转 Cgroup 系列之三:挑战手动管理 Cgroup

时间:2023-11-14 18:32:07浏览次数:41  
标签:10 Sep -- 之三 玩转 Cgroup root cpu

在前面的文章中,作者讨论了 Cgroup 和 CPUShare 如何用于系统管理和性能调优。

在这一篇文章中,作者将重点介绍 Cgroup 的手动管理任务。虽然手动管理 Cgroup 不是一件容易的事,但了解其中的过程可以帮助我们更好地认识 Cgroup 和资源管理(点击参考原文)。

挑战手动管理 Cgroup

来看看如何在没有相关工具支持的情况下创建 Cgroup。

本质上, Cgroup 只是一个挂载有 cgroups 的目录结构,可以位于文件系统的任何位置。在默认情况下,我们可以在 /sys/fs/cgroup 中找到系统创建的 Cgroup。而如果想手动创建 Cgroup 该怎么做呢?首先,需要创建一个顶级目录:

# mkdir -p /my_cgroups

创建后,需要决定使用哪些控制器。注意,Cgroup v1 版本的结构大致如下:

/my_cgroups
├── <controller type>
│   ├── <group 1>
│   ├── <group 2>
│   ├── <group 3>

要创建的所有组都单独嵌套在每个控制器下。因此,控制器 memory 下的 group1 与控制器 blkio 下的 group1 是完全独立的。在这个基础上,我们创建一个基本的 CPUShares 示例。 简单起见,我先在系统上生成一些负载:

# cat /dev/urandom

这一步会在系统中产生一些人为负载,以便进行简单测算。它不是一个真实的负载示例,但是突出了 CPUShares 的主要特点。我还设置了一台运行 CentOS 8 的虚拟机,只有一个 vCPU,以便进行非常简单的数学计算。做好这些准备之后,第一步就是为我们的 Cgroup 控制器创建一些目录:

# mkdir -p /my_cgroups/{memory,cpusets,cpu}

接下来,将 Cgroup 挂载到这些文件夹中:

# mount -t cgroup -o memory none /my_cgroups/memory
# mount -t cgroup -o cpu,cpuacct none /my_cgroups/cpu
# mount -t cgroup -o cpuset none /my_cgroups/cpusets

如果想创建自己的 Cgroup,只需在您想要使用的控制器下创建一个新的目录就可以了。在这个例子中,我处理的是位于 cpu 目录中的文件 cpu.shares。下面我们在 cpu 控制器下创建一些 Cgroup:

# mkdir -p /my_cgroups/cpu/{user1,user2,user3}

请注意,这些目录是由控制器自动填充的:

ls -l /my_cgroup/cpu/user1/
-rw-r--r--. 1 root root 0 Sep  5 10:26 cgroup.clone_children
-rw-r--r--. 1 root root 0 Sep  5 10:26 cgroup.procs
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.stat
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_all
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_percpu
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_percpu_sys
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_percpu_user
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_sys
-r--r--r--. 1 root root 0 Sep  5 10:26 cpuacct.usage_user
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpu.cfs_period_us
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpu.cfs_quota_us
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpu.rt_period_us
-rw-r--r--. 1 root root 0 Sep  5 10:26 cpu.rt_runtime_us
-rw-r--r--. 1 root root 0 Sep  5 10:20 cpu.shares
-r--r--r--. 1 root root 0 Sep  5 10:26 cpu.stat
-rw-r--r--. 1 root root 0 Sep  5 10:26 notify_on_release
-rw-r--r--. 1 root root 0 Sep  5 10:23 tasks

现在我已经设置了一些 Cgroup,然后就可以生成负载了。打开三个 SSH 会话,并在前台运行以下命令:

# cat /dev/urandom

可以在 top 中看到结果:

玩转 Cgroup 系列之三:挑战手动管理 Cgroup_Cgroup

注意: CPUShares 是基于顶级 Cgroup 的。默认情况下,顶级 Cgroup 是无约束的,这意味着一旦上层进程需要 CPUShares,系统将优先考虑该进程。是不是感觉有点绕?所以我们最好在系统上对 Cgroup 的布局进行可视化,以避免混淆,这一点非常重要。

从上面的截图中可以看到,所有的 cat 进程几乎都接收到了相同数量的 CPU 时间。这是因为默认情况下 Cgroup 在 cpu.shares 文件中的赋值是 1024。如前所述,这个份额是由父级与其他 Cgroup 的关系决定的。在本例中,我没有调整任何父级的权重。因此,如果所有父级 Cgroup 同时需要资源的话,它们将以默认的 1024 CPUShares 的权重进行分配。

回过头来,我在这里创建了带有默认值的 Cgroup,每个组的默认权重为 1024。如果要更改这个值,只需更改 cpu.shares 文件即可:

# echo 2048 > user1/cpu.shares
# echo 768 > user2/cpu.shares
# echo 512 > user3/cpu.shares

现在,权重计算会变得更复杂。但因为我还没有将任何进程添加到 Cgroup 中,它还处于未激活状态。如果要将进程添加到 Cgroup 中,将所需的 PID 添加到 tasks 文件中就可以:

# echo 2023 > user1/tasks

同样,可以在 top 中看到结果:

玩转 Cgroup 系列之三:挑战手动管理 Cgroup_权重_02

如图所示,新 Cgroup 中的进程大致接收到了一半的 CPU 时间。这是因为按照之前的等式,可以计算出:

玩转 Cgroup 系列之三:挑战手动管理 Cgroup_权重_03

我们继续将其他两个进程添加到各自的 Cgroup 中并观察结果:

# echo 2024 > user2/tasks
# echo 2025 > user3/tasks

玩转 Cgroup 系列之三:挑战手动管理 Cgroup_权重_04

可以看到权重已经生效,user1 占用了大约 61% 的 CPU 时间。剩余的时间分配给了 user2user3

玩转 Cgroup 系列之三:挑战手动管理 Cgroup_权重_05

不过,我们的示例也存在几个问题:

  1. 这些设置都是手动创建的,如果放入 Cgroup 中的进程的 PID 发生改变,会怎么样?
  2. 自定义的文件和文件夹在重启后不会保存,怎么办?
  3. 大部分工作都需要手动完成,有哪些工具可用?

我知道你很急,但是你先别急,systemd 为我们提供了很好的解决方案。我们在下一篇文章中会涉及。

总结

现在我们已经知道如何手动管理 Cgroup 了,因此后面大家能够更好地体会 Cgroup 和 systemd 协同使用的价值。

我将在本系列的第四篇,也就是完结篇中,深入探讨这个想法。

标签:10,Sep,--,之三,玩转,Cgroup,root,cpu
From: https://blog.51cto.com/u_16349701/8376524

相关文章

  • 撒贝宁走进折叠宇宙:从折手机到折电视,玩转场景需求
    如果说过去几年折叠产品是少数人的玩具,那么今年,一个全民热捧的折叠宇宙正在形成。去年9月,央视名嘴撒贝宁拿着折叠手机,一屏看台本,一屏看新闻,掀起高端用户“折叠”潮流。今年,撒老师把可折叠激光电视“卷”进“新家”,从想用大屏激光电视看台本,到赏画、观影、娱乐,演绎出新时代人群对电......
  • 一文带你玩转SQL中的DML(数据操作)语言:从概念到常见操作大解析!数据操作不再难!
    前面我们介绍了SQL语句中数据定义语言(DDL)的概念以及它的常用语句,那么DML又是什么呢?二者有什么区别呢?本篇文章将为你讲述。一、DML简介DML是指数据操作语言,英文全称是DataManipulationLanguage,用来对数据库中表的数据记录进行更新。它创建的模式(表)使用数据操作语言来填充。DDL......
  • 一文带你玩转SQL中的DML(数据操作)语言:从概念到常见操作大解析!数据操作不再难!
    前面我们介绍了SQL语句中数据定义语言(DDL)的概念以及它的常用语句,那么DML又是什么呢?二者有什么区别呢?本篇文章将为你讲述。一、DML简介DML是指数据操作语言,英文全称是DataManipulationLanguage,用来对数据库中表的数据记录进行更新。它创建的模式(表)使用数据操作语言来填充。DD......
  • 玩转PGSOFT科技电子机世界:iQOO Pad银翼新配色今晚上市,搭载天玑9000+旗舰芯
    iQOO的新产品iQOOPad银翼配色今晚开售,引起了广泛的关注,不仅因其卓越的硬件性能,还因其为PGSOFT电子游戏玩家提供了出色的体验。这款平板起售价为2299元。iQOOPad搭载了一块12.1英寸的超感巨幕屏,具备2.8K分辨率和出色的144Hz高刷新率,同时采用了令人惊叹的6.9mm极窄边框设计,屏占比高......
  • 必看!玩转Salesforce沙盒的5个实用技巧
    定期刷新沙盒对于尝试最新版本的功能,以及防止在生产组织的环境中缺乏测试而导致开发工作回滚至关重要。为了确保沙盒设置在刷新后顺利进行,需要考虑几个因素。首先,确保有完善的文档化流程。文档应分为Conga、DocuSign、数据(CPQ/计费/高级审批)、用户设置和集成等部分。此外,重要的......
  • Net 高级调试之三:类型元数据介绍(同步块表、类型句柄、方法描述符等)
    一、简介今天是《Net高级调试》的第三篇文章,压力还是不小的。上一篇文章,我们浅浅的谈了谈CLR和Windows加载器是如何加载Net程序集的,如何找到程序的入口点的,有了前面的基础,我们今天看一点更详细的东西。既然Windows操作系统已经加载了CLR,初始化了应用程序域,加载......
  • 玩转结构体---【C语言】
    ⛩️博主主页:@威化小餅干......
  • 《玩转翻译》实战连载№2:如何批量实现多语言翻译的格式对齐?
    《玩转翻译》实战连载№2:如何批量实现多语言翻译的格式对齐?引言 生活和工作很多时候都会遇到翻译的情况,如果是几个单词或几句话,则有很多途径可以实现翻译。但如果需要翻译的词汇量比较大、句子、段落比较多,又需要保持原先的格式或者保持行或段落,如何解决? 一般的方法,可能会......
  • 【玩转 Node 连载 1/6】我是如何在 Node.js 中定位异常的
    第72届早早聊大会将于2023年10月29日(下周日)举办-前端跨端方案|跨端同构,方法框架,5位讲师下午直播,关键词:跨端框架/跨端组件库/小程序/Harmony/Electron。跟早早聊一起,码上多平台,上车链接:https://www.zaozao.run/conf/c72本文是2023年4月8日,第六十二届-前端早早......
  • 腾讯云 CODING 快速应用中心,让您 10 分钟轻松玩转 AIGC
    点击链接了解详情前言AI时代已经到来,与其说这是一个技术变革,不如说这是对我们工作和生活方式的全面升级。很多人已经听说过StableDiffusionAI绘图和Meta公司推出的免费大语言模型Llama2,它们代表了当今最前沿的技术水平。但对于绝大多数人来说,尝试和体验这些前沿技术......