# :-: 磁盘IO调度算法 | 适用范围 | 适用版本 | 人员 | 发布时间 | 文档版本 |备注 | | --- | --- | --- | --- | --- |--- | | 服务器操作系统 | V10 | 王国武 |2022.4.6| V1.0|发布| | 服务器操作系统 | V10 | 张志勇 |2022.4.6| V1.1|模板调整| ***** ### 1.IO调度算法 I/O 调度算法在各个进程竞争磁盘I/O的时候担当了裁判的角色。他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能。 在麒麟v10操作系统中我们可以使用如下方法查看到系统支持哪几种磁盘I/O 调度算法,如下图所示: ![](https://img.kancloud.cn/9e/f9/9ef91bb894635f52a2a6bfed91adc65b_537x69.png) 我们能够看到系统支持mq-deadline, kyber, bfq,none四种调度算法,下面对四种调度算法简单描述。 ### 2.调度算法介绍 2.1 mq-deadline 在说mq-deadline之前先说一下deadline 调度程序,deadline是面向延迟的I / O调度程序。每个I / O请求都有一个截止日期。通常,请求存储在按扇区号排序的队列(读和写)中。该deadline算法维护两个附加队列(读和写),在其中按截止时间对请求进行排序。只要没有请求超时, 就会使用“扇区”队列。发生超时时,将处理“截止日期”队列中的请求,直到不再有过期的请求为止。通常,算法优先于读取而不是写入。 mq-deadline调度程序是面向延迟的I / O调度程序。它是deadline对blk-mq I / O路径的调度程序的修改,以支持多线程。 2.2 kyber kyber调度程序使用基于令牌的系统来管理请求。需要排队令牌来分配请求,而调度令牌用于限制特定优先级操作。kyber调度程序还定义了目标延迟,并进行自我调整以达到目标。kyber调度程序的唯一两个可调参数是读取和同步写入的目标延迟。read_lat_nsec 读取的目标等待时间(以纳秒为单位)。write_lat_nsec 同步写入的目标延迟(以纳秒为单位). kyber其灵感来自用于网络路由的主动队列管理技术。该实现基于用作限制请求机制的“令牌”。需要一个排队令牌来分配一个请求,这用于防止请求饥饿。还需要一个调度令牌,该令牌会限制给定设备上特定优先级的操作。最后,定义了目标读取延迟,并且调度程序对其进行了调整以达到此延迟目标。该算法的实现相对简单,并且被认为对快速设备有效。 2.3 bfq 自从4.12内核发行以来,bfq是按比例分配的I / O调度程序,可用于块设备。它将每个进程或进程组与权重相关联,并授予与该权重成比例的一部分可用I / O带宽。bfq还尝试使对时间敏感的应用程序最大化系统响应能力,并最大程度地减少延迟。最后,bfq旨在提高吞吐量并提高运行效率。在所有这些标准方面,一组新的更改已改善了bfq的性能。特别是,它们在处理此I / O调度程序最具挑战性的工作负载的同时,增加了BFQ达到的吞吐量。 bfq基于cfq代码。它不会将磁盘分配给固定时间段的每个进程,而是为该进程分配按扇区数衡量的预算。此调度程序适用于复制大文件,并且在这种情况下系统不会无响应。 2.4 none 在上面看到cat /sys/block/sda/queue/scheduler 时最后一个显示的none ,其实这个none是一个实现先进先出(FIFO)调度算法。它通过一个简单的最新命中缓存在通用块层合并请求。 ### 3.调度算法运用场景 如下是针对不同场景使用何种调度建议选择,如下表所示: | 场景 | 调度策略 | | --- | --- | | 具有SCSI接口的传统HDD | 使用mq-deadline或bfq | | 高性能SSD或具有快速存储功能的CPU绑定系统 | 使用none,尤其是在运行企业应用程序时。或者,使用kyber。 | | 桌面或多交互任务 | 使用bfq | | 虚拟化 | 使用 mq-deadline使用主机总线适配器(HBA)驱动程序, 使用 none | 具体的配置需要根据自己程序的读写特点分别测试,这个表只是个参考。 4.参考资料 https://lwn.net/Articles/784267/ https://wiki.ubuntu.com/Kernel/Reference/IOSchedulers https://help.marklogic.com/Knowledgebase/Article/View/8/0/notes-on-io-schedulers https://wiki.archlinux.org/index.php/Improving_performance#Input/output_schedulers