我无法让 cgroup blkio 限制子 cgroup 中进程的 iops。我正在使用 CentOS 7、3.10.0-229。我创建了 cgroup /sys/fs/cgroup/blkio/user.slice/test1 并做
echo 8:32 10 > /sys/fs/cgroup/blkio/user.slice/test1/blkio.throttle.read_iops_device
对于 write_iops_device 也是如此。8:32 对应于 /dev/sdc 的 HDD。然后我使用 stress-ng 在 /srv/hdd-c 读取和写入驱动器
cgexec -g blkio:user.slice/test1 stress-ng --temp-path /srv/hdd-c --hdd 15 -t 180
和
cgexec -g blkio:user.slice/test1 stress-ng --temp-path /srv/hdd-c --readahead 15 -t 180
我确认启动的 30 个进程正在 blkio:user.slice/test1 cgroup 中运行,使用ps eo pid,user,args,cgroup
.
当我执行iostat 5
sdc 的 tps 数为 400 到 600 时,这与我在 test1 cgroup 之外运行它们时相同。如果我这样做并在or cgroupecho 8:32 10 > /sys/fs/cgroup/blkio/user.slice/blkio.throttle.{read|write}_iops_device
中运行它们,我会得到相同的结果。但是,如果我在 blkio 的根目录下使用,然后运行 stress-ng 进程,则显示 sdc 的 tps 为 10-11。user.slice
user.slice/test1
echo 8:32 10 > /sys/fs/cgroup/blkio/blkio.throttle.{read|write}_iops_device
iostat 5
blkio 节流仅在根级别有效吗?手册页似乎没有暗示这一点。
所以我从这个问题的答案中了解到的问题是内核缓冲绕过了 blkio 系统。在没有缓冲和方向的情况下使用
fio
我能够将设备的 iops 限制为每秒 10 次使用echo 8:32 10 > /sys/fs/cgroup/blkio/user.slice/blkio.throttle.{read|write}_iops_device
我得到了和你一样的结果,但发现如果我使用
blkio.throttle.{read|write}_bps_device
当设备用作文件系统时,这将限制吞吐量。