如何判断cgroup的版本?
在 Linux 系统中,判断当前使用的 cgroup 版本(v1 还是 v2)可以通过以下几种方法:
方法一:查看挂载点(最直接)
mount | grep cgroup
输出分析
- cgroups v1:存在多个以
cgroup
开头的挂载点,每个挂载点对应一个子系统(如cpu
、memory
)。cgroup on /sys/fs/cgroup/cpu type cgroup (rw,nosuid,nodev,noexec,relatime,cpu) cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
- cgroups v2:只有一个
cgroup2
挂载点,所有子系统统一管理。cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime)
方法二:检查 /sys/fs/cgroup 目录内容
ls /sys/fs/cgroup
输出分析
- cgroups v1:目录下包含多个子目录,每个对应一个子系统(如
cpu
、memory
)。blkio cpu cpuacct cpuset devices freezer memory net_cls net_prio perf_event pids systemd
- cgroups v2:目录下包含
cgroup.controllers
、cgroup.procs
等 v2 特有的文件。cgroup.controllers cgroup.max.depth cgroup.procs cgroup.stat ...
方法三:查看内核参数
检查内核是否启用了 unified_cgroup_hierarchy
参数:
cat /boot/cmdline.txt # 适用于部分系统
# 或
cat /proc/cmdline
输出分析
- cgroups v2:包含
systemd.unified_cgroup_hierarchy=1
或unified_cgroup_hierarchy=1
。 - cgroups v1:无此参数或值为
0
。
方法四:使用 lsb_release 或 hostnamectl(适用于部分系统)
lsb_release -a # 查看发行版信息
hostnamectl # 查看系统信息
版本对应关系
- Ubuntu 20.04+、CentOS 8+、Fedora 31+ 默认使用 cgroups v2。
- Ubuntu 18.04、CentOS 7 默认使用 cgroups v1。
方法五:检查进程的 cgroup 文件(精确到进程)
cat /proc/$$/cgroup # $$ 表示当前 shell 进程的 PID
输出分析
- cgroups v1:每行以子系统名称开头(如
11:memory:/user.slice
)。 - cgroups v2:第一行包含
0::/
或0:name=systemd:/
。0::/user.slice/user-1000.slice/session-2.scope
方法六:使用 cgroup 命令行工具
# 尝试查看 cgroup v2 特有的控制器文件
cat /sys/fs/cgroup/cgroup.controllers# 如果输出类似以下内容,则为 v2:
# cpu io memory pids
总结
方法 | v1 特征 | v2 特征 |
---|---|---|
mount | 多个 cgroup 挂载点 | 单个 cgroup2 挂载点 |
/sys/fs/cgroup | 子目录对应各子系统 | 包含 cgroup.controllers 文件 |
内核参数 | 无 unified_cgroup_hierarchy | unified_cgroup_hierarchy=1 |
/proc/$$/cgroup | 每行以子系统名称开头 | 首行包含 0::/ |
注意事项
- 混合模式:部分系统可能启用了 hybrid 模式(v1 和 v2 共存),此时需根据实际挂载情况判断。
- 容器影响:容器内的 cgroup 视图可能与宿主机不同,需进入宿主机检查。
- 版本切换:若需从 v1 切换到 v2,需修改内核启动参数并重启系统。
通过以上方法,可准确判断系统当前使用的 cgroup 版本,为容器部署和资源管理提供基础依据。