【容器底层技术】cgroup v2使用与测试

本文详细介绍cgroupv2的配置方法与测试流程,并通过实例演示如何管理与限制进程资源,包括CPU周期与内存分配等。

cgroup v2使用与测试

1. 配置cgroup v2的环境

  1. 判断内核使用的cgroup版本
$ mount | grep cgroup
cgroup2 on /sys/fs/cgroup type cgroup2 (rw,nosuid,nodev,noexec,relatime,nsdelegate)
tmpfs on /usr/local/aegis/cgroup type tmpfs (rw,relatime,size=51200k)
cgroup on /usr/local/aegis/cgroup/cpu type cgroup (rw,relatime,cpu)

如果输出只有cgroup,说明内核还未挂载cgroup v2或者内核不支持cgroup v2

  1. 判断内核是否支持cgroup v2
$ cat /proc/filesystems | grep cgroup
nodev	cgroup
nodev	cgroup2

出现了cgroup v2说明内核是支持的,可以继续接下来的操作

  1. 挂载cgroup v2

对于使用 systemd 引导的系统,可以在引导文件 /etc/default/grubGRUB_CMDLINE_LINUX_DEFAULT中添加如下一行,启用 v2 版本

“systemd.unified_cgroup_hierarchy=yes”

$ sudo vim /etc/default/grub
添加:GRUB_CMDLINE_LINUX_DEFAULT="systemd.unified_cgroup_hierarchy=yes"
$ sudo grub-mkconfig -o /boot/grub/grub.cfg
$ reboot

可以使用cgroup_no_v1 = allows防止cgroup v1抢占所有controller,体验纯cgroup v2环境

最后再进行重启,就可以使用cgroup v2了

2. 初探cgroup v2

查看cgroup2的目录树结构

$ ls /sys/fs/cgroup
cgroup.controllers      cpuset.mems.effective   memory.idle_page_stats.local
cgroup.max.depth        cpu.stat                memory.numa_stat
cgroup.max.descendants  init.scope              memory.pressure
cgroup.procs            io.cost.model           memory.reap_background
cgroup.stat             io.cost.qos             memory.stat
cgroup.subtree_control  io.pressure             memory.use_priority_oom
cgroup.threads          io.stat                 memory.use_priority_swap
cpu.pressure            memory.fast_copy_mm     system.slice
cpuset.cpus.effective   memory.idle_page_stats  user.slice

相比于cgroup v1,v2的目录则显得直接很多,毕竟如果将cgroup v1比作森林的话,cgroup v2就只是一颗参天大树

查看cgroup2可管理的系统资源类型

$ cat cgroup.controllers
cpuset cpu io memory hugetlb pids rdma

查看cgroup2开启的控制器

$ cat cgroup.subtree_control
cpuset cpu io memory pids

在root cgroup下创建一个cgroup

$ mkdir cgrp2test
$ ls cgrp2test
cgroup.controllers      cpu.weight.nice               memory.pressure
cgroup.events           io.bfq.weight                 memory.priority
cgroup.freeze           io.latency                    memory.reap_background
cgroup.max.depth        io.max                        memory.stat
cgroup.max.descendants  io.pressure                   memory.swap.current
cgroup.procs            io.stat                       memory.swap.events
cgroup.stat             io.weight                     memory.swap.high
cgroup.subtree_control  memory.current                memory.swap.max
cgroup.threads          memory.events                 memory.use_priority_oom
cgroup.type             memory.events.local           memory.use_priority_swap
cpu.max                 memory.fast_copy_mm           memory.wmark_high
cpu.pressure            memory.high                   memory.wmark_low
cpuset.cpus             memory.idle_page_stats        memory.wmark_ratio
cpuset.cpus.effective   memory.idle_page_stats.local  memory.wmark_scale_factor
cpuset.cpus.partition   memory.low                    pids.current
cpuset.mems             memory.max                    pids.events
cpuset.mems.effective   memory.min                    pids.max
cpu.stat                memory.numa_stat
cpu.weight              memory.oom.group

查看cgrp2test可用的控制器

$ cat cgroup.controllers 
cpuset cpu io memory pids 

每个child cgroup不会继承其父母的控制器,只有在父节点cgroup.subtree_control显式配置开启的控制器才能在child cgroup中使用。目前cgrp2test可以对cpuset, cpu, io, memroy, pids这些资源进行限制

对cgroup添加cpu资源限制<

