银河麒麟V10磁盘I/O调度算法修改指南
确认当前设备类型与调度器状态 此步骤不可跳过,否则后续修改可能无效,甚至引发IO阻塞。银河麒麟V10对不同设备默认启用的调度器可能不同,需先锁定目标盘并验证其物理属性。 执行命令列出所有块设备:ls /sys/block/ 查看目标设备(例如sda)是否为旋转介质:cat /sys/block/sd
确认当前设备类型与调度器状态
此步骤不可跳过,否则后续修改可能无效,甚至引发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],说明系统已默认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]】。
