块I/O调度程序

来源:互联网 发布:客户经理好用软件 编辑:程序博客网 时间:2024/06/06 15:53

最近在看《linux内核设计与实现》这本书,写些东西记录一下学习过程。


块设备最突出的特点是可以随机访问固定大小的数据片,这些固定大小的数据片称为块,块设备通过安装文件系统来访问。注意块设备都有自己的物理最小寻址单元(如扇区),但是在文件系统下,其有着最小逻辑可寻址单元——块,不要搞混淆了。

与块设备相对的是字符设备,字符设备按字符流来有序访问,如串口和键盘。

像硬盘这样块设备,其寻址时间较长,是整个计算中的性能瓶颈。如果任由系统按照I/O请求的顺序来进行I/O请求的话其性能难以让人接受。为此linux内核引入I/O调度程序来管理块设备的请求队列。

通过对I/O请求的合并和排序,有利于减少磁盘寻址时间,提高全局吞吐量,但是合并和排序操作却导致某些请求长时间得不到相应。下面看下linux中的几种I/O调度算法。

1、linus电梯算法:当一个请求加入队列时,有四种可能的情况:1)如果和某个请求相邻,则合并;2)如果队列中有一个请求驻留时间过长,则将其插入到队尾,防止更严重的饥饿;3)如果当前执行的扇区方向有合适的插入位置,则插入;4)如果没有合适的插入位置,则插到队尾;

linus电梯算法存在比较严重的饥饿现象:1)对磁盘某一块的大量读写操作会导致磁盘其他位置的请求长时间得不到相应;2)写操作可以推后到内核有空时执行,但是读操作的堵塞会直接导致应用程序的堵塞,因此读请求的优先级理应高于写请求。

2、最终期限I/0调度算法:在与linus电梯排序队列的基础上,新增加读请求FIFO队列和写请求FIFO队列,默认读请求超时时间500ms,写请求超时时间5s。新的请求操作会被同时插入到合并排序队列和FIFO队列。在FIFO队列没有请求队列超时的情况下,对合并队列进行响应,反之,对FIFO队列进行响应。

3、预测I/O调度算法:预测I/O调度算法是linux内核2.6的缺省I/O调度算法。它在最终期限的I/O调度算法的基础上做了如下改进:处理完一个I/O请求后,并不立即返回处理其他请求,而是会空闲片刻(默认6ms),在此期间新提交的相邻的I/O请求会立刻得到处理。 

预测I/O调度算法在大部分情况下性能理想,但是在某些有严格工作负荷的服务器(如数据库挖掘服务器,其线程多,每个线程的时间片有限,并且各个线程的I/O操作不连续)上,这个调度程序执行的效果不好。

4、完全公正的排队I/O调度算法:CFQ(complete fair queuing)是为专有工作负荷设计的,实际应该中,在几乎所有的情况下都能很好的执行。CFQ将I/O请求按请求所属的进程来组织,以时间片轮转调度队列,从每个队列中选取请求数(默认4个),然后进行下一轮调度。在进程级提供了公平。


除了以上的四种I/O调度算法,还有一种称为:

5、空操作的I/O调度算法,它的队列除了合并几乎不做其他的工作。其适应于真正的随机访问设备,如闪存卡。

原创粉丝点击