zoukankan      html  css  js  c++  java
  • Linux资源管理-IO优先级

    前一篇博客介绍了利用 cgroup 来控制进程的 CPU和内存使用情况, 这次补上使用 cgroup 来控制进程的IO优先级的方法.

    前提条件

    如果想控制进程的IO优先级, 需要内核的支持, 内核编译时需要打开下面2个参数.

    CONFIG_BLK_CGROUP=y
    CONFIG_CFQ_GROUP_IOSCHED=y

    查看是否开启这2个内核编译选项的方法很简单:

    root@debian-113:~# grep -i 'blk_cgroup' /boot/config-`uname -r`
    root@debian-113:~# grep -i 'cfq_group' /boot/config-`uname -r`

    如果这2个内核选项没有打开, 只能重新编译内核后再来实验下面的实例了.

    再次通过 /proc/cgroups 来查看 blkio 是否已经启用.

    root@debian-113:~# cat /proc/cgroups 
    #subsys_name    hierarchy    num_cgroups    enabled
    cpuset    0    1    1
    cpu    0    1    1
    cpuacct    0    1    1
    memory    0    1    1
    devices    0    1    1
    freezer    0    1    1
    net_cls    0    1    1
    blkio    0    1    1    <-- enabled = 1, 说明已经启用
    perf_event    0    1    1

    如果 blkio 没有启用, 可以通过grub设置启动参数来启用它.

    类似的可以参考: Linux资源控制-CPU和内存  中 实例4 - cgroup 对使用的内存的控制 中启用memory的方法。

    除此之外, 还得查看是否能够将 CFQ 作为IO调度程序来使用.

    root@debian-113:~# cat /sys/class/block/sda/queue/scheduler 
    noop deadline [cfq]

    上述结果表示支持cfq调度, []括住cfq 表示当前使用的就是 cfq调度.

    如果 cat 的结果中没有 cfq, 需要重新编译内核, 使之能够支持 cfq调度.

    如果 cat 的结果中有 cfq, 但是 cfq 不是当前正在使用的调度程序, 即 [] 没有括在 cfq上, 那么

    cat cfq /sys/class/block/sda/queue/scheduler     <-- 将当前的IO调度程序设置成 cfq

    注: 上面的 sda 是我的测试的硬盘, 如果你的是 sdb 或者其它, 请对应修改.

    实例 - 控制IO优先级

    1. 挂载 cgroup文件系统, 挂载参数 -o blkio
    2. 建立2个group, 分别为 A 和 B
    3. 默认情况, 2个 group中的dd进程同时进行文件操作
    4. 查看默认情况下, 2个dd进程完成的时间
    5. 设置 A 的优先级为 100, B 的优先级为 1000
    6. 同时在2个group A 和 B 中运行 dd进程
    7. 查看group A 和 B 中的 dd进程完成的时间

    实验之前, 先制作测试脚本. (简单写了一个如下)

    #!/bin/bash
    
    ####################################################################
    # 1. 创造2个测试文件, 大小都是1G
    # 2. 将当前进程加入到指定 cgroup
    # 3. 执行 dd 操作
    # 4. 删除 测试文件
    # 5. 显示log
    ####################################################################
    
    function usage()
    {
        echo "./blkio-test.sh <group1> <group2>"
        exit 1
    }
    
    if [ $# != 2 ]; then
        usage
    fi
    
    group1_src=~/group1.src
    group2_src=~/group2.src
    
    group1_log=/tmp/group1.log
    group2_log=/tmp/group2.log
    
    group1=$1
    group2=$2
    
    echo "生成测试数据 $group1_src 和 $group2_src (大小都是1G)"
    dd if=/dev/zero of=$group1_src count=1024 bs=1M
    dd if=/dev/zero of=$group2_src count=1024 bs=1M
    
    echo "同时在 $group1 和 $group2 中开始 dd 测试"
    echo 3 > /proc/sys/vm/drop_caches
    echo $$ >> $group1/tasks
    (date; dd if=$group1_src of=/dev/null; date;) > $group1_log 2>&1 &
    
    echo $$ >> $group2/tasks
    (date; dd if=$group2_src of=/dev/null; date;) > $group2_log 2>&1 &
    
    wait
    echo "测试完成!"
    
    echo "开始清除测试文件"
    rm -rf $group1_src $group2_src
    echo "测试文件清除完成"
    
    echo "------------------------------------------"
    echo "显示group1 的log"
    cat $group1_log
    
    echo "------------------------------------------"
    echo "显示group2 的log"
    cat $group2_log
    
    echo "------------------------------------------"

    开始实验:

    # 挂载 cgroup 文件系统
    root@debian-113:~# mount -t cgroup -o blkio cgroup /mnt/cgroup/
    
    root@debian-113:~# mkdir /mnt/cgroup/{A,B}
    root@debian-113:~# ll /mnt/cgroup/
    total 0
    drwxr-xr-x 2 root root 0 Sep  5 13:23 A
    drwxr-xr-x 2 root root 0 Sep  5 13:23 B
    -r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_merged
    -r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_queued
    -r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_service_bytes
    -r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_serviced
    -r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_service_time
    -r--r--r-- 1 root root 0 Sep  5 13:23 blkio.io_wait_time
    --w------- 1 root root 0 Sep  5 13:23 blkio.reset_stats
    -r--r--r-- 1 root root 0 Sep  5 13:23 blkio.sectors
    -r--r--r-- 1 root root 0 Sep  5 13:23 blkio.time
    -rw-r--r-- 1 root root 0 Sep  5 13:23 blkio.weight   <-- 这个就是设置IO优先级的文件
    -rw-r--r-- 1 root root 0 Sep  5 13:23 blkio.weight_device
    -rw-r--r-- 1 root root 0 Sep  5 13:23 cgroup.clone_children
    --w--w--w- 1 root root 0 Sep  5 13:23 cgroup.event_control
    -rw-r--r-- 1 root root 0 Sep  5 13:23 cgroup.procs
    -rw-r--r-- 1 root root 0 Sep  5 13:23 notify_on_release
    -rw-r--r-- 1 root root 0 Sep  5 13:23 release_agent
    -rw-r--r-- 1 root root 0 Sep  5 13:23 tasks
    
    # 默认2个组内的IO优先级都是500
    root@debian-113:~# cat /mnt/cgroup/A/blkio.weight
    500  <-- 这个值的范围是 100 ~ 1000, 值越大优先级越高
    root@debian-113:~# cat /mnt/cgroup/B/blkio.weight
    500
    
    # 默认情况下的测试结果如下: A和B耗时都是 20秒
    root@debian-113:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B
    生成测试数据 /root/group1.src 和 /root/group2.src (大小都是1G)
    1024+0 records in
    1024+0 records out
    1073741824 bytes (1.1 GB) copied, 6.01188 s, 179 MB/s
    1024+0 records in
    1024+0 records out
    1073741824 bytes (1.1 GB) copied, 9.4272 s, 114 MB/s
    同时在 /mnt/cgroup/A 和 /mnt/cgroup/B 中开始 dd 测试
    测试完成!
    开始清除测试文件
    测试文件清除完成
    ------------------------------------------
    显示group1 的log
    Fri Sep  5 13:26:31 CST 2014
    2097152+0 records in
    2097152+0 records out
    1073741824 bytes (1.1 GB) copied, 20.0504 s, 53.6 MB/s
    Fri Sep  5 13:26:51 CST 2014
    ------------------------------------------
    显示group2 的log
    Fri Sep  5 13:26:31 CST 2014
    2097152+0 records in
    2097152+0 records out
    1073741824 bytes (1.1 GB) copied, 18.8583 s, 56.9 MB/s
    Fri Sep  5 13:26:51 CST 2014
    ------------------------------------------
    
    # 修改A的优先级为100, B的优先级为1000
    root@debian-113:~# echo 100 > /mnt/cgroup/A/blkio.weight
    root@debian-113:~# echo 1000 > /mnt/cgroup/B/blkio.weight
    root@debian-113:~# cat /mnt/cgroup/A/blkio.weight
    100
    root@debian-113:~# cat /mnt/cgroup/B/blkio.weight
    1000
    
    # 不同优先级下的测试结果如下: A耗时 19秒; B耗时 11秒
    root@debian-113:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B
    生成测试数据 /root/group1.src 和 /root/group2.src (大小都是1G)
    1024+0 records in
    1024+0 records out
    1073741824 bytes (1.1 GB) copied, 6.52967 s, 164 MB/s
    1024+0 records in
    1024+0 records out
    1073741824 bytes (1.1 GB) copied, 8.01311 s, 134 MB/s
    同时在 /mnt/cgroup/A 和 /mnt/cgroup/B 中开始 dd 测试
    测试完成!
    开始清除测试文件
    测试文件清除完成
    ------------------------------------------
    显示group1 的log
    Fri Sep  5 13:30:06 CST 2014
    2097152+0 records in
    2097152+0 records out
    1073741824 bytes (1.1 GB) copied, 18.5598 s, 57.9 MB/s
    Fri Sep  5 13:30:25 CST 2014
    ------------------------------------------
    显示group2 的log
    Fri Sep  5 13:30:06 CST 2014
    2097152+0 records in
    2097152+0 records out
    1073741824 bytes (1.1 GB) copied, 10.6127 s, 101 MB/s
    Fri Sep  5 13:30:17 CST 2014
    ------------------------------------------

    可以看出, IO优先级调整之后, 确实优先级高的cgroup中的进程能更快完成IO操作.

    总结

    其实 cgroup 除了能够IO优先级之外, 还可以控制进程的其它IO属性, 具体参见挂载在 cgroup 的IO相关设置文件.

    各个文件的具体含义, 请参考更详细的 cgroup 相关文档.

  • 相关阅读:
    vue 组件轮播联动
    Echarts 解决饼图文字过长重叠的问题
    Echarts 背景渐变柱状图
    vue 组件间数据传递
    vue webpack build 打包过滤console.log()日志
    自定义字段排序
    vue 路由嵌套高亮问题
    微信小程序验证码获取倒计时
    解决小程序里面的图片之间有空隙的问题???
    axios使用
  • 原文地址:https://www.cnblogs.com/wang_yb/p/3957913.html
Copyright © 2011-2022 走看看