为什么cgroup blkio不能限制分区

本文涉及的产品
云数据库 Tair(兼容Redis),内存型 2GB
Redis 开源版,标准版 2GB
推荐场景:
搭建游戏排行榜
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
简介: 在使用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

目录
相关文章
|
弹性计算 NoSQL 关系型数据库
又降价啦!2024年阿里云核心产品价格全线下调,最高幅度达55%
2024年3月1日开始,阿里云将开启新一轮的降价政策,核心产品价格全线下调,平均降幅20%,最高幅度达55%,阿里云希望通过此次大规模降价,让更多企业和开发者用上先进的公共云服务,加速云计算在中国各行各业的普及和发展。
又降价啦!2024年阿里云核心产品价格全线下调,最高幅度达55%
|
3月前
|
消息中间件 存储 Java
第15课: Spring Boot中集成ActiveMQ
第15课: Spring Boot中集成ActiveMQ
335 0
|
弹性计算 中间件 大数据
什么是容器计算服务 ACS?
全球首款容器计算服务ACS(Alibaba Cloud Container Compute Service)
1011 2
|
存储 缓存 NoSQL
Shiro 解决分布式 Session
在分布式系统中,会话管理是一个重要的问题。Shiro框架提供了一种解决方案,通过其会话管理组件来处理分布式会话。本文演示通过RedisSessionManager解决分布式会话问题。
233 0
|
Shell
我来教你如何将cpu使用率up起来(shell脚本[含注释])
我来教你如何将cpu使用率up起来(shell脚本[含注释])
1145 0
|
数据可视化 Linux Docker
Linux系统使用Docker部署Dashy导航页服务并实现公网环境访问
Linux系统使用Docker部署Dashy导航页服务并实现公网环境访问
253 4
|
JavaScript 前端开发 Java
JavaScript的数学计算库:decimal.js
JavaScript的数学计算库:decimal.js
474 0
|
数据可视化 TensorFlow 算法框架/工具
JAX 中文文档(三)(2)
JAX 中文文档(三)
280 0
|
机器学习/深度学习
【DR_CAN-MPC学习笔记】2.最优化数学建模推导
【DR_CAN-MPC学习笔记】2.最优化数学建模推导
|
Linux API C语言
cgroup V1和V2的原理和区别
cgroup V1和V2的原理和区别