一、基本概念
cgroup(Control Groups) 是 Linux 内核用于限制、记录和隔离进程资源使用(CPU、内存、IO、网络等)的机制。
目前主要有两种管理方式:
cgroupfs
:直接使用内核提供的文件系统接口管理
systemd
:通过 systemd 服务管理框架间接管理 cgroup
二、cgroupfs
1️⃣ 概念
cgroupfs 是内核提供的 cgroup 虚拟文件系统,用户可直接通过挂载点 /sys/fs/cgroup 操作。
2️⃣ 常见操作
# 查看挂载点
mount | grep cgroup
# 挂载 cgroup v2
mount -t cgroup2 none /sys/fs/cgroup
# 创建一个控制组
mkdir /sys/fs/cgroup/mygroup
# 把进程加入该组
echo 12345 > /sys/fs/cgroup/mygroup/cgroup.procs
# 限制 CPU 使用
echo 20000 > /sys/fs/cgroup/mygroup/cpu.max # 限制20% CPU
3️⃣ 优缺点
三、systemd 管理 cgroup
1️⃣ 概念
systemd 是 Linux 的初始化系统和服务管理器,它在管理服务时自动创建对应的 cgroup。
2️⃣ 常见命令
3️⃣ 在 unit 文件中限制资源
[Service]
CPUQuota=50%
MemoryMax=500M
IOReadBandwidthMax=/dev/sda 10M
保存后执行:
systemctl daemon-reload
systemctl restart nginx.service
4️⃣ 创建自定义 slice
cat <<EOF >/etc/systemd/system/myapp.slice
[Slice]
CPUQuota=30%
MemoryMax=1G
EOF
systemctl daemon-reload
systemctl start myapp.slice
四、cgroupfs vs systemd 对比
五、适用场景总结
🟢 适合使用 systemd 的场景
生产环境 Kubernetes 集群(v1.22+ 默认)
RHEL / CentOS / Ubuntu / Debian / Fedora 等现代系统
云主机(EKS、ACK、GKE、AKS)
需要精确控制资源的场景
⚙️ 适合使用 cgroupfs 的场景
轻量级容器运行时(K3s、Docker 单机)
非 systemd 系统(Alpine、BusyBox)
内核或容器底层开发、调试
极简系统或嵌入式环境
六、Kubernetes 中的选择建议
推荐使用:systemd
确保 kubelet 与容器运行时(Docker/containerd)cgroup driver 一致
检查命令:
# kubelet
ps -ef | grep kubelet | grep cgroup-driver
# containerd
containerd config dump | grep SystemdCgroup
✅ 若输出如下则一致:
--cgroup-driver=systemd
SystemdCgroup = true
七、总结一句话
生产环境用 systemd,开发或轻量环境可用 cgroupfs。
systemd 更稳定、自动化;cgroupfs 更底层、灵活但繁琐。