# :-: 磁盘IO调度算法
| 适用范围 | 适用版本 | 人员 | 发布时间 | 文档版本 |备注 |
| --- | --- | --- | --- | --- |--- |
| 服务器操作系统 | V10 | 王国武 |2022.4.6| V1.0|发布|
| 服务器操作系统 | V10 | 张志勇 |2022.4.6| V1.1|模板调整|
*****
### 1.IO调度算法
I/O 调度算法在各个进程竞争磁盘I/O的时候担当了裁判的角色。他要求请求的次序和时机做最优化的处理,以求得尽可能最好的整体I/O性能。
在麒麟v10操作系统中我们可以使用如下方法查看到系统支持哪几种磁盘I/O 调度算法,如下图所示:

我们能够看到系统支持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
- 常见问题
- 进入救援模式
- 进入单用户模式
- grub引导修复
- V10SP1-biosdevname解析
- 外设挂载和卸载
- audit关闭解决方案
- 终端无法切换
- 救援模式取数据
- 网卡更名操作
- 问题复现解决类
- xgboost复现解决步骤
- 激活类
- 麒麟服务器激活常用命令
- 服务器故障激活问题--须知
- 激活权限获得方式
- V10-SP系列服务器激活
- 银河麒麟高级服务器操作系统V7&V10激活手册
- shell脚本类
- 多网卡队列绑定CPU脚本
- 服务器健康检查脚本
- 服务安装配置类
- 银河麒麟高级服务器操作系统V10(sp1)安装手册
- LVM创建
- Chrony时间同步配置
- 搭建网络yum源
- PXE部署实施
- Man手册安装
- 部署VNC服务
- Kylin-Server-V10-SP1-0711-DNS服务单机部署文档
- 麒麟ks文件定制-封装iso文件
- iptables端口配置
- V10-SP1-aarch64安装jdk1.7
- 工具使用类
- cyclictest测试工具
- e2fsprogs工具介绍
- Logrotate工具说明
- nmon工具安装与使用
- 升、降级类
- rsyslog升级报告
- 性能优化类
- 日志轮转
- 大页内存与透明大页详解
- 优化磁盘IO调度方式
- core文件设置
- 分析报告类
- bond模式4协商不通排查
- audit内存泄露问题分析报告
- mate-indicators内核占用过高问题分析报告
- ansible问题-hostname以及lvol报错
- 关于Linux内存计算的说明
- 磁盘IO调度算法
- 硬件相关类
- 串口
- 网络相关类
- bond创建
- 在已配置好网络情况下添加路由
- 网卡配合网桥实现内网互通KVM虚拟机
- Bond模式4协商不通排查过程
- HA高可用
- kylin HA shell实践
- kylin HA概念性及shell使用
- 虚拟化
- KVM创建虚拟机(图形化操作)
- KVM创建虚拟机(命令操作)
- 容器类
- docker-runc升级
- docker基础镜像制作-服务器版
- 麒麟云平台
- USB3.0设备穿透方法(针对win10云主机穿透)
- 麒麟云平台开关机操作说明
- 技术演练
