【Docker】(五)CGroup 资源管控

发布时间:2026/8/6 13:09:56
【Docker】(五)CGroup 资源管控 Day5 防止容器占满服务器内存限制完整实验在Docker中Namespace负责资源隔离让容器互相看不见彼此而CGroup负责资源限制。二者搭配才构成容器两大底层核心技术。如果只有隔离没有限制某个容器疯狂占用CPU、内存会直接把宿主机资源耗尽引发宕机。问答题1、请说明 CGroups 对于容器运行有什么重要作用。资源隔离与限制的核心1、限制组内进程的资源使用量如CPU使用率、内存使用量。防止每个进程或组占用过多资源影响其他进程或系统的稳定性2、为不同组分配不同的资源优先级。为高优先级任务分配更多的CPU时间3、监控和记录组内进程的资源使用情况如CPU时间、内存使用量4、可对组内进程挂起、恢复、终止5、CGroups支持层次化结构可将组嵌套在其他组中形成树形结构2、CGroups 是如何控制容器资源使用的请举例说明。创建控制组、配置资源规则、将进程加入控制组当程序申请的内存超过 100MB 时内核会立刻终止进程不会让它把宿主机内存占满。没有 CGroups容器就做不到真正的资源隔离和限制宿主机上的容器很容易互相干扰甚至拖垮宿主机。一、什么是CGroupCGroup全称Control Groups控制组是Linux内核提供的机制。作用对一组进程做资源配额限制、统计、监控。简单理解Namespace划分“独立房间”CGroup给每个房间安装电表、水表限制最多能用多少资源。二、CGroup五大核心功能资源限制Limit限制进程组最大可占用资源例如最大内存、最大CPU算力。优先级分配Priority分配CPU调度权重重要容器优先使用CPU。资源统计Accounting统计进程消耗CPU、内存、磁盘IO对应docker stats底层数据来源。进程冻结Suspend暂停/恢复一组进程。进程控制Control对组内进程执行信号、销毁等操作。三、常用CGroup子系统Subsystem子系统就是内核中针对某一类资源的管控模块cpu限制CPU时间、调度权重memory限制进程最大内存内存超限触发OOMblkio块设备磁盘IO读写限速pids限制组内最多能创建多少进程防御fork炸弹cpuset绑定进程到指定CPU核心、内存节点多核服务器常用补充容器 Namespace隔离视图 CGroup资源配额 rootfs文件系统四、内存溢出Demo 手动CGroup内存限制实操我们手动创建CGroup限制进程最多使用100M内存运行一段无限申请内存的C语言程序观察内核如何杀掉超限进程。4.1 内存溢出C Demo代码#includestdio.h#includestdlib.h#includestring.hintmain(){while(1){// 每次申请10MB内存char*pmalloc(10*1024*1024);memset(p,1,10*1024*1024);sleep(1);}return0;}编译命令gcc mem_leak.c -o mem_leak4.2 手动创建CGroup限制内存流程挂载cgroup文件系统cgroup v1在memory子系统下新建控制组目录设置最大可用内存memory.limit_in_bytes104857600100MB将程序PID写入tasks文件把进程加入该控制组运行内存溢出程序内存达到阈值后触发OOM Kill进程被系统终止实验现象程序持续占用内存到达100MB上限不再分配新内存内核触发OOM机制杀死进程防止耗尽宿主机内存。五、CGroup v1 与 CGroup v2 简单区分CGroup v1各类资源子系统独立目录cpu、memory分开挂载Docker长期默认使用v1配置简单但是结构零散。CGroup v2统一层级架构所有资源放在同一套目录树内核新版本支持设计更简洁新版容器运行时containerd、crun逐步向v2迁移。六、Docker资源参数底层对应CGroup日常使用docker run资源限制参数底层Docker会自动创建CGroup并写入对应配置无需手动操作文件。- --memory 100m底层写入memory子系统内存上限 - --cpus 0.5限制最多使用0.5颗CPU核心映射cpu子系统配额示例启动命令dockerrun-it--memory100m--cpus0.5nginx当容器内进程持续占用超过设定内存同样会触发OOMCPU占用超过配额会被内核限流无法抢占宿主机全部算力。七、Namespace vs CGroup 核心区别Namespace改变进程“能看到什么资源”实现隔离CGroup限制进程“最多能用多少资源”实现管控。二者互相配合缺一不可。