查看当前i/o调度算法可通过命令cat /sys/block/sda/queue/scheduler,方括号中为当前使用的调度器;2. 常见调度器包括noop、deadline、cfq、bfq和none,各自适用于不同硬件与场景;3. 临时修改使用echo deadline > /sys/block/sda/queue/scheduler,需root权限且重启失效;4. 永久修改可通过在grub配置中添加elevator=deadline参数或创建udev规则实现;5. 推荐根据场景选择调度器:hdd多任务用deadline或bfq,ssd/nvme用noop或none,数据库用deadline,虚拟机用noop,桌面用bfq,修改前应通过iostat、iotop等工具测试实际性能表现以确定最优方案。

在Linux系统中,磁盘I/O调度算法(也称为电梯算法)决定了内核如何对块设备的读写请求进行排序和处理。合理选择和设置I/O调度器可以显著影响系统性能,尤其是在高负载或特定应用场景(如数据库、虚拟化、大文件读写)中。
以下是设置和修改磁盘I/O调度算法的方法:
一、查看当前I/O调度算法
要查看某个磁盘当前使用的调度器,可以使用以下命令:
cat /sys/block/sda/queue/scheduler
输出示例:
noop deadline [cfq] bfq
- 方括号
[]
中的是当前正在使用的调度器(如cfq
)。 - 其他是可用的调度器。
注意:不同内核版本支持的调度器可能不同,sda 请替换为你的实际设备名(如 nvme0n1、sdb 等)。
二、常见的I/O调度算法
Linux常见的调度器有以下几种:
- noop:最简单的调度器,仅合并相邻的请求,不做排序。适合SSD、NVMe等无机械寻道的设备,或虚拟机中(由底层宿主处理调度)。
- deadline:保证请求在一定时间内被处理,避免饥饿。适合数据库类应用,强调低延迟。
- cfq(Completely Fair Queuing):为每个进程分配I/O队列,力求公平。在旧版内核中默认,但已被逐步淘汰。
- bfq(Budget Fair Queueing):cfq的现代替代,更精细控制带宽分配,适合桌面交互场景。
- none:用于非传统块设备(如某些NVMe设备),由设备自身管理调度。
三、临时修改I/O调度器(重启失效)
要临时更改某个磁盘的调度器,例如将
sda的调度器改为
deadline:
echo deadline > /sys/block/sda/queue/scheduler
注意:需要 root 权限,使用
sudo或在 root 下执行。
验证是否更改成功:
cat /sys/block/sda/queue/scheduler
你会看到:
noop [deadline] cfq bfq
四、永久修改I/O调度器
临时修改在重启后会失效。要永久生效,有以下几种方式:
1. 通过内核启动参数(推荐)
编辑GRUB配置文件:
sudo vim /etc/default/grub
找到
GRUB_CMDLINE_LINUX行,添加调度器参数:
GRUB_CMDLINE_LINUX="elevator=deadline"
保存后更新GRUB配置:
-
Ubuntu/Debian:
sudo update-grub
-
CentOS/RHEL:
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
重启后,所有块设备将默认使用
deadline调度器。
2. 使用udev规则(按设备设置)
如果你只想对特定设备(如
sda)设置调度器,可创建udev规则。
创建规则文件:
sudo vim /etc/udev/rules.d/60-scheduler.rules
添加内容(以
sda使用
deadline为例):
ACTION=="add|change", KERNEL=="sda", ATTR{queue/scheduler}="deadline"支持通配符,例如对所有SCSI设备:
ACTION=="add|change", SUBSYSTEM=="block", KERNEL=="sd*", ATTR{queue/scheduler}="deadline"保存后,重启或重新加载udev规则:
sudo udevadm control --reload-rules
下次设备加载时会自动应用。
五、不同场景的调度器选择建议
| 场景 | 推荐调度器 | 原因 |
|---|---|---|
| 机械硬盘(HDD) + 多任务 | @@######@@ 或 @@######@@ | 减少寻道,保证响应 |
| 固态硬盘(SSD)/NVMe | @@######@@ 或 @@######@@ | 无机械延迟,无需复杂调度 |
| 数据库服务器 | @@######@@ | 避免I/O延迟波动 |
| 虚拟机Guest系统 | @@######@@ | 调度由宿主完成 |
| 桌面系统 | @@######@@ | 提升交互响应 |
基本上就这些。修改调度器不复杂,但需结合硬件和应用特点选择。建议先测试不同调度器在实际负载下的表现(可用
deadline、
bfq监控),再决定最优方案。
noop
none
deadline
noop
bfq
iostat
iotop










