====================================================================
Linux IO调度算法
Linux下目前有4中IO调度算法:
Linux下目前有4中IO调度算法:
1、CFQ(Complete Fairness Queueing,完全公平排队 I/O 调度程序) 2、NOOP(No Operation,电梯式调度程序) 3、Deadline(截止时间调度程序) 4、AS(Anticipatory,预料 I/O 调度程序)
查看当前系统支持的IO调度算法
##查看当前系统支持的IO调度算法 dmesg | grep -i scheduler
查看当前系统的IO调度算法
## 查看当前系统的IO调度算法 ## 中括号括起来表示当前使用的算法 cat /sys/block/sda/queue/scheduler
修改某块硬盘的IO调度算法
## 修改某块硬盘的IO调度算法 echo cfq > /sys/block/sda/queue/scheduler
====================================================================
Linux四种调度算法
CFQ(完全公平排队I/O调度程序)
CFQ(Completely Fair Queuing)算法,绝对公平算法。它试图为竞争块设备使用权的所有进程分配一个请求队列和一个时间片,在调度器分配给进程的时间片内,进程可以将其读写请求发送给底层块设备,当进程的时间片消耗完,进程的请求队列将被挂起,等待调度。 每个进程的时间片和每个进程的队列长度取决于进程的IO优先级,每个进程都会有一个IO优先级,CFQ调度器将会将其作为考虑的因素之一,来确定该进程的请求队列何时可以获取块设备的使用权。
CFQ(Completely Fair Queuing)算法,绝对公平算法。它试图为竞争块设备使用权的所有进程分配一个请求队列和一个时间片,在调度器分配给进程的时间片内,进程可以将其读写请求发送给底层块设备,当进程的时间片消耗完,进程的请求队列将被挂起,等待调度。 每个进程的时间片和每个进程的队列长度取决于进程的IO优先级,每个进程都会有一个IO优先级,CFQ调度器将会将其作为考虑的因素之一,来确定该进程的请求队列何时可以获取块设备的使用权。
从Linux 2.6.18起,CFQ作为默认的IO调度算法。
NOOP(电梯式调度程序)
Noop调度算法也叫作电梯调度算法,它将IO请求放入到一个FIFO队列中,然后逐个执行这些IO请求,NOOP在FIFO的基础上对相邻的IO请求做合并,而是不是完全按照先进先出的规则。
NOOP算法特别适合那些不希望调度器重新组织IO请求顺序的应用。
Noop调度算法也叫作电梯调度算法,它将IO请求放入到一个FIFO队列中,然后逐个执行这些IO请求,NOOP在FIFO的基础上对相邻的IO请求做合并,而是不是完全按照先进先出的规则。
NOOP算法特别适合那些不希望调度器重新组织IO请求顺序的应用。
NOOP算法适合场景:
1、在IO调度器下方有更加智能的IO调度设备,如RAID/SAN/NAS等存储设备,这些设备能更好地组织IO请求;
2、上层应用程序比IO调度器更懂底层设备,如上层调度器已对IO请求进行优化;
3、对于SSD等非旋转磁头的存储设备,无需IO调度器对请求进行重组。
1、在IO调度器下方有更加智能的IO调度设备,如RAID/SAN/NAS等存储设备,这些设备能更好地组织IO请求;
2、上层应用程序比IO调度器更懂底层设备,如上层调度器已对IO请求进行优化;
3、对于SSD等非旋转磁头的存储设备,无需IO调度器对请求进行重组。
Deadline(截止时间调度程序)
Deadline算法的核心在于保证每个IO请求在一定的时间内一定要被服务到,以此来避免某个请求饥饿。
Deadline采用两个队列,一个队列对请求按照扇区序号进行排序,通过红黑树进行组织,另外一个队列按照请求的生成时间进行排序,由链表来组织。
所有的请求在生成时都会被赋上一个期限值(根据jiffies),并按期限值排序在fifo_list中,读请求的期限时长默认为为500ms,写请求的期限时长默认为5s,当请求超过期限值后,会被优先进行处理,以保证请求在一定时间内被服务到。
特点:
Deadline确保了在一个截止时间内服务请求,这个截止时间是可调整的,而默认读期限短于写期限.这样就防止了写操作因为不能被读取而饿死的现象.
Deadline对数据库环境(ORACLE RAC,MYSQL等)是最好的选择.
Deadline确保了在一个截止时间内服务请求,这个截止时间是可调整的,而默认读期限短于写期限.这样就防止了写操作因为不能被读取而饿死的现象.
Deadline对数据库环境(ORACLE RAC,MYSQL等)是最好的选择.
AS(预料I/O调度程序)
特点:
Anticipatory算法的核心是局部性原理,期望一个进程完成一次IO请求后还会继续发出IO请求,因此在一个请求完成后,会进入“假空闲”状态等待一段时间,如果等待周期内该进程有新的请求,则继续处理该进程的请求,如果没有新请求,这处理下一个进程的读写请求。
Anticipatory算法通过一定的读写延时来换去较高的IO吞吐,适合文件服务器。
Anticipatory算法对数据库环境表现很差。
Anticipatory算法从Linux 2.6.33版本后被移除
Anticipatory算法对数据库环境表现很差。
Anticipatory算法从Linux 2.6.33版本后被移除
====================================================================
SSD与IO调度
在 SSD 或者 Fusion IO,最简单的 NOOP 反而可能是最好的算法,因为其他三个算法的优化是基于缩短寻道时间的,而固态硬盘没有所谓的寻道时间且 I/O 响应时间非常短。
SSD在不同调度下的性能:
====================================================================
参考资料
http://www.cnblogs.com/cobbliu/p/5389556.html
http://scoke.blog.51cto.com/769125/490546
http://www.cnblogs.com/cobbliu/p/5389556.html
http://scoke.blog.51cto.com/769125/490546
https://dbarobin.com/2015/08/29/mysql-optimization-under-ssd/
====================================================================