cgroup blkio测试
一、准备
术语
- IOPS, Input/Output Per Second, 每秒钟磁盘IO次数。
- bps, Byte Per Second, 每秒种磁盘读写数据量。
内核配置要求
首先内核配置必须要满足如下要求:
CONFIG_BLK_CGROUP=y CONFIG_BLK_DEV_THROTTLING=y
配置在/boot/config-XXX文件,例如:/boot/config-3.10.0-957.el7.x86_64
查询磁盘设备号
使用 ls -l 命令,或者 lsblk 命令。例如,下图中/dev/sda1的设备号(major:minor)为 8:1 。
或者使用其它方法获取,例如:
- snippet.bash
[root@yz219 blkio]# cat /proc/partitions major minor #blocks name 8 0 209715200 sda 8 1 1048576 sda1 8 2 208665600 sda2 11 0 4391936 sr0 253 0 52428800 dm-0 253 1 5111808 dm-1 253 2 151117824 dm-2
准备cgroup
假设blkio挂载点在:
- snippet.bash
[yz@yz219 blkio]$ pwd /sys/fs/cgroup/blkio
准备测试将使用的层级:
- snippet.bash
[yz@yz219 blkio]$ sudo mkdir yz [yz@yz219 blkio]$ sudo chown yz:yz -R yz [yz@yz219 blkio]$ cd yz/ [yz@yz219 yz]$ mkdir 1 [yz@yz219 yz]$ mkdir 2 [yz@yz219 yz]$ ll drwxrwxr-x 2 yz yz 0 6月 21 09:38 1 drwxrwxr-x 2 yz yz 0 6月 21 09:38 2 …… -r--r--r-- 1 yz yz 0 6月 21 09:37 blkio.throttle.io_service_bytes -r--r--r-- 1 yz yz 0 6月 21 09:37 blkio.throttle.io_serviced -rw-r--r-- 1 yz yz 0 6月 21 09:37 blkio.throttle.read_bps_device -rw-r--r-- 1 yz yz 0 6月 21 09:37 blkio.throttle.read_iops_device -rw-r--r-- 1 yz yz 0 6月 21 09:37 blkio.throttle.write_bps_device -rw-r--r-- 1 yz yz 0 6月 21 09:37 blkio.throttle.write_iops_device -rw-r--r-- 1 yz yz 0 6月 21 09:37 cgroup.clone_children -rw-r--r-- 1 yz yz 0 6月 21 09:37 cgroup.procs -rw-r--r-- 1 yz yz 0 6月 21 09:37 tasks
清缓存
在每次IO读写之前必须清理缓存:
- snippet.bash
sync echo 3 > /proc/sys/vm/drop_caches
二、测试
本文以rhel-home设备为例,设备号为253:2。
全系统限制测试
全系统限制设备的bps读速率为1M/s:
- snippet.bash
[root@yz219 ~]# cd /sys/fs/cgroup/blkio [root@yz219 blkio]# echo "253:2 1048576" > blkio.throttle.read_bps_device [root@yz219 blkio]# cat blkio.throttle.read_bps_device 253:2 1048576
dd读盘:
- snippet.bash
# 准备一个24M的文件: [root@yz219 blkio]# ll -h /home/yz/customer.tbl -rwxr-xr-x 1 root root 24M 6月 21 10:07 /home/yz/customer.tbl # 为保证测试准确,务必清缓存: [root@yz219 blkio]# sync [root@yz219 blkio]# echo 3 > /proc/sys/vm/drop_caches # dd读文件 [root@yz219 blkio]# dd if=/home/yz/customer.tbl of=/dev/null bs=1M count=512 记录了23+1 的读入 记录了23+1 的写出 24196144字节(24 MB)已复制,23.3716 秒,1.0 MB/秒
进程限速
使用以下资源组做测试:
- snippet.bash
# 先解除全系统的限制: [root@yz219 blkio]# pwd /sys/fs/cgroup/blkio [root@yz219 blkio]# echo "253:2 0" > blkio.throttle.read_bps_device [root@yz219 blkio]# cat blkio.throttle.read_bps_device # 在资源组1做限制: [root@yz219 blkio]# cd yz/1 [root@yz219 1]# pwd /sys/fs/cgroup/blkio/yz/1 [root@yz219 1]# echo "253:2 1048576" > blkio.throttle.read_bps_device [root@yz219 1]# cat blkio.throttle.read_bps_device 253:2 1048576
准备一个测试脚本:
- snippet.bash
[root@yz219 1]# vim ~/ioblk_demo.sh sync echo 3 > /proc/sys/vm/drop_caches dd if=/home/yz/customer.tbl of=/dev/null bs=1M count=512 & echo $! > /sys/fs/cgroup/blkio/yz/1/tasks
执行脚本,大约24秒后会在终端输出dd结果:
- snippet.bash
[root@yz219 1]# ~/ioblk_demo.sh [root@yz219 1]# 记录了23+1 的读入 记录了23+1 的写出 24196144字节(24 MB)已复制,23.0069 秒,1.1 MB/秒 ^C
在脚本执行过程中,我们可以检查以下资源组1中的PID是否为预期值:
- snippet.bash
[root@yz219 ~]# cat /sys/fs/cgroup/blkio/yz/1/cgroup.procs 68246 [root@yz219 ~]# cat /sys/fs/cgroup/blkio/yz/1/tasks 68246 [root@yz219 ~]# ps ux | grep customer.tbl root 68246 0.0 0.0 109132 1408 pts/4 D 10:35 0:00 dd if=/home/yz/customer.tbl of=/dev/null bs=1M count=512
三、参考
打赏作者以资鼓励: