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

前提条件

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

  1. CONFIG_BLK_CGROUP=y
  2. CONFIG_CFQ_GROUP_IOSCHED=y

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

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

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

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

  1. root@debian-:~# cat /proc/cgroups
  2. #subsys_name hierarchy num_cgroups enabled
  3. cpuset
  4. cpu
  5. cpuacct
  6. memory
  7. devices
  8. freezer
  9. net_cls
  10. blkio <-- enabled = , 说明已经启用
  11. perf_event

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

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

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

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

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

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

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

  1. 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进程完成的时间

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

  1. #!/bin/bash
  2.  
  3. ####################################################################
  4. # . 创造2个测试文件, 大小都是1G
  5. # . 将当前进程加入到指定 cgroup
  6. # . 执行 dd 操作
  7. # . 删除 测试文件
  8. # . 显示log
  9. ####################################################################
  10.  
  11. function usage()
  12. {
  13. echo "./blkio-test.sh <group1> <group2>"
  14. exit
  15. }
  16.  
  17. if [ $# != ]; then
  18. usage
  19. fi
  20.  
  21. group1_src=~/group1.src
  22. group2_src=~/group2.src
  23.  
  24. group1_log=/tmp/group1.log
  25. group2_log=/tmp/group2.log
  26.  
  27. group1=$
  28. group2=$
  29.  
  30. echo "生成测试数据 $group1_src 和 $group2_src (大小都是1G)"
  31. dd if=/dev/zero of=$group1_src count= bs=1M
  32. dd if=/dev/zero of=$group2_src count= bs=1M
  33.  
  34. echo "同时在 $group1 和 $group2 中开始 dd 测试"
  35. echo > /proc/sys/vm/drop_caches
  36. echo $$ >> $group1/tasks
  37. (date; dd if=$group1_src of=/dev/null; date;) > $group1_log >& &
  38.  
  39. echo $$ >> $group2/tasks
  40. (date; dd if=$group2_src of=/dev/null; date;) > $group2_log >& &
  41.  
  42. wait
  43. echo "测试完成!"
  44.  
  45. echo "开始清除测试文件"
  46. rm -rf $group1_src $group2_src
  47. echo "测试文件清除完成"
  48.  
  49. echo "------------------------------------------"
  50. echo "显示group1 的log"
  51. cat $group1_log
  52.  
  53. echo "------------------------------------------"
  54. echo "显示group2 的log"
  55. cat $group2_log
  56.  
  57. echo "------------------------------------------"

开始实验:

  1. # 挂载 cgroup 文件系统
  2. root@debian-:~# mount -t cgroup -o blkio cgroup /mnt/cgroup/
  3.  
  4. root@debian-:~# mkdir /mnt/cgroup/{A,B}
  5. root@debian-:~# ll /mnt/cgroup/
  6. total
  7. drwxr-xr-x root root Sep : A
  8. drwxr-xr-x root root Sep : B
  9. -r--r--r-- root root Sep : blkio.io_merged
  10. -r--r--r-- root root Sep : blkio.io_queued
  11. -r--r--r-- root root Sep : blkio.io_service_bytes
  12. -r--r--r-- root root Sep : blkio.io_serviced
  13. -r--r--r-- root root Sep : blkio.io_service_time
  14. -r--r--r-- root root Sep : blkio.io_wait_time
  15. --w------- root root Sep : blkio.reset_stats
  16. -r--r--r-- root root Sep : blkio.sectors
  17. -r--r--r-- root root Sep : blkio.time
  18. -rw-r--r-- root root Sep : blkio.weight <-- 这个就是设置IO优先级的文件
  19. -rw-r--r-- root root Sep : blkio.weight_device
  20. -rw-r--r-- root root Sep : cgroup.clone_children
  21. --w--w--w- root root Sep : cgroup.event_control
  22. -rw-r--r-- root root Sep : cgroup.procs
  23. -rw-r--r-- root root Sep : notify_on_release
  24. -rw-r--r-- root root Sep : release_agent
  25. -rw-r--r-- root root Sep : tasks
  26.  
  27. # 默认2个组内的IO优先级都是500
  28. root@debian-:~# cat /mnt/cgroup/A/blkio.weight
  29. <-- 这个值的范围是 ~ , 值越大优先级越高
  30. root@debian-:~# cat /mnt/cgroup/B/blkio.weight
  31.  
  32. # 默认情况下的测试结果如下: A和B耗时都是 20秒
  33. root@debian-:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B
  34. 生成测试数据 /root/group1.src /root/group2.src (大小都是1G)
  35. + records in
  36. + records out
  37. bytes (1.1 GB) copied, 6.01188 s, MB/s
  38. + records in
  39. + records out
  40. bytes (1.1 GB) copied, 9.4272 s, MB/s
  41. 同时在 /mnt/cgroup/A /mnt/cgroup/B 中开始 dd 测试
  42. 测试完成!
  43. 开始清除测试文件
  44. 测试文件清除完成
  45. ------------------------------------------
  46. 显示group1 log
  47. Fri Sep :: CST
  48. + records in
  49. + records out
  50. bytes (1.1 GB) copied, 20.0504 s, 53.6 MB/s
  51. Fri Sep :: CST
  52. ------------------------------------------
  53. 显示group2 log
  54. Fri Sep :: CST
  55. + records in
  56. + records out
  57. bytes (1.1 GB) copied, 18.8583 s, 56.9 MB/s
  58. Fri Sep :: CST
  59. ------------------------------------------
  60.  
  61. # 修改A的优先级为100, B的优先级为1000
  62. root@debian-:~# echo > /mnt/cgroup/A/blkio.weight
  63. root@debian-:~# echo > /mnt/cgroup/B/blkio.weight
  64. root@debian-:~# cat /mnt/cgroup/A/blkio.weight
  65.  
  66. root@debian-:~# cat /mnt/cgroup/B/blkio.weight
  67.  
  68. # 不同优先级下的测试结果如下: A耗时 19秒; B耗时 11秒
  69. root@debian-:~# ./blkio-test.sh /mnt/cgroup/A /mnt/cgroup/B
  70. 生成测试数据 /root/group1.src /root/group2.src (大小都是1G)
  71. + records in
  72. + records out
  73. bytes (1.1 GB) copied, 6.52967 s, MB/s
  74. + records in
  75. + records out
  76. bytes (1.1 GB) copied, 8.01311 s, MB/s
  77. 同时在 /mnt/cgroup/A /mnt/cgroup/B 中开始 dd 测试
  78. 测试完成!
  79. 开始清除测试文件
  80. 测试文件清除完成
  81. ------------------------------------------
  82. 显示group1 log
  83. Fri Sep :: CST
  84. + records in
  85. + records out
  86. bytes (1.1 GB) copied, 18.5598 s, 57.9 MB/s
  87. Fri Sep :: CST
  88. ------------------------------------------
  89. 显示group2 log
  90. Fri Sep :: CST
  91. + records in
  92. + records out
  93. bytes (1.1 GB) copied, 10.6127 s, MB/s
  94. Fri Sep :: CST
  95. ------------------------------------------

可以看出, 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. Logstash实践: 分布式系统的日志监控

    文/赵杰 2015.11.04 1. 前言 服务端日志你有多重视? 我们没有日志 有日志,但基本不去控制需要输出的内容 经常微调日志,只输出我们想看和有用的 经常监控日志,一方面帮助日志微调,一方面及 ...

  2. clr 元数据

    clr相关编译器编译生成的托管模块由四部分组成:PE32或32+头.clr头.元数据.IL代码. 元数据和IL代码完全对应,保持一致(:>)性. 元数据有很多用途: VS的智能感知,自动补全: ...

  3. [原] KVM虚拟机网络闪断分析

    背景 公司云平台的机器时常会发生网络闪断,通常在10s-100s之间. 异常情况 VM出现问题时,表现出来的情况是外部监控系统无法访问,猜测可能是由于系统假死,OVS链路问题等等.但是在出现网络问题的 ...

  4. 内存映射文件MemoryMappedFile使用

    参考资料: http://blog.csdn.net/bitfan/article/details/4438458 所谓内存映射文件,其实就是在内存中开辟出一块存放数据的专用区域,这区域往往与硬盘上特 ...

  5. 星浩资本快速发展引擎:IT就是生产力

    星浩资本成立于2010年,是一家涵盖私募基金.开发管理.商业与现代服务业三大业务范围的综合性管理公司,专注于投资中国首创.高成长性.高回报率的创新型城市综合体. 年轻的星浩资本在商业投资上有其独到的商 ...

  6. ADFS3.0与SharePoint2013安装配置(原创)

    现在越来越多的企业使用ADFS作为单点登录,我希望今天的内容能帮助大家了解如何配置ADFS和SharePoint 2013.安装配置SharePoint2013这块就不做具体描述了,今天主要讲一下怎么 ...

  7. Visual Studio Code——Angular2 Hello World 之 2.0

    最近看到一篇用Visual Studio Code开发Angular2的文章,也是一篇入门教程,地址为:使用Visual Studio Code開發Angular 2專案.这里按部就班的做了一遍,感觉 ...

  8. iOS - 模态Model视图跳转和Push视图跳转的混合需求实现原理

    在研发中总会遇到一些莫名的需求,本着存在即合理的态度跟大家分享一下"模态Model视图跳转和Push视图跳转的需求实现",本文仅仅传授研发技术不传授产品以及UE的思想,请大家合理对 ...

  9. iOS 方法修饰符

     一.NS_DESIGNATED_INITIALIZER 用来修饰init方法,被修饰的方法称为designated initializer:没有被这个修饰的init方法称为convenience i ...

  10. Xamarin.Android活动的生命周期

    一.前言 用过Android手机的人一定会发现一种现象,当你把一个应用置于后台后,一段时间之后在打开就会发现应用重新打开了,但是之前的相关的数据却没有丢失.可以看出app的“生命”是掌握在系统手上的, ...