如何判断cgroup的版本?

在 Linux 系统中,判断当前使用的 cgroup 版本(v1 还是 v2)可以通过以下几种方法:

方法一:查看挂载点(最直接)

mount | grep cgroup
输出分析
  • cgroups v1:存在多个以 cgroup 开头的挂载点,每个挂载点对应一个子系统(如 cpumemory)。
    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:目录下包含多个子目录,每个对应一个子系统(如 cpumemory)。
    blkio  cpu  cpuacct  cpuset  devices  freezer  memory  net_cls  net_prio  perf_event  pids  systemd
    
  • cgroups v2:目录下包含 cgroup.controllerscgroup.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.04CentOS 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::/

注意事项

  1. 混合模式:部分系统可能启用了 hybrid 模式(v1 和 v2 共存),此时需根据实际挂载情况判断。
  2. 容器影响:容器内的 cgroup 视图可能与宿主机不同,需进入宿主机检查。
  3. 版本切换:若需从 v1 切换到 v2,需修改内核启动参数并重启系统。

通过以上方法,可准确判断系统当前使用的 cgroup 版本,为容器部署和资源管理提供基础依据。

你可能感兴趣的:(#,Kubernetes系列,linux,运维,kubernetes)