Docker底层原理:Cgroup V2的使用
若系统没有加载cgroup2文件系统,需要执行下面这条命令。
文章目录
前言
cgroup可以用于实现对系统资源(如CPU、Memory、IO等)的控制和管理,支持各种应用场景下的资源隔离、限制和监控。通过合理使用cgroup,可以更有效地管理系统资源、提高系统的稳定性和性能,本篇博客使用最新的cgroup v2来进行讲解
cgroup用途
-
资源隔离:通过cgroup,可以将一组相关的进程隔离在一个独立的cgroup中,从而避免它们对系统其他组件的干扰,保证系统的稳定性和可靠性
-
资源限制:cgroup可以限制cgroup中进程对系统资源的使用,如CPU、内存、磁盘I/O等,确保不会因为某个进程的使用过度而导致系统性能下降或者崩溃
-
资源账单和报告:通过cgroup可以统计和监控每个cgroup的资源使用情况,生成资源使用报告,以便分析应用程序或服务的性能需求,优化资源分配策略
-
优先级调整:可以通过cgroup设置不同cgroup之间的资源调度优先级,确保高优先级cgroup获得更多的资源,提高系统的整体性能
-
容器化支持: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目录下的内容
- cgroup.controllers:列出当前cgroup所支持的控制器(controllers)
- cpu.pressure:显示CPU压力的指标
- io.cost.qos:显示IO带宽成本的质量保证(QoS)配置
- cgroup.max.depth:限制cgroup层次结构的最大深度
- cpu.stat:显示CPU统计信息,如CPU时间等
- io.pressure:显示IO压力的指标
- cgroup.max.descendants:限制cgroup子结构的最大数量
- cpuset.cpus.effective:显示每个cgroup有效的CPU编号
- io.stat:显示IO统计信息,如IO读写次数等
- cgroup.pressure:显示cgroup对CPU和IO资源的压力情况
- cpuset.mems.effective:显示每个cgroup有效的内存节点编号
- memory.numa_stat:显示NUMA节点的内存统计信息
- cgroup.procs:列出属于当前cgroup的进程ID
- memory.pressure:显示内存压力的指标
- cgroup.stat:显示当前cgroup的统计信息,如进程数量、内存使用等
- cgroup.subtree_control:用于管理cgroup的子树,定义子树的层次结构和控制器
- init.scope:显示Systemd中init范围的cgroup信息
- memory.stat:显示内存统计信息,如内存使用、缓存、交换区等
- user.slice:显示Systemd中用户slice的cgroup信息
- cgroup.threads:列出属于当前cgroup的线程ID
- io.cost.model:显示IO成本模型的配置信息
- misc.capacity:显示杂项资源的容量配置信息
这些文件提供了对cgroup资源控制和管理的各种参数、统计信息和配置选项。通过读取和修改这些文件,可以调整和监控cgroup的行为和性能
创建 cgroup 控制组
mkdir /sys/fs/cgroup/<cgroup_name>
创建的新cgroup目录,通常该cgroup目录对应的cgroup对应的控制组会继承它所属父目录的控制组的默认设置
下列文件是该cgroup控制组的资源控制和隔离等配置的作用描述,我们通过修改其中的文件内容可以去调整该cgroup资源限制和管理的规则
- cgroup.controllers:列出此cgroup中启用的所有控制器。每个控制器由一个字符串表示,表示启用的控制器的名称(如cpu、memory、io等)
- cgroup.type:表示此cgroup的类型。常见的类型有:task(用于包含单个进程)、thread(用于包含线程)、cpu(单个CPU的cgroup集合)等
- cgroup.events:列出了与此cgroup相关的事件
- cgroup.freeze:用于冻结或解冻cgroup中的进程。冻结后,所有进程将停止执行
- cgroup.kill:用于杀死此cgroup中的所有进程
- cgroup.max.depth:表示cgroup层次结构的最大深度
- cgroup.max.descendants:表示cgroup的最大后代数
- cgroup.pressure:表示cgroup中所配置资源的压力情况
- cgroup.procs:列表,包含属于此cgroup的所有进程和线程的进程ID
- cgroup.stat:统计信息,包含与此cgroup相关的统计数据
- cgroup.subtree_control:用于配置cgroup的子树控制参数
- cgroup.threads:列表,包含属于此cgroup的所有线程的线程ID
- cpuset.cpus:表示此cgroup可以使用的CPU编号
- cpuset.cpus.effective:表示已完成NUMA分配的CPU集
- cpuset.cpus.partition:表示此cgroup中可用的CPU分区
- cpuset.mems:表示此cgroup可以使用的内存节点编号
- cpuset.mems.effective:表示已完成NUMA分配的内存节点集
- cpu.idle:表示此cgroup的空闲CPU时间
- cpu.max:表示此cgroup中可使用的最大CPU资源
- cpu.max.burst:表示此cgroup中可超额使用的最大CPU资源
- cpu.pressure:表示此cgroup中CPU资源的压力情况
- cpu.stat:统计信息,包含与此cgroup中的CPU使用相关的统计数据
- cpu.weight:表示此cgroup相对于其他cgroup的CPU权重
- cpu.weight.nice:表示此cgroup相对于其他cgroup的CPU权重(针对“nice”进程)
- io.max:表示此cgroup中可使用的最大IO资源
- io.pressure:表示此cgroup中IO资源的压力情况
- io.stat:统计信息,包含与此cgroup中的IO使用相关的统计数据
- io.weight:表示I/O调度器在cgroup中对I/O资源的权重配置
- memory.current:表示此cgroup当前使用的内存量
- memory.events:表示与此cgroup相关的内存事件
- memory.events.local:表示与此cgroup相关的本地内存事件
- memory.high:表示此cgroup中可使用的最大内存资源
- memory.low:表示此cgroup中可使用的最小内存资源
- memory.max:表示此cgroup中可使用的最大内存资源
- memory.min:表示此cgroup中可使用的最小内存资源
- memory.numa_stat:包含与此cgroup相关的NUMA统计信息
- memory.oom.group:表示此cgroup中的out-of-memory(内存耗尽)组
- memory.peak:表示此cgroup中使用的最大内存量
- memory.pressure:表示此cgroup中内存资源的压力情况
- memory.reclaim:表示此cgroup中的内存回收压力
- memory.stat:统计信息,包含与此cgroup中的内存使用相关的统计数据
- memory.swap.current:表示此cgroup当前使用的swap内存量
- memory.swap.events:表示与此cgroup相关的swap内存事件
- memory.swap.max:表示此cgroup中可使用的最大swap内存资源
- memory.swap.high:表示此cgroup中可使用的最大swap内存资源
- memory.zswap.current:表示此cgroup中当前正在使用的zswap压缩内存的大小
- memory.zswap.max:表示此cgroup中zswap允许使用的最大压缩内存的大小
- pids.current:表示此cgroup中当前使用的进程数量
- pids.events:表示与此cgroup相关的进程事件
- pids.max:表示此cgroup中可使用的最大进程资源
- 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
开放原子开发者工作坊旨在鼓励更多人参与开源活动,与志同道合的开发者们相互交流开发经验、分享开发心得、获取前沿技术趋势。工作坊有多种形式的开发者活动,如meetup、训练营等,主打技术交流,干货满满,真诚地邀请各位开发者共同参与!
更多推荐
所有评论(0)