<think>好的,我现在需要回答用户关于Docker如何兼容cgroup v1和v2的配置和设置的问题。首先,我需要回忆一下cgroup的基本概念以及Docker在其中的作用。 用户提到Docker兼容cgroup v1和v2,可能想知道如何配置,或者背后的技术原理。根据引用[3],Docker从0.9版本开始使用libcontainer替代LXC,这说明Docker现在主要依赖自己的库来管理容器,包括cgroup。所以,我需要解释Docker如何处理不同版本的cgroup,以及用户如何配置。 首先,cgroupLinux内核功能,用于资源控制。v2是v1的改进版,但两者在结构上有差异。Docker需要兼容两者,可能需要根据宿主机使用cgroup版本来调整配置。 接下来,我需要检查用户提供的引用。引用[2]提到,Docker默认使用bridge网络模式,而网络配置可能涉及cgroup。不过,这可能和网络资源管理有关,但用户的问题更偏向于cgroup版本兼容性。引用[3]提到Docker使用libcontainer,这可能抽象了底层cgroup版本的处理,使得用户无需直接配置。 现在,我需要确定Docker在支持cgroup v1和v2时的具体行为。根据知识,Docker自1.12版本开始实验性支持cgroup v2,而随着systemd和内核的发展,现在主流Linux发行版可能默认使用cgroup v2,比如Fedora 31+、Ubuntu 21.10+等。Docker在运行时应该会自动检测宿主的cgroup版本,并选择合适的驱动。 用户可能想知道如何配置Docker使用特定的cgroup版本。例如,如果系统同时支持v1和v2,如何指定。或者,在升级系统后,如何确保Docker正常工作。这时可能需要调整Docker的配置,比如修改daemon.json文件,设置cgroupdriver为systemd(cgroup v2通常systemd集成更紧密)。 另外,检查Docker的cgroup驱动是否宿主机一致很重要。例如,Kubernetes建议使用systemd作为cgroup驱动,当宿主机使用cgroup v2时,Docker也需要配置为使用systemd驱动。这可以通过在/etc/docker/daemon.json中添加: { "exec-opts": ["native.cgroupdriver=systemd"] } 然后重启Docker服务。 此外,用户可能遇到兼容性问题,比如某些旧版Docker在cgroup v2下无法正常运行,需要升级Docker版本。例如,Docker 20.10及以上版本对cgroup v2的支持更好。 总结回答结构: 1. 解释cgroup v1和v2的区别。 2. Docker如何自动适配不同版本。 3. 配置方法,如设置cgroupdriver。 4. 检查当前系统使用cgroup版本的方法。 5. 常见问题处理,如版本兼容性和驱动配置。 需要确保回答准确,引用相关知识点。比如引用[3]说明Docker使用libcontainer,这可能隐藏了cgroup版本差异,但用户配置时仍需注意驱动设置。可能还要提到在混合环境中如何确保兼容性,或者升级时的注意事项。</think>### Docker对cgroup v1/v2的兼容性配置指南 #### 1. **cgroup版本差异Docker适配原理** cgroup(Control Groups)是Linux内核用于资源限制的核心机制。cgroup v2重构了层级结构,统一了资源控制接口,解决了v1多子系统独立管理的复杂性。Docker通过`libcontainer`库(现为`containerd`运行时组件)自动检测宿主机cgroup版本[^3]。当系统使用cgroup v2时,Docker会默认采用systemd集成的管理模式,无需特殊配置即可兼容[^3]。 #### 2. **检查当前cgroup版本** 执行以下命令确认系统使用cgroup版本: ```bash cat /sys/fs/cgroup/cgroup.controllers ``` - 若输出包含`cpu`、`memory`等控制器,则为**cgroup v2** - 若无输出或报错,则为**cgroup v1** #### 3. **Docker配置cgroup驱动** Docker的cgroup驱动需容器运行时(如Kubernetes)保持一致。**编辑`/etc/docker/daemon.json`**: ```json { "exec-opts": ["native.cgroupdriver=systemd"] # 适用于cgroup v2或systemd主导的环境 } ``` 重启服务生效: ```bash systemctl restart docker ``` #### 4. **cgroup v2的兼容性要求** - **Docker版本**:需≥20.10(完整支持cgroup v2) - **内核版本**:Linux≥5.4(推荐5.10+) - **系统发行版**:Ubuntu 21.10+/Fedora 31+/RHEL 9+等已默认启用cgroup v2 #### 5. **混合环境处理** 若宿主机强制使用cgroup v1(如旧版Kubernetes),可通过内核参数**临时切换**: ```bash grubby --update-kernel=ALL --args="systemd.unified_cgroup_hierarchy=0" reboot ``` #### 6. **验证配置** 检查Docker运行时信息: ```bash docker info | grep -i cgroup ``` 输出示例: ``` Cgroup Driver: systemd Cgroup Version: 2 ``` #### 7. **常见问题** - **问题1**:容器启动失败并报错`cgroup: cgroup2: unknown parameter` - **解决**:升级Docker至20.10+或回退到cgroup v1[^3] - **问题2**:Kubernetes节点状态为`NotReady` - **解决**:确保Kubelet的`--cgroup-driver`参数Docker一致[^4] ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

Hack Rabbit

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值