应根据存储介质类型选择匹配的i/o调度器:hdd用bfq、sata ssd用mq-deadline、nvme用none,选错导致吞吐下降20%以上;需先通过rotational属性确认设备类型,再用临时命令或udev规则精准配置,避免全局设置引发性能劣化。

如果您在银河麒麟V10操作系统中运行数据库、虚拟机或高IO负载服务,但观察到磁盘响应延迟升高、iostat显示await异常偏高、或iotop中出现大量请求堆积,说明当前I/O调度算法可能未匹配您的存储介质与业务特征——HDD用bfq、SATA SSD用deadline、NVMe用none,选错会导致吞吐下降20%以上。
确认当前设备类型与调度器状态
这一步不能跳过,否则后续修改可能无效甚至引发IO阻塞。银河麒麟V10默认对不同设备启用不同调度器,需先定位目标盘并验证其物理属性。
执行命令列出所有块设备:ls /sys/block/
查看目标设备(如sda)是否为旋转介质:cat /sys/block/sda/queue/rotational。返回【1】表示是HDD,【0】表示SSD/NVMe。
读取当前调度器:cat /sys/block/sda/queue/scheduler。输出形如[bfq] mq-deadline kyber none——方括号内为生效项;若显示【[none]】且设备为NVMe,说明已绕过内核调度层,此时强行改写将失败。
临时切换调度器(立即生效,重启失效)
适用于快速验证效果或紧急调优,无需重启,但仅作用于当前运行时。
方法一:针对SATA SSD或数据库盘,设为mq-deadline
sudo sh -c 'echo mq-deadline > /sys/block/sda/queue/scheduler'
方法二:针对NVMe盘,设为none(注意:部分NVMe驱动不接受写入,若cat后仍显示[none]则属正常)
sudo sh -c 'echo none > /sys/block/nvme0n1/queue/scheduler'
方法三:针对老旧HDD服务器,设为bfq(需确认内核支持:cat /sys/block/sda/queue/scheduler中含bfq才可用)
sudo sh -c 'echo bfq > /sys/block/sdb/queue/scheduler'
验证是否成功:cat /sys/block/sda/queue/scheduler,必须看到新调度器被方括号包裹。若报错【Invalid argument】,说明该设备不支持所选算法或当前处于只读状态。
永久修改为全局默认调度器
此操作影响所有兼容块设备,适合统一硬件环境的生产服务器,例如全闪存数据库节点。
第一步:编辑GRUB配置文件
sudo vim /etc/default/grub
第二步:找到GRUB_CMDLINE_LINUX行,在引号内末尾添加空格分隔的参数,例如:
GRUB_CMDLINE_LINUX="... elevator=mq-deadline"
第三步:更新引导配置
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
第四步:重启系统
sudo reboot
注意:该方式无法区分HDD与SSD——若系统混用多种介质,此法会强制NVMe也走mq-deadline,反而降低性能。混用场景请跳过此节,直接使用udev规则。
按设备类型差异化设置(推荐用于混合存储)
当一台麒麟V10服务器同时挂载SATA SSD(sdb)和NVMe盘(nvme0n1)时,必须用udev规则分别指定调度器,否则全局设置必然牺牲某类设备性能。
创建规则文件:sudo tee /etc/udev/rules.d/60-io-scheduler.rules
写入以下内容(根据实际设备名调整):
ACTION=="add|change", KERNEL=="sdb", ATTR{queue/scheduler}="mq-deadline"
ACTION=="add|change", KERNEL=="nvme0n1", ATTR{queue/scheduler}="none"
重载规则并触发应用:sudo udevadm control --reload-rules && sudo udevadm trigger --subsystem-match=block
验证:拔插对应磁盘或重启后执行cat /sys/block/sdb/queue/scheduler和cat /sys/block/nvme0n1/queue/scheduler,应分别显示【[mq-deadline]】和【[none]】。











