一、基本概念

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

与 systemd 管理的服务容易冲突

兼容轻量系统(如 Alpine)

大规模服务管理不方便

三、systemd 管理 cgroup

1️⃣ 概念

systemd 是 Linux 的初始化系统和服务管理器,它在管理服务时自动创建对应的 cgroup。

2️⃣ 常见命令

目的

命令

查看 cgroup 层级

systemd-cgls

实时查看资源占用

systemd-cgtop

查看某服务 cgroup 路径

systemctl show nginx.service -p ControlGroup

编辑服务资源限制

systemctl edit nginx.service

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 对比

对比项

cgroupfs

systemd

类型

内核文件系统接口

用户空间管理器

操作方式

直接操作 /sys/fs/cgroup

使用 systemd 命令与 unit 文件

灵活性

高,低层控制

中等,自动化

易用性

手动繁琐

简单统一

稳定性

容易与 systemd 冲突

稳定、一致性好

依赖

无依赖

需 systemd 系统

适用系统

轻量或嵌入式 Linux

主流 Linux (RHEL, Ubuntu, CentOS 等)

Kubernetes 推荐

❌(旧版本使用)

✅(生产环境标准)


五、适用场景总结

🟢 适合使用 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 更底层、灵活但繁琐。