Linux磁盘IO调度器配置技巧 提升系统读写性能
运维Linux服务器的过程中,经常遇到高并发场景下磁盘读写延迟高、业务响应卡顿的问题,除了升级硬件,调整Linux磁盘IO调度器配置就能在不改动硬件的情况下,优化系统读写性能。本文针对内核3.10到6.x版本的Linux系统,讲解不同存储介质下的调度器选型与配置方法,适合需要优化磁盘IO性能的运维工程师、后端开发参考,不涉及硬件驱动层面的定制开发。针对Linux 5.x及以上内核的通用生产场景,NVMe/SATA SSD优先配置mq-deadline调度器,可有效降低IO延迟提升读写性能。
- 适用对象:Linux运维工程师、后端服务开发人员
- 适用环境:内核版本 3.10 ~ 6.x 的通用Linux发行版
- 本文不讨论:定制硬件驱动开发、分布式存储上层业务IO调优
Linux磁盘IO调度器核心类型与适用场景
调度器选型匹配是Linux磁盘IO性能优化的核心前提。
IO调度器是Linux内核中负责管理块设备IO请求队列的模块,会对待处理的IO请求做合并、排序、优先级调整,减少机械盘磁头无效移动,降低固态盘队列冲突,从而提升整体读写效率。不同IO调度器的设计目标不同,适配不同存储介质。
很多运维从业者会有疑问:调整Linux磁盘IO调度器一定能提升读写性能吗?答案是否定的,只有当业务已经出现可观测的IO延迟高、吞吐量不足问题,且当前使用的调度器与存储介质类型不匹配时,调整配置才能获得可感知的性能提升。
下表整理了主流Linux内核支持的IO调度器类型与适配场景,可直接对照选择:
| 调度器名称 | 适用存储介质 | 推荐业务场景 |
|---|---|---|
| mq-deadline | NVMe SSD、SATA SSD、SATA机械盘 | 数据库、Web服务、文件存储等绝大多数生产场景 |
| deadline | 单队列SSD、SATA机械盘 | 3.x ~ 4.x 版本老旧内核系统 |
| noop | 纯硬件RAID、ramdisk | IO调度完全由硬件完成,内核不需要做额外调度的场景 |
| kyber | 低速块设备 | 低延迟需求的轻负载业务场景 |
| cfq | SATA机械盘 | 老旧桌面系统,不推荐生产服务器使用 |
在常见的生产服务器部署场景下,5.0以上版本Linux内核,需要先查看存储介质类型再匹配对应调度器,能有效降低IO延迟提升读写性能。
查看当前Linux磁盘IO调度器配置
所有IO调度器配置修改前,都需要先确认当前目标磁盘使用的调度器,操作步骤清晰可直接执行。
执行命令 cat /sys/block/[你的设备名]/queue/scheduler,比如查看nvme0n1磁盘的当前配置,完整命令为:cat /sys/block/nvme0n1/queue/scheduler
输出结果中,带方括号标记的就是当前磁盘正在使用的调度器,比如输出 [mq-deadline] kyber bfq none,说明当前磁盘启用的调度器是mq-deadline。
修改Linux磁盘IO调度器配置方法
修改分为临时生效和永久生效两种方式,修改启动配置前建议备份原配置文件,避免系统启动异常。
临时修改适合做性能测试验证,修改后立即生效,重启系统后会恢复默认配置,命令格式为:echo [目标调度器] > /sys/block/[设备名]/queue/scheduler
永久修改有两种常用方式,分别适配全局默认配置和单磁盘自定义配置:
- 修改全局默认调度器:编辑grub配置文件,在
GRUB_CMDLINE_LINUX行追加参数elevator=[目标调度器],保存后执行update-grub(Debian系)或者grub2-mkconfig -o /boot/grub2/grub.cfg(RHEL系),重启后生效。 - 指定单块磁盘调度器:新建udev规则文件
/etc/udev/rules.d/60-ioscheduler.rules,添加规则ACTION=="add|change", KERNEL=="nvme[0-9]n[0-9]", ATTR{queue/scheduler}="mq-deadline",保存后执行udevadm trigger即可生效,不需要重启系统。
Linux磁盘IO调度器配置优化要点速览
- 先要确认当前系统内核版本和服务器存储介质类型,不同内核支持的调度器不同,不同存储的最优选择也不同
- 5.x以上多队列内核中,NVMe SSD优先选择mq-deadline,仅纯硬件IO卸载场景才推荐noop
- 修改调度器测试时优先用临时修改方式,验证性能符合预期后再改成永久配置,避免直接改启动配置出问题
- 多块不同类型磁盘可以配置不同调度器,通过udev规则指定,不会影响全局默认配置
- 通用场景下默认调度器已经足够,只有当业务出现明确的IO延迟高、吞吐量不够的问题时再调整
- 老旧内核的机械盘优先选deadline,不推荐默认的cfq,能明显降低随机读的延迟