深入理解 Cgroup:Linux 资源控制详解与实战
🧩 深入理解 Cgroup:Linux 资源控制详解与实战
🧪 十一、实战演示:手动使用 Cgroup 限制资源
本文从“原生 Linux 命令层面”理解 cgroup 的实际行为。
将手动创建一个 cgroup、设置资源上限,并观察限制生效的过程。
🧰 实验环境
- 系统:Linux(任意发行版,支持
cgroup v2) - 需要 root 权限
- 安装工具:
stress(模拟压力)
安装:
sudo apt install stress -y # Ubuntu/Debian
# 或
sudo yum install stress -y # CentOS/RHEL
🧩 Step 1:确认系统使用 cgroup v2
stat -c %T /sys/fs/cgroup
如果输出为:
cgroup2fs
✅ 表示当前系统使用 cgroup v2。
⚙️ Step 2:创建一个新的 cgroup
创建目录(即一个新的“控制组”):
sudo mkdir /sys/fs/cgroup/testgroup
默认情况下,系统中的 /sys/fs/cgroup 是挂载点,
我们只需新建子目录即可创建一个新的 cgroup。
💾 Step 3:设置资源限制
1️⃣ 限制内存为 100MB
echo $((100*1024*1024)) | sudo tee /sys/fs/cgroup/testgroup/memory.max
2️⃣ 限制 CPU 为 50%
在 cgroup v2 中使用 cpu.max:
echo "50000 100000" | sudo tee /sys/fs/cgroup/testgroup/cpu.max
表示每 100ms 周期最多能用 50ms CPU 时间(即 50% 限制)。
3️⃣ 限制最大进程数(防止 fork 炸弹)
echo 20 | sudo tee /sys/fs/cgroup/testgroup/pids.max
🧩 Step 4:启动一个受控进程
现在我们把一个进程(例如 stress)放入这个 cgroup:
# 启动一个 stress 任务,使用 4 个 CPU worker、200MB 内存
stress --cpu 4 --vm 1 --vm-bytes 200M --timeout 30s &
PID=$!
把进程 PID 写入 cgroup:
echo $PID | sudo tee /sys/fs/cgroup/testgroup/cgroup.procs
🔍 Step 5:观察效果
查看当前使用情况:
cat /sys/fs/cgroup/testgroup/memory.current
cat /sys/fs/cgroup/testgroup/cpu.stat
cat /sys/fs/cgroup/testgroup/pids.current
示例输出:
memory.current: 104857600
cpu.stat:
usage_usec 5000000
user_usec 4500000
system_usec 500000
pids.current: 5
查看系统日志:
dmesg | tail
若内存超过 100MB,可能会看到:
Out of memory: Killed process 12345 (stress)
👉 说明限制已生效!
🧱 Step 6:释放资源
实验结束后可删除该 cgroup:
sudo rmdir /sys/fs/cgroup/testgroup
🧩 Step 7:systemd 管理方式(更安全推荐)
如果你使用 systemd 系统,可以更优雅地实现相同效果:
sudo systemd-run --scope -p MemoryMax=100M -p CPUQuota=50% stress --vm 1 --vm-bytes 200M --timeout 30s
输出示例:
Running scope as unit: run-1234.scope
查看运行状态:
systemd-cgls
systemd-cgtop
👉 你可以看到该进程被放入独立的 cgroup,并自动应用资源限制。
📊 实验结果总结
| 资源类型 | 设置方法 | 结果 |
|---|---|---|
| 💾 内存 | memory.max=100M | 超出即被 OOM 杀死 |
| 🧮 CPU | cpu.max="50000 100000" | 限制在 50% CPU 使用率 |
| 👥 进程数 | pids.max=20 | 无法创建新进程(返回 fork: Resource temporarily unavailable) |
💡 小结
通过以上实验你可以直观理解:
- Cgroup 文件系统 是真正实现资源限制的接口;
- Docker / systemd / Kubernetes 只是更高层的封装;
- 手动操作能帮助你验证和排障。
🧠 一句话记忆:
Cgroup 就像给进程戴上“资源手铐”,
每个文件(memory.max / cpu.max / pids.max)都是一把“控制阀门”。

747

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



