命名空间——控制组群(cgroup)

命名空间——控制组群(cgroup)

cgroup(控制组)是 Linux 内核提供的进程资源管理机制,简单说就是给进程“划定资源使用范围”——比如限制某个进程能用多少内存、最多占用多少 CPU 资源,避免单个进程“贪多”导致整个系统卡顿或崩溃。

我们结合材料中的例子,用“给进程发‘资源消费券’”的比喻来理解:

一、先明确:cgroup 到底做什么?

cgroup 的核心功能是对进程(或进程组)的资源使用进行“限制、监控和控制”,支持的资源包括:

  • 内存(比如最多用 100MB);
  • CPU(比如只能用第 2、3 号核心,或最多用 50% 的 CPU 时间);
  • 磁盘 I/O(比如限制读写速度);
  • 网络带宽等。

它和命名空间的区别是:命名空间负责“隔离资源(让进程看不到彼此)”,而 cgroup 负责“控制资源使用量(让进程别用太多)”。两者结合,就是容器技术中“隔离+限制”的核心底层支撑。

二、cgroup 的工作方式:通过文件系统配置

Linux 把 cgroup 的配置通过“虚拟文件系统”暴露出来,默认路径是 /sys/fs/cgroup。每种资源(内存、CPU 等)对应一个子目录(比如 memory 对应内存控制,cpu 对应 CPU 控制)。

创建 cgroup 的方式很简单:在对应资源的目录下新建一个子目录,内核会自动在这个目录里生成一堆配置文件(用来设置资源限制)。

比如材料中创建“内存控制组”:

sudo mkdir /sys/fs/cgroup/memory/demo

执行后,/sys/fs/cgroup/memory/demo 目录下会出现很多文件(如 memory.limit_in_bytescgroup.procs 等),这些就是控制“demo”这个 cgroup 的配置项。

三、逐个拆解材料中的例子

例子1:限制进程的最大内存(超过就被杀掉)

目标:创建一个 cgroup,限制其中的进程最多只能用 100MB 内存,超过就被内核的“OOM Killer”(内存溢出杀手)终止。

步骤拆解:

  1. 创建内存控制组

    sudo mkdir /sys/fs/cgroup/memory/demo
    

    此时 demo 目录下的文件就是内存限制的配置项。

  2. 设置最大内存限制

    echo 100000000 > /sys/fs/cgroup/memory/demo/memory.limit_in_bytes
    
    • 100000000 是字节数,换算后约 100MB(1MB=1024×1024≈100万字节);
    • 这个操作的意思是:“demo” 控制组里的所有进程,总内存使用不能超过 100MB。
  3. 关闭交换分区使用(可选)

    echo 0 > /sys/fs/cgroup/memory/demo/memory.swappiness
    
    • swappiness 是“使用交换分区的倾向”(0 表示尽量不用交换分区,只用物理内存);
    • 目的是让内存限制更严格:超过 100MB 物理内存就触发限制,而不是“偷偷”用交换分区(交换分区在硬盘上,速度慢,且不算入物理内存限制)。
  4. 将当前进程加入这个控制组

    echo $$ > /sys/fs/cgroup/memory/demo/cgroup.procs
    
    • $$ 表示当前 shell 进程的 PID(比如 1234);
    • cgroup.procs 文件用来记录“受该控制组管理的进程 PID”,写入后,当前进程及其子进程都会被这个内存限制约束。
  5. 测试:运行一个吃内存的程序

    yes | sponge
    
    • yes 命令会不断输出“y”,sponge 命令会把输入存到内存里(不断消耗内存);
    • 当内存使用超过 100MB 时,内核会触发 OOM Killer,把 sponge 进程杀掉(保护系统其他进程)。
例子2:限制进程只能用特定的 CPU 核心

目标:让进程只能在 CPU 的第 2、3 号核心上运行(比如电脑有 4 个核心:0、1、2、3,现在只允许用后两个)。

步骤拆解:

  1. 创建 CPU 核心控制组

    mkdir -p /sys/fs/cgroup/cpuset/demo
    
    • cpuset 是控制“进程能使用哪些 CPU 核心和内存节点”的子系统。
  2. 指定允许使用的 CPU 核心

    echo "2,3" > /sys/fs/cgroup/cpuset/demo/cpuset.cpus
    
    • 意思是:“demo” 控制组里的进程,只能用 CPU 核心 2 和 3(核心编号从 0 开始)。
  3. 指定允许使用的内存节点(可选)

    echo "0" > /sys/fs/cgroup/cpuset/demo/cpuset.mems
    
    • 多内存节点的服务器才需要(比如多插槽主板),普通电脑一般只有 1 个内存节点(0),表示只用第 0 个内存节点。
  4. 将当前进程加入控制组

    echo $$ > /sys/fs/cgroup/cpuset/demo/cgroup.procs
    
    • 之后,当前进程及其子进程就只会在 CPU 2、3 上运行,不会占用 0、1 核心的资源。
例子3:限制进程的 CPU 利用率(最多用 50%)

目标:让进程最多只能使用 50% 的 CPU 时间(比如在 1 个核心上,最多一半时间在运行)。

步骤拆解:

  1. 创建 CPU 利用率控制组

    mkdir -p /sys/fs/cgroup/cpu/demo
    
    • cpu 子系统用来控制 CPU 时间的分配。
  2. 设置 CPU 时间配额

    echo "50000" > /sys/fs/cgroup/cpu/demo/cpu.cfs_quota_us  # 配额:50ms
    echo "100000" > /sys/fs/cgroup/cpu/demo/cpu.cfs_period_us  # 周期:100ms
    
    • 这两个参数是核心:period 是“统计周期”(100ms),quota 是“该周期内最多能占用的 CPU 时间”(50ms);
    • 计算方式:利用率 = 配额 / 周期 = 50ms / 100ms = 50%,即进程在每个 100ms 内最多运行 50ms,剩下 50ms 必须“休息”。
  3. 将当前进程加入控制组

    echo $$ > /sys/fs/cgroup/cpu/demo/cgroup.procs
    
  4. 测试:运行吃 CPU 的程序

    yes > /dev/null &  # 后台运行一个无限循环的程序,会疯狂占用 CPU
    
    • 正常情况下,yes 会占用 100% 的一个核心;但加入控制组后,它的 CPU 使用率会被限制在 50% 左右。

四、总结:cgroup 的核心价值

cgroup 就像给进程的“资源紧箍咒”:

  • 防止单个进程“霸占”太多内存/CPU,导致系统崩溃;
  • 让资源分配更合理(比如给重要进程多分资源,给次要进程少分);
  • 是容器技术中“资源限制”的底层支撑(比如 Docker 的 --memory--cpus 参数,本质就是在配置 cgroup)。

简单说,命名空间让进程“各过各的”,cgroup 让进程“别太过分”——两者一起,实现了容器的“隔离+可控”。

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值