新闻中心 分类>>

如何设置磁盘调度 修改IO调度算法

2025-08-23 00:00:00
浏览次数:
返回列表

查看当前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

搜索