Akemi

I/O调优--多队列IO调度器

2025/05/27

RHEL8包含四种多队列I/O调度器设置:mq-deadline、kyber、bfq和none。每种调度器在特定设备上都具有性能优势,选择调度器必须基于生产存储系统上的基准测试。

mq-deadline

  • 核心思想:给每个I/O请求设定一个“最后期限”,优先处理快超时的请求。
  • 适用场景:机械硬盘(HDD)、传统磁盘等顺序读写性能敏感的设备。

减少磁头来回跑动的次数,提升效率

kyber

  • 核心思想:实时监控IO延迟,动态调整队列深度
  • 适用场景:NVMe SSD 等快速存储设备。

bfq

  • 核心思想:保证每个进程公平分享IO资源
  • 适用场景:桌面系统、多任务环境
  • 优点:公平性最佳,适合“多任务打架”的场景。
  • 缺点:对纯高性能场景(如数据库服务器)可能效率略低。

none(无调度器)

  • 核心思想:完全不用调度器
  • 适用场景:超高速设备(如顶级企业级 SSD)或需要应用自行优化的情况。
调度器 核心目标 适用设备 比喻
mq-deadline 最小化寻道时间 机械硬盘(HDD) 传统快递站,按区域分拣包裹
kyber 动态调控延迟 NVMe SSD 智能调控的高科技快递中心
bfq 公平分配 I/O 资源 多任务桌面系统 公平服务所有客户的快递站
none 零调度开销 顶级企业级 SSD 全自动机器人分拣流水线

可调优参数

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
# 查看当前调度器
cat /sys/block/vda/queue/scheduler
[mq-deadline] kyber bfq none

# 可调参数
ls /sys/block/vda/queue/iosched/
async_depth fifo_batch front_merges read_expire write_expire writes_starved

async_depth 控制「异步请求」(比如后台写入)的队列深度
增大此值可以提高吞吐量,但可能增加延迟

fifo_batch 一次批量处理多少个 I/O 请求
增大此值可提升吞吐量(适合顺序读写),但可能增加延迟

front_merges 是否允许将新请求合并到已有请求的
默认打开,适用HDD

read_expire 读请求的最大等待时间(单位:毫秒),超时的读请求会被优先处理
默认500毫秒

write_expire 写请求的最大等待时间
默认为5000毫秒

writes_starved 在优先处理读请求之前,最多允许连续处理多少个写请求
默认为2,增大此值会让写请求更积极

上面这一部分都可以通过tuned配置文件来配置
参数 作用方向 典型调整场景
async_depth 控制异步请求队列深度 高吞吐后台任务
fifo_batch 批量处理请求数量 顺序读写优化
front_merges 允许向前合并请求 机械硬盘减少寻道时间
read_expire 读请求超时时间 降低读延迟(如桌面系统)
write_expire 写请求超时时间 允许写请求批量提交
writes_starved 写请求被读请求饿死的忍耐度 平衡读写优先级

tuned调整调度器

在tuned中,默认提供了两种I/O调优策略

1
2
3
4
tuned-adm list
- latency-performance - Optimize for deterministic performance at the cost of increased power consumption
- throughput-performance - Broadly applicable tuning that provides excellent performance across a variety of common server workloads
...

也可以tuned自定义模式中,定义使用的IO调度器

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
mkdir /etc/tuned/custom-iosched
vim /etc/tuned/custom-iosched/tuned.conf
[main]
summary=Custom I/O Scheduler Profile for NVMe SSD

[disk]
# 设置所有磁盘的 I/O 调度器为 mq-deadline
devices=*
sysfs.scheduler=mq-deadline

# 可选:针对特定磁盘(如 nvme0n1)
# devices=nvme0n1
# sysfs.scheduler=kyber

tuned-adm profile custom-iosched
sudo systemctl restart tuned

CATALOG
  1. 1. mq-deadline
  2. 2. kyber
  3. 3. bfq
  4. 4. none(无调度器)
  5. 5. 可调优参数
  6. 6. tuned调整调度器