cgroup-blkio子系统分析

本文详细介绍了Linux Cgroup中的blkio子系统,用于控制磁盘I/O带宽。内容包括概述、blkcg文件接口和实现,重点分析了基于权重的weight控制方式和基于绝对带宽的Iops、bps控制策略。weight控制依赖于CFQ调度器,而Iops和bps控制则在块层实现,与调度算法无关,适用于更广泛的场景。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1      概述

Cgroup中的blkio子系统的主要功能是实现对磁盘i/o带宽的可定制化控制。目前支持的控制策略只要有两种:BLKIO_POLICY_PROP和BLKIO_POLICY_THROTL,即基于权重方式和基于流量方式。权重方式依赖于内核原生的CFQ i/o调度算法,i/o调度算法本身是工作在i/o调度层的,因此在使用上有一定的局限性,即被控制的设备必须使用cfq调度算法;为了弥补这方面的局限性,内核后来引入了基于内核 iothrottle的基于绝对流量的控制策略(虽然也有基于cfq的iops绝对控制,但是性能不佳),同时它还分为基于bps和iops的子策略类型,它工作在通用块层,与调度算法无关,因此具有更广的使用范围,但是绝对流量的策略是一种硬性限制,也有一定的弊端,即对io带宽的利用率上存在一定的问题,不能像权重控制那样将带宽使用率最大化。

2      blkcg文件接口

blk_cgroup文件系统主要提供以下文件共用户进行流量和权重控制

流量:

blkio.throttle.read_bps_device 限制对某块设备读带宽

blkio.throttle.read_iops_device 限制对某块设备读的次数

blkio.throttle.write_bps_device 限制对某块设备写带宽

blkio.throttle.write_iops_device 限制对某块设备写的次数

权重:

blkio.weight  本cgroup在系统内的权重[101000]

blkio.weight_device 本cgroup对应某设备的权重[10 10

### 关于Docker中OCI运行时执行失败的问题 当遇到 `OCI runtime exec failed` 错误并提示 `error adding pid to cgroups no such file or directory` 时,这通常表明 Docker 的 cgroup 配置存在问题。以下是可能的原因以及解决方案: #### 原因分析 1. **Cgroup 文件缺失** 如果系统的 cgroup 文件被意外删除或未正确挂载,则可能导致此错误。Linux 内核依赖这些文件来管理进程组的资源分配[^1]。 2. **Docker 版本兼容性问题** 不同版本的 Docker 对 cgroup 的支持可能存在差异。如果系统内核较旧而使用了较新的 Docker 版本,可能会引发不兼容问题[^2]。 3. **存储驱动冲突** 某些情况下,Docker 使用的存储驱动(如 overlay2 或 devicemapper)与当前环境存在冲突,也可能间接影响到 cgroup 的正常工作[^3]。 --- ### 解决方案 #### 方法一:重新挂载 Cgroup 文件系统 确保 cgroup 文件已正确挂载至 `/sys/fs/cgroup/` 路径下。可以通过以下命令验证和修复: ```bash mount -t tmpfs cgroup_root /sys/kernel/debug/tracing/ ``` 随后重启 Docker 服务以应用更改: ```bash systemctl restart docker ``` #### 方法二:升级或降级 Docker 版本 确认当前操作系统内核版本是否满足所安装 Docker 版本的要求。例如,在 CentOS 7 中推荐使用稳定版 Docker CE (Community Edition),可通过以下方式查询可用版本并安装适合的版本: ```bash yum list --showduplicates docker-ce yum install docker-ce-<specific_version> ``` 其中 `<specific_version>` 应替换为经过测试稳定的版本号[^2]。 #### 方法三:清理残留数据后再重装 Docker 有时卸载过程中未能彻底清除相关配置文件也会引起此类异常。建议按照如下步骤操作: 1. 删除现有 Docker 数据及相关目录: ```bash yum remove docker-ce rm -rf /var/lib/docker ``` 2. 安装最新版本 Docker 并初始化设置: ```bash yum install docker-ce systemctl start docker ``` #### 方法四:调整启动参数优化 Cgroup 设置 编辑 Docker 启动脚本,显式指定所需的 cgroup 系统路径。修改 `/etc/systemd/system/multi-user.target.wants/docker.service` 文件中的 ExecStart 行,添加额外选项: ```ini ExecStart=/usr/bin/dockerd --exec-opt native.cgroupdriver=systemd ``` 完成编辑后刷新 systemd 缓存并重启服务: ```bash systemctl daemon-reload systemctl restart docker ``` --- ### 总结 通过以上方法可有效排查并解决由于 cgroup 配置不当引起的 OCI 运行时错误。具体实施需依据实际场景灵活选用合适策略。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值