PeaceSheep's blog PeaceSheep's blog
首页
  • 分类
  • 标签
  • 归档
相关链接
提建议&咨询&赞赏
GitHub (opens new window)

PeaceSheep

以最简洁、易懂的话解决问题
首页
  • 分类
  • 标签
  • 归档
相关链接
提建议&咨询&赞赏
GitHub (opens new window)
  • 下载器

  • 作业网站管理

  • 联邦学习

  • 随手写的小项目

  • docker

    • 想自己写一个docker的说明
    • 自己写一个docker(1)-cgroup介绍与使用
      • 一. 是什么
      • 二. 使用前的一些检查
        • 查看系统是否支持cgroup v2
        • 查看cgroup v2可管理的系统资源类型
        • 查看cgroup2开启的控制器
      • 三. 如何实现、怎么用
        • 1. 创建cgroup
        • 2. 对资源进行限制
        • 3. 将进程移动到对应的cgroup
        • 4. 删除一个cgroup
    • 自己写一个docker(2)-文件系统的处理
    • 自己写一个docker(3)-子进程的处理
  • 即时通讯

  • 项目
  • docker
PeaceSheep
2024-04-16
目录

自己写一个docker(1)-cgroup介绍与使用

# 一. 是什么

Cgroup(Control Group)是Linux内核提供的一种资源管理和限制机制,用于对进程进行分组并对分组内的进程进行资源限制、优先级调整等操作。

例如,他可以限制一个进程使用的内存数量,CPU数量等等。cgroup目前有两个版本,分别是v1和v2。本文所讲内容及实现均以cgroup v2为基础。

# 二. 使用前的一些检查

Linux内核有一个很大的模块叫VFS(Virtual File System)。VFS能够把具体的文件系统细节隐藏起来,给用户态进程提供一个文件系统API接口。cgrpus与VFS之间衔接的部分称之为cgroup文件系统。

# 查看系统是否支持cgroup v2

cgroup 版本取决于正在使用的 Linux 发行版和操作系统上配置的默认 cgroup 版本。 要检查你的发行版使用的是哪个 cgroup 版本,请在该节点上运行 stat -fc %T /sys/fs/cgroup/ 命令:

stat -fc %T /sys/fs/cgroup/
1

对于 cgroup v2,输出为 cgroup2fs。

对于 cgroup v1,输出为 tmpfs。

# 查看cgroup v2可管理的系统资源类型

cat /sys/fs/cgroup/cgroup.controllers 
1

可以看到类似于如下输出:cpuset cpu io memory hugetlb pids rdma misc。

# 查看cgroup2开启的控制器

以上仅仅是可以管理的,不代表实际开启了这些管理,查看cgroup2开启的控制器需要使用:

cat /sys/fs/cgroup/cgroup.subtree_control 
1

# 三. 如何实现、怎么用

我看到cgroup的介绍,一般都是说对XX资源进行限制,那么想解决一个问题,例如我想让main进程仅能使用1G的内存,应该怎么做呢?

linux有一切皆文件的设计理念,cgroup也是如此。在/sys/fs/cgroup/目录,可以看到一些文件,这些就是cgroup的一些相关配置。例如,cgroup.controllers就是表示当前cgroup的可用控制器。

# 1. 创建cgroup

我们在这个/sys/fs/cgroup/这个目录下新建一个文件夹mkdir test-cgroup。然后再进入到这个文件夹中,可以看到已经有一些文件了,这些文件就是我们创建的cgroup的相关配置。

# 2. 对资源进行限制

echo "50000 100000" > cpu.max
# cat cpu.max
50000 100000
1
2
3

这个含义是任务组test-cgroup配制为每个100毫秒周期最多执行50毫秒,也就是本cgroup管理的进程在单核CPU上的使用率不会超过50%。

提示

要获取所有的限制项,请参阅Maximizing Resource Utilization with cgroup2 (opens new window)。

# 3. 将进程移动到对应的cgroup

echo {pid} > cgroup.procs
1

表示把进程pid添加到当前的cgroup中。其中0是一个特殊值,表示当前进程。例如,把当前进程加入到cgroup中只需要echo 0 > cgroup.procs。

# 4. 删除一个cgroup

rmdir /sys/fs/cgroup/{你的cgroup的名字}
1

注意必须用rmdir,使用rm -rf是不行的,即便是root用户也会被提示没有权限。

参考链接

cgroup v2 使用示例 (opens new window)

Cgroup使用介绍 (opens new window)

关于 cgroup v2 (opens new window)

编辑 (opens new window)
上次更新: 2025/04/15, 10:52:45
想自己写一个docker的说明
自己写一个docker(2)-文件系统的处理

← 想自己写一个docker的说明 自己写一个docker(2)-文件系统的处理→

最近更新
01
ubuntu安装g++显示已有但是输入g++又找不到命令
04-15
02
使用cloudflare-r2搭建webdav
04-08
03
LLM聚合平台客户端对比
03-29
更多文章>
Theme by Vdoing | Copyright © 2022-2025 PeaceSheep
冀ICP备2022004632号-1
  • 跟随系统
  • 浅色模式
  • 深色模式
  • 阅读模式