银河麒麟V10 IO调度器配置:确认设备类型与调度器状态
这一步绝对不能跳过,否则后续的修改很可能无效,甚至引发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,说明内核已经绕过了调度层,这时强行改写会失败。
临时切换IO调度器(立即生效,重启失效)
这种方法适合快速验证效果或做紧急调优,无需重启,改动只对当前运行环境生效。
方法一:针对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】,说明该设备不支持所选算法,或者当前设备处于只读状态。
永久修改为全局默认IO调度器
这个方法适合硬件环境统一的生产服务器,比如全闪存数据库节点。它会让所有兼容块设备都采用同一个调度器。
第一步:编辑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]】。
