无法写入 cgroup blkio 文件

use*_*905 2 io operating-system linux-kernel cgroups

我正在尝试使用cgroup blkio控制器来控制 I/O 带宽。

Cgroup已经设置并挂载成功,即调用 grep cgroup /proc/mounts

返回:

....
cgroup /sys/fs/cgroup/blkio cgroup rw,relatime,blkio 0 0
...
Run Code Online (Sandbox Code Playgroud)

然后我在blkio文件夹中创建一个新文件夹并写入文件blkio.throttle.read_bps_device,如下所示:

1. mkdir user1; cd user1
2. echo "8:5 10485760" > blkio.throtlle.read_bps_device
----> echo: write error: Invalid argument
Run Code Online (Sandbox Code Playgroud)

我的设备主要:次要编号在使用df -hls -l /dev/sda5用于存储设备时是正确的。

而且我仍然可以写入不需要设备主要:次要编号的文件,例如blkio.weight(但会引发相同的错误blkio.weigth_device

知道为什么我收到那个错误吗?

ask*_*skb 6

不确定您使用的是哪种风格/版本的 Linux,在 RHEL 6.x 内核上,由于某种原因这不起作用,但是当我在 RHEL 和其他 Fedora 版本上编译自定义内核时它没有任何问题。

要检查您的内核是否支持,请运行lssubsys -am | grep blkio. 如果可以归档文件,请检查路径blkio.throttle.read_bps_device

但是,这里是一个如何持久执行此操作的示例,设置 cgroups 以限制程序不超过 1 Mibi/s:

  1. 获取 MARJOR:MINOR 设备号 /proc/partitions
   `cat /proc/partitions | grep vda` 
     major minor  #blocks  name
     252        0   12582912 vda  --> this is the primary disk (with MAJOR:MINOR -> 8:0)
Run Code Online (Sandbox Code Playgroud)
  1. 现在,如果您想将程序限制为 1mib/s(将值转换为 bytes/s),如下所示。=> 1MiB/s => 1024 kiB/1MiB * 1024 B/s = 1048576 字节/秒

  2. 编辑 /etc/cgconfig.conf 并添加以下条目

group ioload {
  blkio.throttle.read_bps_device = "252:0 1048576" 
  }
}
Run Code Online (Sandbox Code Playgroud)
  1. 编辑 /etc/cgrules.conf

*: blkio ioload

  1. 重新启动所需的服务
`chkconfig {cgred,cgconfig} on;`
`service {cgred,cgconfig} restart`
Run Code Online (Sandbox Code Playgroud)

参考:blkio-controller.txt

希望这可以帮助!

  • 问题是我使用 /dev/sda5 作为设备名称,而实际上必须使用*物理设备名称*(与分区的逻辑设备相反)。当我指定 /dev/sda 的 <major>:<minor> id 时,它现在可以工作 (3认同)
  • `lssubsys` 命令对于了解我的内核是否支持该功能非常有用。谢谢! (2认同)