linux中ssd/nvme或虚拟化环境应设为noop或deadline调度器以降延迟;先用lsblk和cat /sys/block/*/queue/scheduler确认设备类型与当前调度器,再临时echo修改或通过udev永久配置。

在Linux中修改IO调度算法为Noop或Deadline,主要适用于SSD、NVMe设备或虚拟化环境(如KVM、容器宿主机),能降低IO延迟、减少内核调度开销。关键不是盲目切换,而是先确认设备类型和当前调度器,再按需调整。
确认当前IO调度器和设备类型
不同存储介质适用不同调度器:传统机械硬盘(HDD)适合CFQ(旧内核)或BFQ(新内核),而SSD/NVMe/虚拟磁盘无寻道延迟,Noop或Deadline更合适。
- 查看当前所有块设备的调度器:
cat /sys/block/*/queue/scheduler - 识别设备类型(例如
sda是否为SSD):
lsblk -d -o NAME,ROTA,TYPE(ROTA=0表示非旋转介质,即SSD/NVMe) - 查看具体设备(如
nvme0n1)的当前调度器:
cat /sys/block/nvme0n1/queue/scheduler
临时修改调度器(重启失效)
适用于测试效果或调试,无需重启,立即生效但仅限当前会话。
- 将
sda设为deadline:
echo deadline > /sys/block/sda/queue/scheduler - 将
nvme0n1设为noop(NVMe设备推荐):
echo noop > /sys/block/nvme0n1/queue/scheduler - 验证是否生效:
cat /sys/block/sda/queue/scheduler(输出应显示[deadline])
永久生效(开机自动设置)
需通过内核启动参数或udev规则实现,推荐使用udev方式,更灵活、不依赖特定内核版本。
- 创建udev规则文件:
sudo tee /etc/udev/rules.d/60-io-scheduler.rules - 写入规则(以SSD设备
sdb为例):
ACTION=="add|change", KERNEL=="sdb", ATTR{queue/scheduler}="deadline" - 对NVMe设备可写:
ACTION=="add|change", KERNEL=="nvme[0-9]n[0-9]", ATTR{queue/scheduler}="noop" - 重载udev规则并触发应用:
sudo udevadm control --reload-rules && sudo udevadm trigger --subsystem-match=block
Noop vs Deadline 怎么选?
Noop最轻量,只做简单的FIFO队列,适合IO路径已高度优化的场景(如NVMe、某些RAID卡、云盘);Deadline带超时机制,防止读写饥饿,对混合IO负载更稳健,适合SATA SSD或IO模式较复杂的虚拟机磁盘。
- 优先选noop:NVMe设备、容器镜像层、Kubernetes节点本地存储
- 倾向deadline:SATA SSD、存在大量随机小IO+顺序大IO混合场景、旧版内核(
- 不建议在HDD上用这两个——可能反而增加延迟











