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,能明显降低随机读的延迟