|
|
51CTO旗下网站
|
|
移动端

HACK #13 使用Block I/O控制器设置I/O优先级(1)

《Linux内核精髓:精通Linux内核必会的75个绝技》第2章资源管理,本章将介绍Linux内核中的几个资源管理功能。其中Linux内核特有的Cgroup资源控制,就是能够进行虚拟化资源控制的重要功能。本节为大家介绍HACK #13 使用Block I/O控制器设置I/O优先级。

作者:杨婷 译来源:机械工业出版社|2013-02-26 12:03

HACK #13 使用Block I/O控制器设置I/O优先级(1)

本节介绍使用Block I/O控制器的功能设置I/O优先级的方法。

Block I/O控制器可以将任意进程分组,并对该分组设置I/O的优先级。这个功能是在Linux 2.6.33时添加到Linux内核中的。例如,在前台进行一般处理的同时,在后台磁盘备份处理的情况下,如果备份处理频繁地向磁盘进行I/O操作,前台的处理即使有I/O请求,也不能立刻进行I/O处理,结果导致前台处理的性能下降。

Block I/O控制器在这种情况下就非常有效。创建I/O优先级较高的分组和较低的分组,并将前台处理的进程和后台处理的进程分别分配到这些分组中。这样可以使前台处理的I/O优先于后台处理,防止性能下降。

本节将介绍Block I/O控制器的使用方法。使用的Linux内核版本为2.6.35。

使用Block I/O控制器的前提条件

Block I/O控制器是Cgroup的子系统之一,是作为I/O调度程序之一的CFQ的一部分安装的。因此,使用Block I/O控制器时,必须使用启用了下列config选项编译的内核。

  1. CONFIG_BLK_CGROUP  
  2. CONFIG_CFQ_GROUP_IOSCHED 

确认Cgroup支持

首先确认运行中的内核是否支持Cgroup和Cgroup子系统Block I/O控制器。如果有/proc/cgroups,运行中的内核就可以支持Cgroup。/proc/cgroups的内容如下。

  1. $ cat /proc/cgroups  
  2.    subsys_name  hierarchy   num_cgroups enabled  
  3.    blkio                1       1       1 
只要subsys_name列显示了blkio,且enabled为1就没问题。如果看不到blkio,就需要重新编译内核。如果enabled为0,则启动时的内核命令行应当如下所示。
  1. cgroup_disabled=blkio 

这时需要修改/boot/grub/grub.conf等,将上述指定从内核命令行中删除,并重新启动。

确认CFQ支持

接下来确认是否能够将CFQ作为I/O调度程序使用。例如,想要查看块设备sdb中可以使用的I/O调度程序时,需要执行下列命令。

  1. $ cat /sys/class/block/sdb/queue/scheduler  
  2.   noop deadline [cfq] 

可以使用的I/O调度程序会显示出来,其中当前选择的调度程序已加上了方括号。如果显示cfq则没问题;如果不显示就需要启用CFQ,重新编译内核。

注意事项:设备种类不同,scheduler文件的内容也不同。I/O调度程序是对一般的块设备使用的,因此,例如在loopback设备loop0等中不会显示cfq。请对sda、sdb等一般的块设备进行确认。

尝试使用Block I/O控制器

Block I/O控制器的设置通过cgroup文件系统进行。关于Cgroup和cgroup文件系统的基本情况请参考Hack #7。

首先挂载cgroup文件。将blkio作为挂载选项,指定将Block I/O控制器作为子系统使用。

  1. # mount -t cgroup -o blkio cgroup/cgroup 
然后,在CFQ中为想要控制I/O优先级的块设备设置I/O调度程序。这里使用的块设备是sdb。
  1. # echo cfq > /sys/class/block/sdb/queue/scheduler  
  2. $ cat /sys/class/block/sdb/queue/scheduler  
  3.    noop deadline [cfq] 
这时,使用Block I/O控制器前的准备工作就完成了。为了方便讲解,在这里创建优先级较高的分组“high”和优先级较低的分组“low”,并分别向各分组分配1个进程来观察I/O的情况。首先创建分组。
  1. # mkdir /cgroup/high  
  2. # mkdir /cgroup/low 
对各分组设置I/O的优先级。设置优先级时,在blkio.weight中写入100~1000的“weight值”。初始值为500,值越大表示优先级越高。
  1. # echo 1000 > /cgroup/high/blkio.weight  
  2. # echo 100 > /cgroup/low/blkio.weight 
【责任编辑:book TEL:(010)68476606】

回书目   上一节   下一节
点赞 0
分享:
大家都在看
猜你喜欢

读 书 +更多

八万里路云和月——一个国家扶贫开发工作重点县的

通榆,这个距离各个交通枢纽都十万八千里的偏僻小县城,搭载着电子商务的快车,踏上了云高速,开辟了如火如荼的电商致富的新战场,实现了一...

订阅51CTO邮刊

点击这里查看样刊

订阅51CTO邮刊