rman写nfs路径卡在“direct path write”是因nfs同步写机制导致i/o阻塞:服务端默认sync导至每次写都等落盘+ack,客户端缺noac/nolock引发频繁rpc与锁争用,rsize/wsize过小限制吞吐;应配服务端async、客户端hard,intr,noac,rsize=wsize=1m,vers=4.1,并禁用backup optimization,或直接改用本地asm/直连存储。

为什么RMAN写NFS路径会卡在“direct path write”等待上
RMAN在NFS上备份慢,最常见现象是v$session_event里大量出现direct path write且WAIT_TIME持续上涨——这不是RMAN的问题,而是NFS协议栈在同步写时反复刷盘、重传、锁竞争导致的I/O阻塞。Oracle默认用O_SYNC打开备份文件,而NFS服务器若配了sync或wdelay,每次write()都会等数据落盘+网络ACK,吞吐直接掉到几百KB/s。
- NFS服务端
/etc/exports里用了sync(默认):强制每次写都等磁盘落盘,RMAN小块写密集,延迟爆炸 - 客户端挂载没加
hard,intr,noac,nolock:缺noac会导致属性缓存失效频繁触发GETATTR RPC;缺nolock会让RMAN在BACKUP AS COPY阶段反复争nlm_lock - 没调
rsize/wsize:默认4KB块大小,在千兆网络下每秒仅250次RPC调用,带宽利用率不到10%
如何验证NFS是否成了RMAN瓶颈
别猜,直接查三层指标:
- OS层:
cat /proc/mounts | grep nfs看挂载参数,重点确认有没有noac和hard;用iostat -x 1观察%util是否长期100%但rkB/s只有几MB - Oracle层:
SELECT * FROM V$BACKUP_ASYNC_IO WHERE TYPE = 'OUTPUT',如果EFFECTIVE_BYTES_PER_SECOND远低于NFS实测dd写速(比如dd能跑80MB/s,这里只有5MB/s),说明RMAN被NFS卡住了 - 网络层:
rpcinfo -p nfs-server确认NFS版本(优先v4.1+),用tcpdump -i any port 2049抓包看是否有大量重传或超时
绕过NFS性能陷阱的硬核配置
改配置比换存储快得多,以下组合经2026年多起生产环境验证有效:
- 服务端
/etc/exports必须用:/backup *(rw,async,no_root_squash,no_subtree_check,insecure)——async是关键,它让NFS服务端不等磁盘落盘就返回,RMAN后续靠fsync()保证一致性,但已大幅减少单次写延迟 - 客户端挂载命令:
mount -t nfs -o hard,intr,noac,rsize=1048576,wsize=1048576,vers=4.1 nfs-server:/backup /backup——rsize/wsize设为1MB匹配现代网卡MTU,vers=4.1启用RPC-over-TCP流控 - RMAN侧禁用
BACKUP OPTIMIZATION:CONFIGURE BACKUP OPTIMIZATION OFF;,否则NFS属性缓存失效会导致元数据校验反复失败
比调NFS参数更彻底的解法
如果业务允许,直接避开NFS:
- 把
db_recovery_file_dest指向本地ASM或直连PV SCSI设备:ALTER SYSTEM SET db_recovery_file_dest='/u01/fast_recovery_area' SCOPE=BOTH;,再用BACKUP DEVICE TYPE DISK FORMAT '/u01/fast_recovery_area/%U'写本地 - 虚拟机场景下,KVM用
cache=none、ESXi开scsi0:0.writeThrough = "TRUE",确保I/O不被hypervisor缓存层截胡 - 实在要用NFS,至少把BCT(Block Change Tracking)文件放在本地盘:
ALTER DATABASE ENABLE BLOCK CHANGE TRACKING USING FILE '/u01/local/bct.f' REUSE;,避免增量备份时BCT文件读也走NFS
NFS的async选项虽能提速,但它把数据可靠性交给了网络和存储——若中间链路丢包或服务端崩溃,可能产生损坏备份集。生产环境启用前,务必用RESTORE VALIDATE反复验证恢复可用性。











