Linux资源管理-IO优先级 使用cgroub控制进程优先级 cgroup blkio子系统

如果想要控制进程IO的优先级,需要内核支持,编译器需要开启以下两个参数

CONFIG_BLK_CGROUP=y
CONFIG_CFQ_GROUP_IOSCHED=y

查看方式

[root@localhost ~]# grep -i 'cfq_group' /boot/config-`uname -r`
CONFIG_CFQ_GROUP_IOSCHED=y
[root@localhost ~]# grep -i 'blk_cgroup' /boot/config-`uname -r`
CONFIG_BLK_CGROUP=y

如果这两项都没开启, 需要重新编译内核再重新打开了

再通过 /proc/cgroups 查看 blkio 是否已经打开

[root@localhost ~]# cat /proc/cgroups
#subsys_name    hierarchy       num_cgroups     enabled
cpuset  7       1       1
cpu     11      1       1
cpuacct 11      1       1
blkio   3       1       1
memory  6       68      1
devices 12      33      1
freezer 5       1       1
net_cls 4       1       1
perf_event      10      1       1
net_prio        4       1       1
hugetlb 9       1       1
pids    2       40      1
rdma    8       1       1

这里enabled=1表示已经打开了,如果blkio没哟启用,可以通过grub设置启动参数来启动它

如何测试io的优先级

1 进入cgroup blkio子系统资源组
2 建立2个cgroup资源组,分为A和B,
3 默认情况下,2 个 group资源组中的dd同时进行文件操作,
4 查看默认情况下,2个dd同时完成需要的时间,
5 设置资源组A的权重为100,资源组B的权重为1000 (权重越大表示进行I/O的优先级越高)
6 同时在2个group资源组中进行dd操作,
7 再次查看比较两个资源组A和B的dd进程完成时间

操作流程
1 查看当前系统关于cgroup文件系统,并进入blkio子系统

[root@localhost ~]# mount| grep cgroup
tmpfs on /sys/fs/cgroup type tmpfs (ro,nosuid,nodev,noexec,mode=755)
cgroup on /sys/fs/cgroup/systemd type cgroup (rw,nosuid,nodev,noexec,relatime,xattr,release_agent=/usr/lib/systemd/systemd-cgroups-agent,name=systemd)
cgroup on /sys/fs/cgroup/pids type cgroup (rw,nosuid,nodev,noexec,relatime,pids)
cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)
cgroup on /sys/fs/cgroup/net_cls,net_prio type cgroup (rw,nosuid,nodev,noexec,relatime,net_cls,net_prio)
cgroup on /sys/fs/cgroup/freezer type cgroup (rw,nosuid,nodev,noexec,relatime,freezer)
cgroup on /sys/fs/cgroup/memory type cgroup (rw,nosuid,nodev,noexec,relatime,memory)
cgroup on /sys/fs/cgroup/cpuset type cgroup (rw,nosuid,nodev,noexec,relatime,cpuset)
cgroup on /sys/fs/cgroup/rdma type cgroup (rw,nosuid,nodev,noexec,relatime,rdma)
cgroup on /sys/fs/cgroup/hugetlb type cgroup (rw,nosuid,nodev,noexec,relatime,hugetlb)
cgroup on /sys/fs/cgroup/perf_event type cgroup (rw,nosuid,nodev,noexec,relatime,perf_event)
cgroup on /sys/fs/cgroup/cpu,cpuacct type cgroup (rw,nosuid,nodev,noexec,relatime,cpu,cpuacct)
cgroup on /sys/fs/cgroup/devices type cgroup (rw,nosuid,nodev,noexec,relatime,devices)
cgroup on /mnt/cgroup type cgroup (rw,relatime,blkio)

blkio子系统资源组,blkio子系统是用于限制块设备I/O操作速率

cgroup on /sys/fs/cgroup/blkio type cgroup (rw,nosuid,nodev,noexec,relatime,blkio)

2 在对应的子系统通过mkdir创建资源组,rmdir可将对应的资源组删除,通过将进程pid加入到资源组目录下的tasks文件的方式把某个模块加入到对应的资源组

注意:关于资源组中一些文件这里做解释一下

[root@localhost blkio]# ll
total 0
drwxr-xr-x 2 root root 0 Jul 20 16:43 A
drwxr-xr-x 2 root root 0 Jul 20 16:43 B
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.bfq.io_service_bytes
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.bfq.io_service_bytes_recursive
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.bfq.io_serviced
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.bfq.io_serviced_recursive
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.io_merged
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.io_merged_recursive
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.io_queued
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.io_queued_recursive
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.io_service_bytes
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.io_service_bytes_recursive
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.io_serviced
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.io_serviced_recursive
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.io_service_time
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.io_service_time_recursive
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.io_wait_time
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.io_wait_time_recursive
-rw-r--r-- 1 root root 0 Jul 20 16:42 blkio.leaf_weight
-rw-r--r-- 1 root root 0 Jul 20 16:42 blkio.leaf_weight_device
--w------- 1 root root 0 Jul 20 16:42 blkio.reset_stats
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.sectors
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.sectors_recursive
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.throttle.io_service_bytes
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.throttle.io_service_bytes_recursive
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.throttle.io_serviced
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.throttle.io_serviced_recursive
-rw-r--r-- 1 root root 0 Jul 20 16:42 blkio.throttle.read_bps_device
-rw-r--r-- 1 root root 0 Jul 20 16:42 blkio.throttle.read_iops_device
-rw-r--r-- 1 root root 0 Jul 20 16:42 blkio.throttle.write_bps_device
-rw-r--r-- 1 root root 0 Jul 20 16:42 blkio.throttle.write_iops_device
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.time
-r--r--r-- 1 root root 0 Jul 20 16:42 blkio.time_recursive
-rw-r--r-- 1 root root 0 Jul 20 16:42 blkio.weight
-rw-r--r-- 1 root root 0 Jul 20 16:42 blkio.weight_device
-rw-r--r-- 1 root root 0 Jul 20 16:42 cgroup.clone_children
-rw-r--r-- 1 root root 0 Jul 20 16:42 cgroup.procs
-r--r--r-- 1 root root 0 Jul 20 16:42 cgroup.sane_behavior
-rw-r--r-- 1 root root 0 Jul 20 16:42 notify_on_release
-rw-r--r-- 1 root root 0 Jul 20 16:42 release_agent
-rw-r--r-- 1 root root 0 Jul 20 16:42 tasks

