Docker底层原理:Cgroup V2的使用

前言

cgroup可以用于实现对系统资源(如CPU、Memory、IO等)的控制和管理,支持各种应用场景下的资源隔离、限制和监控。通过合理使用cgroup,可以更有效地管理系统资源、提高系统的稳定性和性能,本篇博客使用最新的cgroup v2来进行讲解

cgroup用途

  1. 资源隔离:通过cgroup,可以将一组相关的进程隔离在一个独立的cgroup中,从而避免它们对系统其他组件的干扰,保证系统的稳定性和可靠性

  2. 资源限制:cgroup可以限制cgroup中进程对系统资源的使用,如CPU、内存、磁盘I/O等,确保不会因为某个进程的使用过度而导致系统性能下降或者崩溃

  3. 资源账单和报告:通过cgroup可以统计和监控每个cgroup的资源使用情况,生成资源使用报告,以便分析应用程序或服务的性能需求,优化资源分配策略

  4. 优先级调整:可以通过cgroup设置不同cgroup之间的资源调度优先级,确保高优先级cgroup获得更多的资源,提高系统的整体性能

  5. 容器化支持:cgroup是Docker等容器化技术的基础之一,可以借助cgroup对容器中运行的应用程序进行资源隔离和限制,保证容器之间的互相独立性

检查 cgroup2 文件系统是否已加载

cat /proc/filesystems | grep cgroup2

检查系统是否已挂载 cgroup2 文件系统

mount | grep cgroup2

在这里插入图片描述

若系统没有加载cgroup2文件系统,需要执行下面这条命令

echo 'cgroup2 /sys/fs/cgroup cgroup2 rw,nosuid,nodev,noexec,relatime,seclabel 0 0' >> /etc/fstab

mount -t cgroup2 none /sys/fs/cgroup

cgroup文件的简述

一般cgroup2的文件系统挂载在/sys/fs/cgroup下

可以查看/sys/fs/cgroup目录下的内容
在这里插入图片描述

  1. cgroup.controllers:列出当前cgroup所支持的控制器(controllers)
  2. cpu.pressure:显示CPU压力的指标
  3. io.cost.qos:显示IO带宽成本的质量保证(QoS)配置
  4. cgroup.max.depth:限制cgroup层次结构的最大深度
  5. cpu.stat:显示CPU统计信息,如CPU时间等
  6. io.pressure:显示IO压力的指标
  7. cgroup.max.descendants:限制cgroup子结构的最大数量
  8. cpuset.cpus.effective:显示每个cgroup有效的CPU编号
  9. io.stat:显示IO统计信息,如IO读写次数等
  10. cgroup.pressure:显示cgroup对CPU和IO资源的压力情况
  11. cpuset.mems.effective:显示每个cgroup有效的内存节点编号
  12. memory.numa_stat:显示NUMA节点的内存统计信息
  13. cgroup.procs:列出属于当前cgroup的进程ID
  14. memory.pressure:显示内存压力的指标
  15. cgroup.stat:显示当前cgroup的统计信息,如进程数量、内存使用等
  16. cgroup.subtree_control:用于管理cgroup的子树,定义子树的层次结构和控制器
  17. init.scope:显示Systemd中init范围的cgroup信息
  18. memory.stat:显示内存统计信息,如内存使用、缓存、交换区等
  19. user.slice:显示Systemd中用户slice的cgroup信息
  20. cgroup.threads:列出属于当前cgroup的线程ID
  21. io.cost.model:显示IO成本模型的配置信息
  22. misc.capacity:显示杂项资源的容量配置信息

这些文件提供了对cgroup资源控制和管理的各种参数、统计信息和配置选项。通过读取和修改这些文件,可以调整和监控cgroup的行为和性能

创建 cgroup 控制组

mkdir /sys/fs/cgroup/<cgroup_name>

在这里插入图片描述

创建的新cgroup目录,通常该cgroup目录对应的cgroup对应的控制组会继承它所属父目录的控制组的默认设置

下列文件是该cgroup控制组的资源控制和隔离等配置的作用描述,我们通过修改其中的文件内容可以去调整该cgroup资源限制和管理的规则

  1. cgroup.controllers:列出此cgroup中启用的所有控制器。每个控制器由一个字符串表示,表示启用的控制器的名称(如cpu、memory、io等)
  2. cgroup.type:表示此cgroup的类型。常见的类型有:task(用于包含单个进程)、thread(用于包含线程)、cpu(单个CPU的cgroup集合)等
  3. cgroup.events:列出了与此cgroup相关的事件
  4. cgroup.freeze:用于冻结或解冻cgroup中的进程。冻结后,所有进程将停止执行
  5. cgroup.kill:用于杀死此cgroup中的所有进程
  6. cgroup.max.depth:表示cgroup层次结构的最大深度
  7. cgroup.max.descendants:表示cgroup的最大后代数
  8. cgroup.pressure:表示cgroup中所配置资源的压力情况
  9. cgroup.procs:列表,包含属于此cgroup的所有进程和线程的进程ID
  10. cgroup.stat:统计信息,包含与此cgroup相关的统计数据
  11. cgroup.subtree_control:用于配置cgroup的子树控制参数
  12. cgroup.threads:列表,包含属于此cgroup的所有线程的线程ID
  13. cpuset.cpus:表示此cgroup可以使用的CPU编号
  14. cpuset.cpus.effective:表示已完成NUMA分配的CPU集
  15. cpuset.cpus.partition:表示此cgroup中可用的CPU分区
  16. cpuset.mems:表示此cgroup可以使用的内存节点编号
  17. cpuset.mems.effective:表示已完成NUMA分配的内存节点集
  18. cpu.idle:表示此cgroup的空闲CPU时间
  19. cpu.max:表示此cgroup中可使用的最大CPU资源
  20. cpu.max.burst:表示此cgroup中可超额使用的最大CPU资源
  21. cpu.pressure:表示此cgroup中CPU资源的压力情况
  22. cpu.stat:统计信息,包含与此cgroup中的CPU使用相关的统计数据
  23. cpu.weight:表示此cgroup相对于其他cgroup的CPU权重
  24. cpu.weight.nice:表示此cgroup相对于其他cgroup的CPU权重(针对“nice”进程)
  25. io.max:表示此cgroup中可使用的最大IO资源
  26. io.pressure:表示此cgroup中IO资源的压力情况
  27. io.stat:统计信息,包含与此cgroup中的IO使用相关的统计数据
  28. io.weight:表示I/O调度器在cgroup中对I/O资源的权重配置
  29. memory.current:表示此cgroup当前使用的内存量
  30. memory.events:表示与此cgroup相关的内存事件
  31. memory.events.local:表示与此cgroup相关的本地内存事件
  32. memory.high:表示此cgroup中可使用的最大内存资源
  33. memory.low:表示此cgroup中可使用的最小内存资源
  34. memory.max:表示此cgroup中可使用的最大内存资源
  35. memory.min:表示此cgroup中可使用的最小内存资源
  36. memory.numa_stat:包含与此cgroup相关的NUMA统计信息
  37. memory.oom.group:表示此cgroup中的out-of-memory(内存耗尽)组
  38. memory.peak:表示此cgroup中使用的最大内存量
  39. memory.pressure:表示此cgroup中内存资源的压力情况
  40. memory.reclaim:表示此cgroup中的内存回收压力
  41. memory.stat:统计信息,包含与此cgroup中的内存使用相关的统计数据
  42. memory.swap.current:表示此cgroup当前使用的swap内存量
  43. memory.swap.events:表示与此cgroup相关的swap内存事件
  44. memory.swap.max:表示此cgroup中可使用的最大swap内存资源
  45. memory.swap.high:表示此cgroup中可使用的最大swap内存资源
  46. memory.zswap.current:表示此cgroup中当前正在使用的zswap压缩内存的大小
  47. memory.zswap.max:表示此cgroup中zswap允许使用的最大压缩内存的大小
  48. pids.current:表示此cgroup中当前使用的进程数量
  49. pids.events:表示与此cgroup相关的进程事件
  50. pids.max:表示此cgroup中可使用的最大进程资源
  51. pids.peak:表示此cgroup中使用的最大进程数量

查看 cgroup 开启的资源控制类型

cat /sys/fs/cgroup/<cgroup_name>/cgroup.controllers

启用 cgroup 资源控制

# 开启cpu和memory控制,具体情况,具体分析
echo "+cpu +memory" > /sys/fs/cgroup/<cgroup_name>/cgroup.subtree_control

设置 cgroup 资源限制

# CPU配额限制为50%(即100毫秒周期最多执行50毫秒)
echo "50000 100000" > /sys/fs/cgroup/<cgroup_name>/cpu.max
# 内存使用将被限制在最大50mb
echo "50M" > memory.max

加入进程到 cgroup

# 将pid为7890的进程加入到你创建的cgroup
echo 7890 > /sys/fs/cgroup/<cgroup_name>/cgroup.procs
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

醉墨居士

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值