命名空间——控制组群(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_bytes、cgroup.procs 等),这些就是控制“demo”这个 cgroup 的配置项。
三、逐个拆解材料中的例子
例子1:限制进程的最大内存(超过就被杀掉)
目标:创建一个 cgroup,限制其中的进程最多只能用 100MB 内存,超过就被内核的“OOM Killer”(内存溢出杀手)终止。
步骤拆解:
-
创建内存控制组:
sudo mkdir /sys/fs/cgroup/memory/demo此时
demo目录下的文件就是内存限制的配置项。 -
设置最大内存限制:
echo 100000000 > /sys/fs/cgroup/memory/demo/memory.limit_in_bytes100000000是字节数,换算后约 100MB(1MB=1024×1024≈100万字节);- 这个操作的意思是:“demo” 控制组里的所有进程,总内存使用不能超过 100MB。
-
关闭交换分区使用(可选):
echo 0 > /sys/fs/cgroup/memory/demo/memory.swappinessswappiness是“使用交换分区的倾向”(0 表示尽量不用交换分区,只用物理内存);- 目的是让内存限制更严格:超过 100MB 物理内存就触发限制,而不是“偷偷”用交换分区(交换分区在硬盘上,速度慢,且不算入物理内存限制)。
-
将当前进程加入这个控制组:
echo $$ > /sys/fs/cgroup/memory/demo/cgroup.procs$$表示当前 shell 进程的 PID(比如 1234);cgroup.procs文件用来记录“受该控制组管理的进程 PID”,写入后,当前进程及其子进程都会被这个内存限制约束。
-
测试:运行一个吃内存的程序:
yes | spongeyes命令会不断输出“y”,sponge命令会把输入存到内存里(不断消耗内存);- 当内存使用超过 100MB 时,内核会触发 OOM Killer,把
sponge进程杀掉(保护系统其他进程)。
例子2:限制进程只能用特定的 CPU 核心
目标:让进程只能在 CPU 的第 2、3 号核心上运行(比如电脑有 4 个核心:0、1、2、3,现在只允许用后两个)。
步骤拆解:
-
创建 CPU 核心控制组:
mkdir -p /sys/fs/cgroup/cpuset/democpuset是控制“进程能使用哪些 CPU 核心和内存节点”的子系统。
-
指定允许使用的 CPU 核心:
echo "2,3" > /sys/fs/cgroup/cpuset/demo/cpuset.cpus- 意思是:“demo” 控制组里的进程,只能用 CPU 核心 2 和 3(核心编号从 0 开始)。
-
指定允许使用的内存节点(可选):
echo "0" > /sys/fs/cgroup/cpuset/demo/cpuset.mems- 多内存节点的服务器才需要(比如多插槽主板),普通电脑一般只有 1 个内存节点(0),表示只用第 0 个内存节点。
-
将当前进程加入控制组:
echo $$ > /sys/fs/cgroup/cpuset/demo/cgroup.procs- 之后,当前进程及其子进程就只会在 CPU 2、3 上运行,不会占用 0、1 核心的资源。
例子3:限制进程的 CPU 利用率(最多用 50%)
目标:让进程最多只能使用 50% 的 CPU 时间(比如在 1 个核心上,最多一半时间在运行)。
步骤拆解:
-
创建 CPU 利用率控制组:
mkdir -p /sys/fs/cgroup/cpu/democpu子系统用来控制 CPU 时间的分配。
-
设置 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 必须“休息”。
- 这两个参数是核心:
-
将当前进程加入控制组:
echo $$ > /sys/fs/cgroup/cpu/demo/cgroup.procs -
测试:运行吃 CPU 的程序:
yes > /dev/null & # 后台运行一个无限循环的程序,会疯狂占用 CPU- 正常情况下,
yes会占用 100% 的一个核心;但加入控制组后,它的 CPU 使用率会被限制在 50% 左右。
- 正常情况下,
四、总结:cgroup 的核心价值
cgroup 就像给进程的“资源紧箍咒”:
- 防止单个进程“霸占”太多内存/CPU,导致系统崩溃;
- 让资源分配更合理(比如给重要进程多分资源,给次要进程少分);
- 是容器技术中“资源限制”的底层支撑(比如 Docker 的
--memory、--cpus参数,本质就是在配置 cgroup)。
简单说,命名空间让进程“各过各的”,cgroup 让进程“别太过分”——两者一起,实现了容器的“隔离+可控”。
4207

被折叠的 条评论
为什么被折叠?