文件 blkio.weight 

资源组中的文件 blkio.weight 表示权重,这个值的范围是 100 ~ 1000,值越大则IO的优先级越高,默认是500,其中新的资源组 A和B的blkio.weight的值都为默认值500

文件 tasks

控制具体使用哪个资源组来进行I/O操作,如果将进程PID写到A资源组,则使用资源组A来实现I/O操作,再通过设置资源组的权重来比较进程调度的优先级

测试文件如下:

#!/bin/bash
####################################################################
# 1. 创造1个测试文件, 大小为1G
# 2. 将当前进程加入到指定 cgroup blkio子系统资源组
# 3. 执行 dd 操作
# 4. 删除 测试文件
# 5. 显示log
####################################################################

function usage()
{
    echo "./blkio-test.sh <group1> <group2>"
    exit 1
}

if [ $# != 2 ]; then
    usage
fi

group_src=~/group.src

group1_log=/tmp/group1.log
group2_log=/tmp/group2.log

group1=$1
group2=$2

echo "生成测试数据 $group_src (大小是1G)"
dd if=/dev/zero of=$group_src count=1024 bs=1M

echo "同时在 $group1$group2 中开始 dd 测试"
echo 3 > /proc/sys/vm/drop_caches
echo $$ >> $group1/tasks
(date; dd if=$group_src of=/dev/null; date;) > $group1_log 2>&1 &

echo $$ >> $group2/tasks
(date; dd if=$group_src of=/dev/null; date;) > $group2_log 2>&1 &

wait
echo "测试完成!"

echo "开始清除测试文件"
rm -rf $group_src
echo "测试文件清除完成"

echo "------------------------------------------"
echo "显示group1 的log"
cat $group1_log

echo "------------------------------------------"
echo "显示group2 的log"
cat $group2_log

echo "------------------------------------------"

实现结果:
1 首先使用默认权重500,查看关于I/O调度优先级,

[root@localhost ~]# ./1.sh /sys/fs/cgroup/blkio/A/ /sys/fs/cgroup/blkio/B
生成测试数据 /root/group.src (大小是1G)
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 3.35757 s, 320 MB/s
同时在 /sys/fs/cgroup/blkio/A//sys/fs/cgroup/blkio/B 中开始 dd 测试
测试完成!
开始清除测试文件
测试文件清除完成
------------------------------------------
显示group1 的log
Tue Jul 21 16:18:10 CST 2020
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 3.16103 s, 340 MB/s
Tue Jul 21 16:18:23 CST 2020
------------------------------------------
显示group2 的log
Tue Jul 21 16:18:10 CST 2020
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 3.16101 s, 340 MB/s
Tue Jul 21 16:18:23 CST 2020
------------------------------------------,

2 将资源组A的权重设置为100,将资源组B的权重设置为1000,再调用测试文件,查看dd相同大小的块资源组A和B的时间

[root@localhost ~]# vim /sys/fs/cgroup/blkio/A/blkio.weight
[root@localhost ~]# vim /sys/fs/cgroup/blkio/B/blkio.weight
[root@localhost ~]# ./1.sh /sys/fs/cgroup/blkio/A/ /sys/fs/cgroup/blkio/B
生成测试数据 /root/group.src (大小是1G)
1024+0 records in
1024+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 3.00457 s, 357 MB/s
同时在 /sys/fs/cgroup/blkio/A//sys/fs/cgroup/blkio/B 中开始 dd 测试
测试完成!
开始清除测试文件
测试文件清除完成
------------------------------------------
显示group1 的log
Tue Jul 21 16:23:19 CST 2020
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 2.7415 s, 392 MB/s
Tue Jul 21 16:23:31 CST 2020
------------------------------------------
显示group2 的log
Tue Jul 21 16:23:19 CST 2020
2097152+0 records in
2097152+0 records out
1073741824 bytes (1.1 GB, 1.0 GiB) copied, 2.69067 s, 399 MB/s
Tue Jul 21 16:23:31 CST 2020
------------------------------------------

由上面结果可以看出来,dd 1G大小的文件时,在不同资源组A和B权重均为默认值500时,所需时间一致,当修改资源组A的权重为100,B的权重为1000时,此时资源组B的耗时比A低,
也就说明系统I/O操作的优先级会根据权重设置的不同而不同

  • 2
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 5
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 5
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值