Oracle RAC全闪存存储应统一使用none调度器,因NVMe设备内建高效调度,绕过内核IO调度层可避免额外延迟;混用调度策略会导致ASM元数据异常、I/O抖动及等待事件增加,须在所有节点同步配置并持久化。
Oracle RAC全闪存存储该用什么I/O调度器
全闪存存储(尤其是nvme)不适用传统机械盘的调度逻辑,deadline 或 cfq 反而会引入无谓延迟。linux内核5.0+对nvme设备默认启用none调度器(即绕过i/o调度层),这是最合理的选择。若系统仍为较老内核(如4.x),需手动确认并设置:echo none > /sys/block/nvme0n1/queue/scheduler。注意:路径中的nvme0n1需替换为实际设备名,用lsblk -d -o name,rota可快速识别(rota=0即为固态类设备)。
为什么不能在RAC节点上混用不同调度策略
RAC集群中各节点对同一ASM磁盘组的IO路径必须语义一致。若节点A用none、节点B用deadline,会导致:
- ASM rebalance过程中元数据同步异常,v$asm_operation可能卡在REBAL状态
- 节点间I/O延迟抖动放大,触发gc cr block busy或enq: TX - row lock contention等待
- crsctl check cluster虽显示正常,但asmcmd lsdg中USABLE_FILE_MB可能出现非预期波动
务必在所有RAC节点统一执行调度器设置,并加入/etc/rc.local或systemd服务确保重启后生效。
全闪存下哪些Oracle参数要联动调整
启用none调度器后,底层延迟极低,但Oracle仍按传统假设做IO批处理,容易造成“小IO堆积”。需同步调优以下参数:
- DB_FILE_MULTIBLOCK_READ_COUNT:从默认128降至32~64(避免一次发过多IO请求压垮NVMe队列深度)
- DISK_ASYNCH_IO:保持TRUE,但确认filesystemio_options设为SETALL(否则异步IO可能退化为同步)
- ASM_POWER_LIMIT:全闪存重建极快,可设为10(默认1),但需监控v$asm_disk_iostat中read_time是否突增——突增说明IO队列已饱和,需回调
- _disk_sector_size_override:若使用NVMe SSD且v$asm_disk.sector_size返回512(实际是4K物理扇区),需设为4096,否则ASM条带对齐失效
最容易被忽略的硬件层陷阱
全闪存性能≠线性叠加,尤其在RAC多节点争用时:
- NVMe设备若挂载在同一个PCIe Switch下游(常见于OCP服务器),带宽会被多个节点抢占,用lspci -tv检查拓扑,优先将不同节点的NVMe盘分到不同CPU socket的PCIe Root Complex
- 使用smartctl -a /dev/nvme0n1确认Percentage Used未超80%,高磨损NVMe盘延迟会陡增且不可预测
- ASM磁盘组若跨多个NVMe设备但未显式指定FAILGROUP,ALTER DISKGROUP ... REBALANCE POWER 10可能引发节点间大量gc current block 2-way流量,应始终按物理控制器边界划分FAILGROUP


















