Linux磁盘IO调度器配置技巧 提升系统读写性能

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,能明显降低随机读的延迟
相关推荐
Sokach10159 小时前
Linux Shell 脚本从零到能用:一个新手的一天学习总结
linux
SelectDB1 天前
Litefuse 开源并推出单进程轻量模式,25 秒就能跑起来的 Agent 可观测与评估平台
运维·后端·自动化运维
AlfredZhao1 天前
Docker 容器时区不对,`timedatectl` 不存在怎么办?
linux·timezone
zzzzzz3102 天前
9K Star 炸裂开源!这个 C 语言写的代码知识图谱,把 Linux 内核索引压缩到了 3 分钟
linux·服务器·sql
XIAOHEZIcode2 天前
Linux系统鼠标偏移常见原因以及修复方案
linux·运维·游戏
用户0328472220703 天前
如何搭建本地yum源(上)
运维
A小辣椒4 天前
TShark:Wireshark CLI 功能
linux
A小辣椒4 天前
TShark:基础知识
linux
AlfredZhao4 天前
OCI 明明分配了 200G 系统盘,为什么 df 只看到 30G?
linux·oci
AlfredZhao5 天前
vi 删除指定范围的行,不用再反复按 dd
linux·vi