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-ioschedvim /etc/tuned/custom-iosched/tuned.conf [main] summary=Custom I/O Scheduler Profile for NVMe SSD [disk] devices=* sysfs.scheduler=mq-deadline tuned-adm profile custom-iosched sudo systemctl restart tuned