更改as的默认gradle地址_⾯试官:谈谈这4种磁盘IO调度算
法--CFQ、NOOP、D。。。
概述
今天主要分享下磁盘IO调度算法,虽然对于我们平时只需要设置deadline就⾏了,不过了解下它的4种算法也还是不错的。
I/O 调度算法
I/O 调度算法在各个进程竞争磁盘I/O的时候担当了裁判的⾓⾊。他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能。
Linux 4.0 IO协议栈框架图
I/O调度程序的总结:
1)当向设备写⼊数据块或是从设备读出数据块时,请求都被安置在⼀个队列中等待完成.nevertoolate
code blue
2)每个块设备都有它⾃⼰的队列.
3)I/O调度程序负责维护这些队列的顺序,以更有效地利⽤介质.I/O调度程序将⽆序的I/O操作变为有序的I/O操作.
4)内核必须⾸先确定队列中⼀共有多少个请求,然后才开始进⾏调度.
I/O调度的4种算法
CFQ(完全公平排队I/O调度程序)
在最新的内核版本和发⾏版中,都选择CFQ做为默认的I/O调度器,对于通⽤的服务器也是最好的选择。CFQ对于多媒体应⽤(video,audio)和桌⾯系统是最好的选择。CFQ赋予I/O请求⼀个优先级,⽽I/O优先级请求独⽴于进程优先级,⾼优先级的进程的读写不能⾃动地继承⾼的I/O优先级。
对于很多IO压⼒较⼤的场景就并不是很适应,尤其是IO压⼒集中在某些进程上的场景。因为这种场景我们需要更多的满⾜某个或者某⼏个进程的IO响应速度,⽽不是让所有的进程公平的使⽤IO,⽐如数据库应⽤。
CFQ试图均匀地分布对I/O带宽的访问,避免进程被饿死并实现较低的延迟,是deadline和as调度器的折中.
⼯作原理:
CFQ为每个进程/线程,单独创建⼀个队列来管理该进程所产⽣的请求,也就是说每个进程⼀个队列,每个队列按照上述规则进⾏merge和sort。各队列之间的调度使⽤时间⽚来调度,以此来保证每个进程都能被很好的分配到I/O带宽.I/O调度器每次执⾏⼀个进程的4次请求。可以调 queued 和 quantum 来优化
NOOP(电梯式调度程序)
在Linux2.4或更早的版本的调度程序,那时只有这⼀种I/O调度算法.I/O请求被分配到队列,调度由硬件进⾏,只有当CPU时钟频率⽐较有限时进⾏。
Noop对于I/O不那么操⼼,对所有的I/O请求都⽤FIFO队列形式处理,默认认为 I/O不会存在性能问题。
这也使得CPU也不⽤那么操⼼。它像电梯的⼯作主法⼀样对I/O请求进⾏组织,当有⼀个新的请求到来时,它将请求合并到最近的请求之后,以此来保证请求同⼀介质.
NOOP倾向饿死读⽽利于写.
NOOP对于闪存设备,RAM,嵌⼊式系统是最好的选择.
let it be什么意思
电梯算法饿死读请求的解释:
borsche因为写请求⽐读请求更容易.写请求通过⽂件系统cache,不需要等⼀次写完成,就可以开始下⼀次写操作,写请求通过合并,堆积到I/O队列中.读请求需要等到它前⾯所有的读操作完成,才能进⾏下⼀次读操作.在读操作之间有⼏毫秒时间,⽽写请求在这之间就到来,饿死了后⾯的读请求.
Deadline(截⽌时间调度程序)
通过时间以及硬盘区域进⾏分类,这个分类和合并要求类似于noop的调度程序.
Deadline确保了在⼀个截⽌时间内服务请求,这个截⽌时间是可调整的,⽽默认读期限短于写期限.这样就防⽌了写操作因为不能被读取⽽饿死的现象.
Deadline对数据库环境(ORACLE RAC,MYSQL等)是最好的选择。九月英文
中国菜名
deadline实现了四个队列,其中两个分别处理正常read和write,按扇区号排序,进⾏正常io的合并处理以提⾼吞吐量.因为IO请求可能会集中在某些磁盘位置,这样会导致新来的请求⼀直被合并,于是可能会有其他磁盘位置的io请求被饿死。于是实现了另外两个处理超时read和write的队列,按请求创建时间排序,如果有超时的请求出现,就放进这两个队列,调度算法保证超时(达到最终期限时间)的队列中的请求会优先被处理,防⽌请求被饿死。由于deadline的特点,⽆疑在这⾥⽆法区分进程,也就不能实现针对进程的io资源控制。
substringAS(预料I/O调度程序)
result本质上与Deadline⼀样,但在最后⼀次读操作后,要等待6ms,才能继续进⾏对其它I/O请求进⾏调度.可以从应⽤程序中预订⼀个新的读请求,改进读操作的执⾏,但以⼀些写操作为代价.它会在每个6ms中插⼊新的I/O操作,⽽会将⼀些⼩写⼊流合并成⼀个⼤写⼊流,⽤写⼊延时换取最⼤的写⼊吞吐量.
AS适合于写⼊较多的环境,⽐如⽂件服务器,AS对数据库环境表现很差.
I/O调度⽅法的查看与设置
1)查看当前系统的I/O调度⽅法:
不大不小# cat /sys/block/sda/queue/scheduler
noop anticipatory deadline [cfq]
2)临地更改I/O调度⽅法:
例如:想更改到noop电梯调度算法:
echo noop > /sys/block/sda/queue/scheduler
testbench
3)想永久的更改I/O调度⽅法:
修改内核引导参数,加⼊elevator=调度程序名
# vi /boot/grub/menu.lst
更改到如下内容:
kernel /boot/vmlinuz-2.6.18-8.el5 ro root=LABEL=/ elevator=deadline rhgb quiet 重启之后,查看调度⽅法:
# cat /sys/block/sda/queue/scheduler
noop anticipatory [deadline] cfq
已经是deadline了
从很多测试结果来看,数据库使⽤deadline调度,性能会更稳定⼀些。
后⾯会分享更多devops和DBA⽅⾯的内容,感兴趣的朋友可以关注⼀下~