为什么cgroup blkio不能限制分区

简介: 在使用cgroup blkio子系统限制块设备的IOPS时,有没有遇到过这样的错误? #echo "8:1 10000" >./blkio.throttle.write_iops_device bash: echo: write error: No such device 当

在使用cgroup blkio子系统限制块设备的IOPS时,有没有遇到过这样的错误?

#echo "8:1 10000" >./blkio.throttle.write_iops_device 
bash: echo: write error: No such device

当限制的块设备不是设备本身时(而是分区),会报错。

那么是什么原因造成的呢?

例子

系统中有一个sda的盘,这个盘分了5个区。

#ll /dev/sd*
brw-rw---- 1 root disk 8, 0 Aug  6 13:09 /dev/sda
brw-rw---- 1 root disk 8, 1 Aug  6 13:09 /dev/sda1
brw-rw---- 1 root disk 8, 2 Aug  6 13:09 /dev/sda2
brw-rw---- 1 root disk 8, 3 Aug  6 13:09 /dev/sda3
brw-rw---- 1 root disk 8, 4 Aug  6 13:09 /dev/sda4
brw-rw---- 1 root disk 8, 5 Aug  6 13:09 /dev/sda5

对整盘进行IOPS限制,正常

#echo "8:0 10000" >./blkio.throttle.write_iops_device 

对单个分区进行IOPS限制,失败

#echo "8:1 10000" >./blkio.throttle.write_iops_device 
bash: echo: write error: No such device

查看了cgroup的代码,发现了问题在blkio_policy_parse_and_set这里,如果发现不是块设备本身,而是分区,则报错。

kernel-2.6.32 / block / blk-cgroup.c

...
static int blkio_policy_parse_and_set(char *buf,
    struct blkio_policy_node *newpn, enum blkio_policy_id plid, int fileid)
{
...
    dev = MKDEV(major, minor);

    disk = get_gendisk(dev, &part);
    if (!disk || part) {
        ret = -ENODEV;
        goto out;
    }
...

get_gendisk的帮助手册如下

man get_gendisk

Name

get_gendisk — get partitioning information for a given device

Synopsis

struct gendisk * get_gendisk (    dev_t devt,
     int * partno);
 
Arguments

devt
device to get partitioning information for

partno
returned partition index

Description

This function gets the structure containing partitioning information for the given device devt.

知道原因之后就好理解了,还好cgroup blkio子系统支持device map设备,所以如果你要对单个分区进行IOPS的限制,可以用LVM做一层,就可以限制了。

例如

pvcreate /dev/sdb
vgcreate vgdata01 /dev/sdb
lvcreate -n lv01 -l 50%VG vgdata01 
lvcreate -n lv02 -l 40%VG vgdata01 

#dmsetup ls
vgdata01-lv02   (253, 1)
vgdata01-lv01   (253, 0)

#echo "253:1 10000" >./blkio.throttle.write_iops_device 

参考

1. https://www.kernel.org/doc/Documentation/devices.txt

目录
相关文章
|
弹性计算 中间件 大数据
什么是容器计算服务 ACS?
全球首款容器计算服务ACS(Alibaba Cloud Container Compute Service)
1411 2
|
存储 缓存 NoSQL
Shiro 解决分布式 Session
在分布式系统中,会话管理是一个重要的问题。Shiro框架提供了一种解决方案,通过其会话管理组件来处理分布式会话。本文演示通过RedisSessionManager解决分布式会话问题。
444 0
|
数据可视化
mac环境下graphviz安装及使用
mac环境下graphviz安装及使用
4623 0
mac环境下graphviz安装及使用
|
5月前
|
JSON IDE API
从源码看 Qwen Code 的设计思路
Qwen Code 是基于AI Agent的智能编程助手,采用模块化分层架构。其核心为可循环执行的Agent对话机制,协调用户输入、大模型推理与工具调用,支持Plan/Default/Auto-edit/YOLO四种执行模式,并集成子智能体、MCP协议及会话管理等服务。本文将从源码角度来解析其设计思路。
1125 7
|
存储 监控 Linux
在Linux中,可以使用哪个命令查看系统的历史负载?
在Linux中,可以使用哪个命令查看系统的历史负载?
|
存储 供应链 安全
区块链在供应链管理中的创新应用与前景
区块链在供应链管理中的创新应用与前景
501 1
|
JavaScript 前端开发 Java
JavaScript的数学计算库:decimal.js
JavaScript的数学计算库:decimal.js
819 0
|
机器学习/深度学习
【DR_CAN-MPC学习笔记】2.最优化数学建模推导
【DR_CAN-MPC学习笔记】2.最优化数学建模推导
|
开发者 Windows
.NET 开源扁平化、美观的 C/S 控件库
【10月更文挑战第23天】介绍了三款适用于 .NET 平台的开源扁平化、美观的 C/S 控件库:MaterialSkin 采用 Google Material Design 风格,适合现代感界面;Krypton Toolkit 提供丰富控件,界面易于定制;Fluent Ribbon Control Suite 模仿 Office 界面,适合复杂功能应用。每款控件库均附有示例代码及 GitHub 链接。
1088 0
|
数据可视化 TensorFlow 算法框架/工具
JAX 中文文档(三)(2)
JAX 中文文档(三)
549 0

热门文章

最新文章