IO调度程序:将磁盘IO资源分配给系统中所有挂起的块IO请求,通过将请求队列中挂起的请求
合并和排序来完成的,其工作就是管理块设备的请求队列
-
合并:将两个或多个请求结合成一个新请求
-
排序:整个请求队列按扇区增长方向有序排列
linux电梯:2.4默认的IO调度程序,在2.6被取代,新请求加入队列后,首先检查其他每个挂起请求是否可以和新请求合并,可以执行
向前和向后合并,但鉴于文件的分布(以扇区号的增长表现)特点和IO操作执行方式的典型性(通常从头读向尾),所以向后合并远多于向前合并,如果合并失败则寻找可能的插入点
如果队列中有驻留时间过长的请求,新请求加入到队列尾部,即使插入后还要排序,但这仅仅是在经过了一定时间后停止插入---排序请求,最终还是会导致饥饿现象
每个请求都有一个超时时间,读请求500ms,写请求5s,以磁盘物理位置为次序维护请求队列(排序队列),新请求递交给排序队列时,会执行合并和插入请求类似于linux电梯,同时以请求类型为依据插到额外队列(读FIFO队列和写FIFO队列),请求会从推入派发队列中,然后提交给磁盘驱动
缺点:降低了系统吞吐量,每次提交读请求,IO调度程序迅速处理,但两次寻址操作(一次对读操作定位,一次返回进行写操作定位)
以deadline为基础,增加了
预测启发能力,在保持良好的
读响应的同时也能提供良好的全局吞吐量,读请求提交后不直接返回处理其他请求,而是会有意空闲片刻(
6ms),在此期间任何对相邻磁盘位置操作的请求会立刻处理
每个提交IO的进程都有自己的队列,IO调度程序以时间片轮转调度队列,从每个队列中选取请求数(4个),然后进行下一轮调度
不进行排序,但会将新请求与任一相邻请求合并,维护请求队列近似于FIFO的顺序排列,适合于块设备没有寻到负担的场景
1)查看当前系统的IO调度方法:
cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
2)临时更改IO调度方法:
例如:想更改到noop电梯调度算法:
echo noop > /sys/block/sda/queue/scheduler
3)永久更改IO调度方法:
修改内核引导参数,加入elevator=调度程序名
[root@test1 tmp]# vi /boot/grub/menu.lst
更改到如下内容:
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet
上述4种IO调度程序在2.6中可以自行设置,具体选择依据工作负荷,在清楚原理基础上加以测试
阅读(2034) | 评论(0) | 转发(0) |