CFQ
CFQ(Completely Fair Queuing)把I/O请求 按照进程 分别放入进程对应的队列中,所以A进程和B进程发出的I/O请求会在两个队列中。而各个队列内部仍然采用 合并和排序 的方法,区别仅在于,每一个提交I/O请求的进程都有自己的I/O队列。CFQ的“公平”是针对进程而言的,它以时间片算法为前提,轮转调度队列,默认从当前队列中取4个请求处理,然后处理下一个队列的4个请求。这样就可以确保每个进程享有的I/O资源是均衡的。CFQ的缺点是先来的IO请求不一定能被及时满足,可能出现 饥饿 的情况。
Deadline
对 CFQ 饥饿的改进算法,除了维护一个拥有合并和排序功能的请求队列以外,还额外维护了两个队列,分别是 读请求队列 和 写请求队列 ,它们都是 带有超时的FIFO队列。当新来一个I/O请求时,会被同时插入普通队列和读/写队列,然后处理普通队列中的请求。FIFO队列内的IO请求优先级要比CFQ队列中的高,而读FIFO队列的优先级又比写FIFO队列的优先级高。当调度器发现读/写请求队列中的请求超时的时候,会优先处理这些请求,保证尽可能不产生请求饥饿。在DeadLine算法中,每个I/O请求都有一个超时时间,默认 读请求是500ms ,写请求是5s。对数据库这种随机读写的场景最有利的算法是DEANLINE,其吞吐量和响应时间都表现良好。Hypervisor 主机也比较适合 deadline 算法。
Noop
Noop做的事情非常简单,它不会对I/O请求排序也不会进行任何其它优化(除了合并),直接以类似FIFO的顺序提交I/O请求。Noop面向的不是普通的块设备,而是随机访问设备(例如SSD),对于这种设备,不存在传统的寻道时间,那么就没有必要去做那些多余的为了减少寻道时间而采取的事情了。而虚拟机GUEST最终是使用物理机的磁盘落盘,由物理机的调度算法来实现,其本身不需要缓存,所以使用noop算法,如果虚拟机直接使用的磁盘,则按照物理机使用磁盘的情况进行调优,比如,如果提供磁盘的 SAN 存储具有很强调度功能的控制器,其本身就具有很强的IO调度功能,则使用 NOOP,否则使用 CFQ 或者 Deadline。
Deadline 比 CFQ 性能提升可达 10% 几,NOOP 和 deadline 差别不是很大,百分之一二。