我无法让 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 之外运行它们时的结果相同。如果我在或cgroup 中执行此操作echo 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 节流是否仅在根级别起作用?手册页似乎没有提到这一点。
答案1
我从这个问题的答案中了解到问题,内核缓冲绕过了 blkio 系统。使用fio
无缓冲和 directio,我能够将设备的 iops 限制为每秒 10 次,使用echo 8:32 10 > /sys/fs/cgroup/blkio/user.slice/blkio.throttle.{read|write}_iops_device
答案2
我得到了和你相同的结果,但发现如果我使用
blkio.throttle.{读取|写入}_bps_device
当设备用作文件系统时,这将限制吞吐量。