银河麒麟v10中需按存储介质匹配i/o调度算法:nvme盘用none,ssd优选kyber,hdd或sata ssd用mq-deadline;须先查/sys/block/xxx/queue/scheduler确认支持项,再临时或永久配置。

如果您在银河麒麟V10系统中运行数据库、大数据或高I/O负载服务,发现磁盘响应延迟升高、吞吐量下降或写入卡顿,很可能是当前I/O调度算法未匹配存储介质特性——比如给NVMe盘用了bfq,或给HDD用了none,导致内核排队策略与硬件物理特性错配。
确认当前设备支持的调度器及生效项
这一步必须先做,不能跳过。不同内核版本、不同设备类型(sda/sdb/nvme0n1)暴露的可用调度器列表可能完全不同,盲目修改会导致写入失败或报错“Invalid argument”。
执行ls /sys/block/列出所有块设备名称,例如看到sda、nvme0n1、dm-0等。
对目标设备(如数据库所在盘sda)执行:cat /sys/block/sda/queue/scheduler。
输出形如[mq-deadline] kyber bfq none,方括号内为当前生效算法;若显示none [kyber],说明已启用kyber但括号位置不对——这是旧内核误报,实际以方括号为准。
【注意:不要对LVM逻辑卷(如/dev/mapper/klas-root)或加密设备直接操作,应作用于其底层物理设备(如sda)】
临时切换指定设备的调度算法
适用于测试验证、紧急调优或非生产环境,无需重启,但系统重启后自动还原为默认值。
方法一:设为none(推荐用于NVMe SSD)
执行echo none > /sys/block/nvme0n1/queue/scheduler,再用cat命令验证是否生效。
方法二:设为kyber(低延迟SSD首选)
执行echo kyber > /sys/block/sda/queue/scheduler,该算法专为现代SSD设计,比mq-deadline更轻量、响应更快。
方法三:设为mq-deadline(传统HDD或SATA SSD)
执行echo mq-deadline > /sys/block/sdb/queue/scheduler,它保留deadline核心机制,但适配blk-mq多队列路径,避免单队列瓶颈。
⚠️ 若执行后报错bash: echo: write error: Invalid argument,说明该设备不支持目标算法——请回到上一步确认/sys/block/xxx/queue/scheduler中是否包含该项。
永久修改系统级默认调度器
适用于全闪存服务器、数据库专用节点等需标准化部署的场景,让所有兼容块设备在启动时统一采用指定算法。
第一步:编辑GRUB配置文件
sudo vim /etc/default/grub
第二步:定位到GRUB_CMDLINE_LINUX行,在引号内末尾添加参数elevator=kyber(可选值:none、mq-deadline、bfq、kyber),注意与其他参数用空格分隔。
第三步:更新GRUB配置
sudo grub2-mkconfig -o /boot/grub2/grub.cfg
第四步:重启系统生效
sudo reboot
重启后立即执行cat /sys/block/sda/queue/scheduler验证——此时所有未被udev规则覆盖的设备都应显示[kyber]。
按设备类型差异化配置调度器
当系统存在异构存储(如同时挂载SATA SSD和NVMe盘)时,全局设置会顾此失彼。可通过udev规则实现“sda走mq-deadline,nvme0n1走none”的精准控制。
创建规则文件:sudo vim /etc/udev/rules.d/60-scheduler.rules
写入以下内容(按需调整设备匹配模式):
ACTION=="add", SUBSYSTEM=="block", KERNEL=="sda|sdb", ATTR{queue/scheduler}="mq-deadline"
ACTION=="add", SUBSYSTEM=="block", KERNEL=="nvme[0-9]n[0-9]", ATTR{queue/scheduler}="none"
重新加载udev规则:sudo udevadm control --reload-rules && sudo udevadm trigger --subsystem-match=block
插拔一次目标设备(或重启),再检查/sys/block/sda/queue/scheduler和/sys/block/nvme0n1/queue/scheduler是否分别生效。











