linux内核io调度算法

1. io调度算法简单介绍

noop(elevator) 电梯调度

所有进程的io请求都进入FIFO队列,完全按照队列的顺序进行io的读取,会进行请求的合并以及在队列的重排序,但是主要还是遵循FIFO的原则,算法缺点也很明显,会导致靠后的io请求饥饿,以及对io请求都会进行disk seek(磁盘的定位)产生大量的寻道时间

CFQ (complete fair queue) 完全公平队列

针对同步请求时,CFQ会根据当前进程的io优先级进行调度时间的分配,CFQ会给每个进程分配一个io请求的时间片来处理当前进程的io请求,在同步请求上的公平是体现在同一进程中的

针对进程的异步请求时,CFQ会有一组公共三个level优先级并且内部还有存有自身的优先级的等待队列 RT(real time) BT(best try) ID( idle)。8个RT + 8个BT + 1个ID队列。os根据队列的优先级作为调整因素进行io的读写操作

DEADLINE

该算法实际是对Noop算法的改进。在CFQ队列的前提下增加了增加了读队列、写队列,然后其余的操作是按照CFQ队列进行。并且优先级排序:Read queue > Write queue > CFQ queue,注意读队列会有一个读延时默认5ms的设置,超过这个时间后,会优先考虑该队列里的io操作,写超时是5s级别,之所以这么设计的前提是,大部分系统调用时,读操作都是进行io等待,而写操作不需要内核进行响应,应用程序就可以直接返回了,os在根据调度将写操作进行

ANTICIPATORY

该io调度算法在DEADLINE的前提下,增加了一个特殊处理。就是每个io读请求后的特定时间窗口内(默认6ms可调整)存在临近扇区的io操作,那么会将读io操作合并进行处理。

2.对于应用进行io调度算法的选择

首先我们需要了解各算法的优劣势以及结合应用的特点并且要清楚知道储存介质是HDD或SSD。

CFQ的缺点很明显,由于是完全公平队列,那么必然会存在io请求饥饿的情况,但它确是很合适通用服务器的io算法选择。随机的io读写,当我们在不知道应用具体情况下时,可以使用这种linux2.6的内核版本默认的io算法

Noop电梯调度算法,缺点也是同样的显而易见,io请求饥饿以及每次请求都需要寻道。但是如果针对的是ssd硬盘。这种算法是最简单也是最有效的,因为ssd不存在传统hdd的寻道时间

DEADLINE算法,是针对CFQ以及Noop的优化,优点很明显,在读多写少的应用场景下该算法可以发挥很好的性能,但是如果是针对一些磁盘异步写binlog日志或者刷盘处理的应用需要慎重使用,因为该算法可能存在丢失数据的风险。

ANTICIPATORY算法由于其他算法都是针对零散的随机读写操作进行的优化而该因为存在一个读窗口时间,在随机IO以及针对大量的顺序读时是很好的io算法选择

除了以上分析以外,任何我们理论上的结论都需要我们以实际的实验的benchmark为准!

3.具体linux如何查看以及设置io算法

可以看到[deadline]是目前os选择的io算法。我这里只显示了三种算法,这是具体根据linux内核版本决定的,而且上面的介绍都是针对一定Linux内核版本来说。如果要确认具体的行为实现请一定参考内核源码,本人功力有限。

选择具体的io算法:

echo deadline > /sys/block/sda/queue/scheduler 

  • 2
    点赞
  • 10
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Linux内核IO(Input/Output)是指Linux操作系统中负责处理输入和输出设备的模块。它提供了统一的接口和机制,让应用程序可以与硬件设备进行通信。 Linux内核IO模块包括以下几个重要组件: 1. 设备驱动程序:设备驱动程序是连接硬件设备和操作系统的桥梁。它将硬件设备的特定操作转化为通用的IO接口,使得应用程序可以通过统一的接口访问设备。Linux内核提供了丰富的设备驱动程序,支持各种硬件设备,如磁盘驱动、网络驱动等。 2. 文件系统:Linux内核支持多种文件系统,如ext4、NTFS、FAT等。文件系统提供了对存储设备的访问和管理,包括文件的创建、读取、写入以及目录的管理等。应用程序可以通过文件系统接口进行文件的IO操作。 3. IO调度器:IO调度器是负责管理硬盘IO请求的模块。它根据一定的策略对IO请求进行排序和调度,以提高磁盘的性能和效率。常见的IO调度算法有CFQ(Completely Fair Queuing)、Deadline、NOOP等。 4. 块设备层:块设备层是Linux内核中处理块设备(如硬盘)IO的模块。它提供了对块设备的抽象和管理,包括块设备的注册、IO请求的处理等。应用程序可以通过块设备层接口进行块设备的读写操作。 总的来说,Linux内核IO模块是一个庞大而复杂的系统,它提供了丰富的接口和机制,使得应用程序可以方便地与各种硬件设备进行通信和交互。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值