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

前提条件

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

CONFIG_BLK_CGROUP=y
CONFIG_CFQ_GROUP_IOSCHED=y

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

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

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

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

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

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

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

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

root@debian-:~# 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

####################################################################
# . 创造2个测试文件, 大小都是1G
# . 将当前进程加入到指定 cgroup
# . 执行 dd 操作
# . 删除 测试文件
# . 显示log
#################################################################### function usage()
{
echo "./blkio-test.sh <group1> <group2>"
exit
} if [ $# != ]; then
usage
fi group1_src=~/group1.src
group2_src=~/group2.src group1_log=/tmp/group1.log
group2_log=/tmp/group2.log group1=$
group2=$ echo "生成测试数据 $group1_src 和 $group2_src (大小都是1G)"
dd if=/dev/zero of=$group1_src count= bs=1M
dd if=/dev/zero of=$group2_src count= bs=1M echo "同时在 $group1 和 $group2 中开始 dd 测试"
echo > /proc/sys/vm/drop_caches
echo $$ >> $group1/tasks
(date; dd if=$group1_src of=/dev/null; date;) > $group1_log >& & echo $$ >> $group2/tasks
(date; dd if=$group2_src of=/dev/null; date;) > $group2_log >& & 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-:~# mount -t cgroup -o blkio cgroup /mnt/cgroup/ root@debian-:~# mkdir /mnt/cgroup/{A,B}
root@debian-:~# ll /mnt/cgroup/
total
drwxr-xr-x root root Sep : A
drwxr-xr-x root root Sep : B
-r--r--r-- root root Sep : blkio.io_merged
-r--r--r-- root root Sep : blkio.io_queued
-r--r--r-- root root Sep : blkio.io_service_bytes
-r--r--r-- root root Sep : blkio.io_serviced
-r--r--r-- root root Sep : blkio.io_service_time
-r--r--r-- root root Sep : blkio.io_wait_time
--w------- root root Sep : blkio.reset_stats
-r--r--r-- root root Sep : blkio.sectors
-r--r--r-- root root Sep : blkio.time
-rw-r--r-- root root Sep : blkio.weight <-- 这个就是设置IO优先级的文件
-rw-r--r-- root root Sep : blkio.weight_device
-rw-r--r-- root root Sep : cgroup.clone_children
--w--w--w- root root Sep : cgroup.event_control
-rw-r--r-- root root Sep : cgroup.procs
-rw-r--r-- root root Sep : notify_on_release
-rw-r--r-- root root Sep : release_agent
-rw-r--r-- root root Sep : tasks # 默认2个组内的IO优先级都是500
root@debian-:~# cat /mnt/cgroup/A/blkio.weight
<-- 这个值的范围是 ~ , 值越大优先级越高
root@debian-:~# cat /mnt/cgroup/B/blkio.weight # 默认情况下的测试结果如下: A和B耗时都是 20秒
root@debian-:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B
生成测试数据 /root/group1.src 和 /root/group2.src (大小都是1G)
+ records in
+ records out
bytes (1.1 GB) copied, 6.01188 s, MB/s
+ records in
+ records out
bytes (1.1 GB) copied, 9.4272 s, MB/s
同时在 /mnt/cgroup/A 和 /mnt/cgroup/B 中开始 dd 测试
测试完成!
开始清除测试文件
测试文件清除完成
------------------------------------------
显示group1 的log
Fri Sep :: CST
+ records in
+ records out
bytes (1.1 GB) copied, 20.0504 s, 53.6 MB/s
Fri Sep :: CST
------------------------------------------
显示group2 的log
Fri Sep :: CST
+ records in
+ records out
bytes (1.1 GB) copied, 18.8583 s, 56.9 MB/s
Fri Sep :: CST
------------------------------------------ # 修改A的优先级为100, B的优先级为1000
root@debian-:~# echo > /mnt/cgroup/A/blkio.weight
root@debian-:~# echo > /mnt/cgroup/B/blkio.weight
root@debian-:~# cat /mnt/cgroup/A/blkio.weight root@debian-:~# cat /mnt/cgroup/B/blkio.weight # 不同优先级下的测试结果如下: A耗时 19秒; B耗时 11秒
root@debian-:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B
生成测试数据 /root/group1.src 和 /root/group2.src (大小都是1G)
+ records in
+ records out
bytes (1.1 GB) copied, 6.52967 s, MB/s
+ records in
+ records out
bytes (1.1 GB) copied, 8.01311 s, MB/s
同时在 /mnt/cgroup/A 和 /mnt/cgroup/B 中开始 dd 测试
测试完成!
开始清除测试文件
测试文件清除完成
------------------------------------------
显示group1 的log
Fri Sep :: CST
+ records in
+ records out
bytes (1.1 GB) copied, 18.5598 s, 57.9 MB/s
Fri Sep :: CST
------------------------------------------
显示group2 的log
Fri Sep :: CST
+ records in
+ records out
bytes (1.1 GB) copied, 10.6127 s, MB/s
Fri Sep :: CST
------------------------------------------

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

总结

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

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

Linux资源管理-IO优先级的更多相关文章

  1. Linux的IO调度

    Linux的IO调度 IO调度发生在Linux内核的IO调度层.这个层次是针对Linux的整体IO层次体系来说的.从read()或者write()系统调用的角度来说,Linux整体IO体系可以分为七层 ...

  2. Linux系统IO分析工具之iotop常用参数介绍

      Linux系统IO分析工具之iotop常用参数介绍 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 在一般运维工作中经常会遇到这么一个场景,服务器的IO负载很高(iostat中的 ...

  3. Linux硬件IO的优化简介

    Linux硬件IO的优化简介 首先简单介绍下有哪些硬件设备如下(由于硬件种类厂家等各种因素我就不在此多做介绍有兴趣的可以自行学习): 1.CPU:中央处理器,是计算机运算控制的核心部件之一,相当于人的 ...

  4. linux标准io的copy

    ---恢复内容开始--- 1.linux标准io的copy #include<stdio.h> int main(int argc,char **argv) { if(argc<3) ...

  5. MySQL 调优基础(四) Linux 磁盘IO

    1. IO处理过程 磁盘IO经常会成为系统的一个瓶颈,特别是对于运行数据库的系统而言.数据从磁盘读取到内存,在到CPU缓存和寄存器,然后进行处理,最后写回磁盘,中间要经过很多的过程,下图是一个以wri ...

  6. Linux的io机制

    Linux的io机制 Buffered-IO 和Direct-IO Linux磁盘I/O分为Buffered IO和Direct IO,这两者有何区别呢? 对于Buffered IO: 当应用程序尝试 ...

  7. Linux Network IO Model、Socket IO Model - select、poll、epoll

    目录 . 引言 . IO机制简介 . 阻塞式IO模型(blocking IO model) . 非阻塞式IO模型(noblocking IO model) . IO复用式IO模型(IO multipl ...

  8. Linux就这个范儿 第15章 七种武器 linux 同步IO: sync、fsync与fdatasync Linux中的内存大页面huge page/large page David Cutler Linux读写内存数据的三种方式

    Linux就这个范儿 第15章 七种武器  linux 同步IO: sync.fsync与fdatasync   Linux中的内存大页面huge page/large page  David Cut ...

  9. 转:Linux网络IO并行化技术概览

    转:http://codinginet.com/articles/view/201605-linux_net_parallel?simple=1&from=timeline&isapp ...

随机推荐

  1. VisualVM通过jstatd方式远程监控远程主机

    配置好权限文件 [root@test bin]# cd $JAVA_HOME/bin [root@test bin]# vim jstatd.all.policy grant codebase &qu ...

  2. Winserver下的Hyper-v “未在远程桌面会话中捕获到鼠标”

    异常处理汇总-服 务 器 http://www.cnblogs.com/dunitian/p/4522983.html 服务器相关的知识点:http://www.cnblogs.com/dunitia ...

  3. 《JavaScript设计模式与开发实践》整理

    最近在研读一本书<JavaScript设计模式与开发实践>,进阶用的. 一.高阶函数 高阶函数是指至少满足下列条件之一的函数. 1. 函数可以作为参数被传递. 2. 函数可以作为返回值输出 ...

  4. Java类变量和成员变量初始化过程

    一.类的初始化 对于类的初始化:类的初始化一般只初始化一次,类的初始化主要是初始化静态成员变量. 类的编译决定了类的初始化过程. 编译器生成的class文件主要对定义在源文件中的类进行了如下的更改: ...

  5. GJM : C#设计模式汇总整理——导航 【原创】

    感谢您的阅读.喜欢的.有用的就请大哥大嫂们高抬贵手"推荐一下"吧!你的精神支持是博主强大的写作动力以及转载收藏动力.欢迎转载! 版权声明:本文原创发表于 [请点击连接前往] ,未经 ...

  6. OSGi规范的C#实现开源

    这是大约在3-4年前完成的一个C#实现的OSGi框架,实现的过程参照了OSGi规范与与一些实现思路(感谢当时的那些资料与项目),此框架虽然仅在几个小型项目有过实际的应用,但OSGi的规范实现还是相对比 ...

  7. “风投云涌”:那些被资本看中的IT企业的风光与辛酸

         进入七月份以来,纷享销客获得D轮融资1亿美元,撼动业界,资本与IT联姻令一部分创业者眼红的同时,没有人注意到背后的风险. 科技与资本的结合,是当今经济社会前行的宏大主题.相关统计显示,软件行 ...

  8. SharePoint 2016 入门视频教程

    之前一直有朋友让自己录一些SharePoint的入门视频,之前没有太多时间,一个巧合的机会收到CSDN学院的邮件,可以在CSDN上发布视频教程,自己就录了一些.说起录视频也是蛮辛苦的,每天下班吃完饭要 ...

  9. 1.Hibernate简介

    1.框架简介: 定义:基于java语言开发的一套ORM框架: 优点:a.方便开发;           b.大大减少代码量;           c.性能稍高(不能与数据库高手相比,较一般数据库使用者 ...

  10. ReactNative入门 —— 动画篇(下)

    在上篇动画入门文章中我们了解了在 React Native 中简单的动画的实现方式,本篇将作为上篇的延续,介绍如何使用 Animated 实现一些比较复杂的动画. 动画组合 在 Animated 中提 ...