【访问控制】cgroup限制磁盘读写

发布时间 2023-10-07 16:04:04作者: Luxf0

一、前言

参考链接:
Cgroup - Linux的IO资源隔离
用 cgroups 管理进程磁盘 io

二、blkio配置

blkio是cgroup中的一个子系统,可以用于限制及监控磁盘读写io
blkio控制子系统可以限制进程读写的 IOPS 和吞吐量,但它只能对 Direct I/O 的文件读写进行限速,对 Buffered I/O 的文件读写无法限制
Buffered I/O 指会经过 PageCache 然后再写入到存储设备中。这里面的 Buffered 的含义跟内存中 buffer cache 不同,这里的 Buffered 含义相当于内存中的buffer cache+page cache。

1、限制磁盘读写io

blkio涉及限制磁盘读写io的配置文件主要有以下几个,通用echo指定磁盘设备号及数值实现限制磁盘读写io

root@node197:~# ll /sys/fs/cgroup/blkio/
-rw-r--r--   1 root root   0 Mar  4 03:00 blkio.throttle.read_bps_device
-rw-r--r--   1 root root   0 Mar  4 03:00 blkio.throttle.read_iops_device
-rw-r--r--   1 root root   0 Mar  4 06:21 blkio.throttle.write_bps_device
-rw-r--r--   1 root root   0 Mar  4 03:00 blkio.throttle.write_iops_device

通用格式

echo "<disk-number> <io-value>"  > /sys/fs/cgroup/blkio/<io-type>
  • disk-number:指定需要限制的磁盘编号,可通过ll /dev/block/ | grep sdb查看对应磁盘编号,如8:16
  • io-value:指定需要限制的io数值(数值为0表示不限制),当指定的文件名称为blkio.throttle.write_bps_device,则表示限制写入带宽,单位为B/s
  • io-type:指定需要限制的io类型
    • blkio.throttle.write_bps_device:磁盘写入带宽限制
    • blkio.throttle.write_iops_device:磁盘写入IOPS限制
    • blkio.throttle.read_bps_device:磁盘读取带宽限制
    • blkio.throttle.read_iops_device:磁盘读取IOPS限制

参考示例

  • 查看sdb磁盘对应编号为8:16
[root@node189 ~]# ll /dev/block/ | grep sdb
lrwxrwxrwx 1 root root 6 Mar  4 14:29 8:16 -> ../sdb
  • 限制sdb磁盘写入带宽为1MB/s
[root@node189 ~]# echo "8:16 1048576" >> /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
  • 指定directio测试sdb磁盘写入性能,当前成功限制为1MB/s
[root@node189 ~]# cat /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
8:16 1048576
[root@node189 ~]# dd if=/dev/zero of=/dev/sdb bs=1M count=1000 oflag=direct
^C64+0 records in
64+0 records out
67108864 bytes (67 MB) copied, 64.0199 s, 1.0 MB/s
  • 解除sdb磁盘写入限制
[root@node189 ~]# echo "8:16 0" >> /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
[root@node189 ~]# cat /sys/fs/cgroup/blkio/blkio.throttle.write_bps_device
[root@node189 ~]# dd if=/dev/zero of=/dev/sdb bs=1M count=1000 oflag=direct
1000+0 records in
1000+0 records out
1048576000 bytes (1.0 GB) copied, 21.9032 s, 47.9 MB/s