全闪存存储下oracle rac必须统一启用none调度器,因nvme设备内建高效调度,绕过内核io调度层可避免0.1–0.5ms额外延迟;混用会导致asm元数据异常、gc cr block busy等待及i/o抖动,须所有节点同步配置并持久化。

全闪存存储必须用 none 调度器,别碰 deadline 或 mq-deadline
Oracle RAC 在 NVMe 全闪存上跑,none 是唯一合理选择。NVMe 设备自带高效队列管理,内核 IO 调度层不仅没用,反而引入额外延迟和锁争用。SUSE 15 SP4+(内核 5.3+)默认对 NVMe 启用 none,但老版本(如 SUSE 12 SP5 内核 4.12)仍可能 fallback 到 mq-deadline。
- 先确认设备类型:
lsblk -d -o name,rota——rota=0的才是 NVMe/SSD - 查当前调度器:
cat /sys/block/nvme0n1/queue/scheduler(把nvme0n1换成你的真实设备名) - 临时设为
none:echo none > /sys/block/nvme0n1/queue/scheduler - 注意:不能只改一个节点;RAC 所有节点必须完全一致,否则
v$asm_operation卡在REBAL、gc cr block busy等待事件会明显上升
SUSE 上如何持久化 none 调度器设置?
SUSE 不推荐改 /etc/rc.local(已弃用),应使用 udev 规则或 systemd 服务。udev 更可靠,因为设备名在启动早期就已确定,且能精准匹配 NVMe 设备。
- 新建规则:
/etc/udev/rules.d/99-nvme-scheduler.rules - 内容写成:
KERNEL=="nvme*[0-9]n[0-9]", SUBSYSTEM=="block", ATTR{queue/scheduler}="none" - 重载规则:
udevadm control --reload-rules && udevadm trigger --subsystem-match=block - 验证是否生效:
cat /sys/block/nvme0n1/queue/scheduler应显示[none](中括号表示当前生效) - 别用
grub参数(如elevator=none)——它对 NVMe 无效,仅影响 SCSI 类设备
为什么 disk_asynch_io=TRUE 还是走同步路径?
这不是 Oracle 参数单独能决定的。即使 disk_asynch_io=TRUE,若底层不满足条件,Oracle 会静默降级为同步 I/O,现象是 ORA-27091 或日志里出现 Asynchronous I/O disabled。
- 必须同时满足:
filesystemio_options=SETALL(或ASYNCH),且文件系统挂载不含sync、data=journal - 检查 AIO 并发上限:
cat /proc/sys/fs/aio-max-nr,生产环境建议 ≥ 1048576(512 个 DBWR × 2 倍余量) - SUSE 默认
aio-max-nr常为 65536,不够用;加到/etc/sysctl.conf并执行sysctl -p - XFS 文件系统必须启用
inode64,否则 inode 分配锁会阻塞 AIO 提交
最容易被忽略的硬件层陷阱:扇区大小错配
很多 NVMe SSD 物理扇区是 4K,但 ASM 读出来的 v$asm_disk.sector_size 显示 512。这说明驱动或固件没正确通告,导致 ASM 条带不对齐,小 IO 变成跨条带读写,性能直接腰斩。
- 确认实际物理扇区:
sudo nvme id-ns /dev/nvme0n1 | grep -i "lbaf\|flbas",找lbaf 0: ms=0x0 lbads=12(即 2^12 = 4096) - 若 ASM 显示 512 但硬件是 4K,必须加隐含参数:
_disk_sector_size_override=4096 - 该参数需重启实例生效,且所有 RAC 节点保持一致
- 不处理的后果:即使用了
none和SETALL,v$asm_disk_iostat.read_time仍会异常升高











