注册 登录  
 加关注
   显示下一条  |  关闭
温馨提示!由于新浪微博认证机制调整,您的新浪微博帐号绑定已过期,请重新绑定!立即重新绑定新浪微博》  |  关闭

osdba的博客

敢于担当,拥抱变化,锐意进取,永不止步

 
 
 

日志

 
 

浅谈block io-throttle  

2012-07-13 10:30:05|  分类: linux |  标签: |举报 |字号 订阅

  下载LOFTER 我的照片书  |


block io-throttle是io层用于限制上层发送io速度的一个子模块,只所以是浅谈,因为它实在比较简单(一共只有1000多行代码),没啥可以发挥的。本文首先简单介绍一下block io throttle以及实现机制,然后谈谈它的优缺点,最后聊聊我们正在进行的一些工作。

概述
block io throttle与block cgroup配合一起工作,在block cgroup中与它相关的文件主要有:
[taoma@desktop test1]$ ls -1|grep throttle
blkio.throttle.io_service_bytes
blkio.throttle.io_serviced
blkio.throttle.read_bps_device
blkio.throttle.read_iops_device
blkio.throttle.write_bps_device
blkio.throttle.write_iops_device
前面两个是统计这个cgroup目前io状况(发送的io字节数以及io个数),后面四个分别用来控制读写的限额(既可以是iops,也可以是bps),值得注意的是,由于cgroup是和设备无关的,所以设置限额要指明设备。比如
echo “253:0 100″ > blkio.throttle.read_iops_device
就是对253:0这个设备控制读的iops为每秒100次。

实现
大家都知道,现在io层的统一接口是submit_bio,上层系统封装好了bio后就调用这个函数发送到底层的设备,submit_bio会调用generic_make_request,generic_make_request会调用q->request_fn,如果设备的驱动实现了自己的request_fn,那么就会脱离通用的block层,直接发起设备的IO,如果是使用通用的request函数,则会进入调度器的队列。由此可见,io throttle要想工作,只能在q->request_fn之前。在代码中,generic_make_request会首先调用blk_throtl_bio来进行throttle工作。

blk_throtl_bio就很简单了,它维护了读写两个队列并保存了一些统计信息,当bio进来的时候,它会检测当前分配的iops或者bps是否已经用完,没有用完就直接发送了。如果用完了,就根据读写加入不同的队列,同时维护了一个定时器,计算一个新的可以发送时间,到时间了再发送这个io。

io throttle的优点
1. 提供了iops,bps两种模式,同时可以对read/write的不同限制,简单实用
2. 对所有的io请求都可以控制。玩过block cgroup的同学们都知道,如果想通过比例来控制各个cgroup之间的带宽分配,那就必须需要cfq来配合了。这样的话,至少有两个局限性:
1)所有不是request based driver都无法使用,因为它们不会进入通用的block层,也就没有cfq什么事情。比如多数device mapper设备(如facebook家的flashcache),一些快速的ssd设备(这些设备的driver为了避免block层的冗长路径,一般直接将bio转换DMA,如上文提到的自带request_fn)。
2)cfq是基于时间片的,虽然有iops模式,但是如果一旦挂上cgroup,在各个cgroup都比较饱满工作的条件下,IO延时惊人。

缺点
io throttle的缺点也很明显,由于使用了硬性的带宽控制(iops/bps),使得io throttle不能弹性的变化,即使在其他cgroup都很空闲的情况下也无法占有所有的带宽,造成一定的浪费。

我们的工作
为了解决io throttle这个缺点,我们需要一种反馈机制,让应用方或者系统管理员能够了解各个block cgroup使用情况。这样当他或者是一个daemon发现所有其他的cgroup都很空闲的时候,能够动态调节控制,让block设备尽量满负荷的工作。

实现其实也很简单,我们添加了一个blkio.throttle.io_queued的接口,把block cgroup中阻塞的io情况报告出来,这样和上层daemon一起配合就可以完美的发挥弹性io控制的目的了。相应的patch我们也发送到了社区。有兴趣的同学可以参见这里


  评论这张
 
阅读(287)| 评论(0)
推荐 转载

历史上的今天

评论

<#--最新日志,群博日志--> <#--推荐日志--> <#--引用记录--> <#--博主推荐--> <#--随机阅读--> <#--首页推荐--> <#--历史上的今天--> <#--被推荐日志--> <#--上一篇,下一篇--> <#-- 热度 --> <#-- 网易新闻广告 --> <#--右边模块结构--> <#--评论模块结构--> <#--引用模块结构--> <#--博主发起的投票-->
 
 
 
 
 
 
 
 
 
 
 
 
 
 

页脚

网易公司版权所有 ©1997-2017