Linux I/O 调度器选择与优化

I/O 调度器是 Linux 内核中负责管理磁盘 I/O 请求队列的组件,它决定了磁盘读写请求的排序和分发策略。在搬瓦工 VPS 上选择合适的 I/O 调度器,可以显著提升数据库、Web 应用和文件服务的磁盘性能。本文将详解各调度器的工作原理及最佳使用场景。

一、I/O 调度器概述

Linux 内核提供两代 I/O 调度框架:

  • 传统单队列(Legacy):cfq、deadline、noop,在较旧的内核中使用。
  • 多队列(blk-mq):none、mq-deadline、bfq、kyber,现代内核的标准框架。

搬瓦工 VPS 使用的 KVM 虚拟化通常配备 SSD 存储,现代 Linux 发行版默认使用 blk-mq 多队列框架。

查看当前 I/O 调度器

# 查看指定磁盘的调度器(方括号表示当前使用的)
cat /sys/block/vda/queue/scheduler

# 示例输出:[mq-deadline] kyber bfq none

# 查看所有块设备的调度器
for dev in /sys/block/*/queue/scheduler; do
  echo "$dev: $(cat $dev)"
done

二、多队列调度器详解

2.1 none(noop)

none 调度器不做任何排序或合并操作,I/O 请求直接传递给底层驱动。这是最简单的调度器,开销最低。

适用场景:

  • SSD/NVMe 等不需要寻道优化的存储设备。
  • 虚拟机环境中宿主机已有调度器的场景。
  • 追求最低延迟和最高 IOPS 的场景。

2.2 mq-deadline

mq-deadline 是经典 deadline 调度器的多队列版本。它为读写请求分别维护队列,并为每个请求设置截止时间(读默认 500ms,写默认 5000ms),确保请求不会被无限期推迟。

适用场景:

  • 数据库工作负载(MySQL、PostgreSQL 等)。
  • 对延迟敏感的应用。
  • SSD 和 HDD 均适用,是一个通用的好选择。

2.3 BFQ(Budget Fair Queuing)

BFQ 为每个进程分配 I/O 预算,确保各进程公平地共享磁盘带宽。它特别适合交互式场景,能保证系统响应性。

适用场景:

  • 多用户共享的系统。
  • 需要保证 I/O 公平性的场景。
  • 桌面系统(确保后台任务不影响前台响应)。

BFQ 的 CPU 开销较高,对于高 IOPS 的 SSD 可能成为瓶颈。

2.4 Kyber

Kyber 是一个轻量级调度器,通过限制分发队列的深度来控制延迟。它将请求分为同步(读)和异步(写)两类,分别设置目标延迟。

适用场景:

  • 高性能 NVMe SSD。
  • 延迟敏感且高吞吐的场景。
  • CPU 开销介于 none 和 mq-deadline 之间。

三、切换 I/O 调度器

3.1 临时切换

# 切换到 none 调度器
echo none > /sys/block/vda/queue/scheduler

# 切换到 mq-deadline
echo mq-deadline > /sys/block/vda/queue/scheduler

# 验证切换结果
cat /sys/block/vda/queue/scheduler

3.2 永久设置

通过 udev 规则持久化调度器设置:

# 为 SSD 设置 none 调度器
cat > /etc/udev/rules.d/60-scheduler.rules <<'EOF'
# SSD 使用 none 调度器
ACTION=="add|change", KERNEL=="vd[a-z]", ATTR{queue/rotational}=="0", ATTR{queue/scheduler}="none"
# HDD 使用 mq-deadline 调度器
ACTION=="add|change", KERNEL=="sd[a-z]", ATTR{queue/rotational}=="1", ATTR{queue/scheduler}="mq-deadline"
EOF

# 重新加载 udev 规则
udevadm control --reload-rules
udevadm trigger

也可以通过内核启动参数设置:

# 编辑 GRUB 配置
nano /etc/default/grub

# 在 GRUB_CMDLINE_LINUX 中添加
GRUB_CMDLINE_LINUX="elevator=none"

# 更新 GRUB
update-grub

四、调度器参数调优

4.1 mq-deadline 参数

# 查看 mq-deadline 参数
ls /sys/block/vda/queue/iosched/

# 读请求截止时间(毫秒)
echo 100 > /sys/block/vda/queue/iosched/read_expire

# 写请求截止时间(毫秒)
echo 1000 > /sys/block/vda/queue/iosched/write_expire

# 连续读/写请求批次大小
echo 16 > /sys/block/vda/queue/iosched/fifo_batch

# 写请求饥饿阈值
echo 2 > /sys/block/vda/queue/iosched/writes_starved

4.2 BFQ 参数

# 后端设备深度
echo 64 > /sys/block/vda/queue/iosched/back_seek_max

# 严格保证模式
echo 0 > /sys/block/vda/queue/iosched/strict_guarantees

# 低延迟模式
echo 1 > /sys/block/vda/queue/iosched/low_latency

4.3 通用队列参数

# 队列深度(NVMe SSD 可设置更高)
echo 256 > /sys/block/vda/queue/nr_requests

# 最大扇区数
echo 1024 > /sys/block/vda/queue/max_sectors_kb

# 预读大小(KB)
echo 256 > /sys/block/vda/queue/read_ahead_kb

# 关闭随机读优化(SSD 不需要)
echo 0 > /sys/block/vda/queue/add_random

五、搬瓦工 VPS 推荐配置

搬瓦工 KVM 方案使用的是 SSD 存储,虚拟磁盘设备通常为 vda。针对不同场景的推荐配置:

通用 Web 服务器

# SSD + 虚拟化环境推荐 none 或 mq-deadline
echo mq-deadline > /sys/block/vda/queue/scheduler
echo 128 > /sys/block/vda/queue/nr_requests
echo 256 > /sys/block/vda/queue/read_ahead_kb

数据库服务器

# 数据库场景优先保证读延迟
echo mq-deadline > /sys/block/vda/queue/scheduler
echo 50 > /sys/block/vda/queue/iosched/read_expire
echo 500 > /sys/block/vda/queue/iosched/write_expire
echo 256 > /sys/block/vda/queue/nr_requests

六、性能测试与对比

# 安装 fio 测试工具
apt install fio -y

# 随机读写测试
fio --name=randmixed --ioengine=libaio --iodepth=64 --rw=randrw \
  --rwmixread=70 --bs=4k --size=1G --numjobs=4 \
  --runtime=60 --group_reporting --filename=/tmp/fio-test

# 顺序写测试
fio --name=seqwrite --ioengine=libaio --iodepth=32 --rw=write \
  --bs=128k --size=1G --numjobs=1 \
  --runtime=60 --group_reporting --filename=/tmp/fio-test

# 清理测试文件
rm -f /tmp/fio-test

在每个调度器下分别运行上述测试,对比 IOPS、吞吐量和延迟指标,选择最适合你业务场景的调度器。

总结

I/O 调度器的选择需要根据存储类型和工作负载来决定。对于搬瓦工 VPS 的 SSD 存储,nonemq-deadline 是最佳选择。配合 内核参数调优Ext4 文件系统优化,可以全面提升磁盘 I/O 性能。选购搬瓦工 VPS 请查看 全部方案,购买时使用优惠码 NODESEEK2026 可享受 6.77% 的折扣,通过 bwh81.net 访问官网。

关于本站

搬瓦工VPS中文网(bwgvps.com)是非官方中文信息站,整理搬瓦工的方案、优惠和教程。我们不销售主机,不提供技术服务。

新手必读
搬瓦工优惠码

NODESEEK2026(优惠 6.77%)

购买时填入即可抵扣。