ORA-16198超时本质是TCP层连接不稳定,需优先检查tcpping延时、tcp_timestamps/window_scaling启用状态、中间设备是否剥离TCP选项,并按BDP调优tcp_rmem/wmem及Oracle Net的SDU/BUF_SIZE。
ORA-16198 出现时,先别调 Oracle 参数
ora-16198 这类超时错误,90% 不是 oracle 层面配置问题,而是底层 tcp 无法稳定维持高吞吐连接。dg 日志传输本质是长连接、大块数据(单个归档日志常 >1mb)、低频但关键的流式发送,对窗口通告、ack 及时性极度敏感。ping 延迟低完全没参考价值——它测的是 icmp 小包,而 dg 走的是 oracle 自定义协议封装在 tcp 上,受 tcp_rmem、tcp_wmem、sack、timestamp 等真实影响。
常见误操作:一看到延迟就去改 log_archive_dest_n 的 NET_TIMEOUT 或调大 REOPEN,这只会掩盖问题,让重传更混乱。
- 先用
tcpping -x 5 host 1521替代 ping,确认目标端口 TCP 握手延时是否稳定 - 检查
sysctl net.ipv4.tcp_timestamps和net.ipv4.tcp_window_scaling输出是否都为1;任一为0,窗口缩放失效,接收窗口锁死在 64KB - 确认中间设备(防火墙、WAF、负载均衡)未剥离 TCP Options 字段,否则 SACK 和 Window Scale 会被静默丢弃
tcp_rmem / tcp_wmem 怎么设才不翻车
TCP 缓冲区不是越大越好,设错反而引发 ACK 延迟、窗口收缩、甚至触发内核静默忽略。Oracle 官方推荐按带宽时延积(BDP)×3 计算,但实操中必须满足两个硬约束:
-
tcp_rmem和tcp_wmem的第三项(max)必须 ≥ 第二项(default),否则内核直接无视该设置 - Linux 默认
tcp_rmem = "4096 131072 6291456",其中 6MB 上限对千兆链路 + 20ms RTT(BDP≈2.5MB)已显不足;建议设为"4096 262144 10485760"(即 10MB) - 临时生效:
sysctl -w net.ipv4.tcp_rmem="4096 262144 10485760"和sysctl -w net.ipv4.tcp_wmem="4096 262144 10485760" - 永久生效:写入
/etc/sysctl.conf后执行sysctl -p,别忘了验证sysctl net.ipv4.tcp_rmem输出是否与写入一致
Oracle Net 层 SDU 和 BUF_SIZE 必须同步调
OS 层调了 TCP 缓冲区,Oracle Net 层不匹配,等于白干。DG 传输链路是“Oracle Net → TCP → NIC”,三者缓冲能力要对齐,否则瓶颈会卡在中间层。
- 全局启用最大 SDU:
DEFAULT_SDU_SIZE=32767加到$ORACLE_HOME/network/admin/sqlnet.ora,主备库都要配 - 显式指定收发缓冲区大小:在
tnsnames.ora的每个 DG 连接描述符里加SEND_BUF_SIZE=10485760和RECV_BUF_SIZE=10485760,值需与 OS 层tcp_[rw]mem的 max 一致 - 注意:仅在
tnsnames.ora中配置才对 DG 归档传输生效;listener.ora 里的SDU配置只影响监听器自身,不影响 DG 数据流 - 改完重启监听器:
lsnrctl reload,并确认lsnrctl status输出中对应服务显示SDU=32767
别漏掉网卡队列和 SACK
即使 TCP 缓冲区和 SDU 都调好了,如果网卡接收队列溢出或 SACK 关闭,DG 仍会在丢一个 segment 后重传整块归档日志(1MB+),导致延迟飙升。
- 增大接收队列:
sysctl -w net.core.netdev_max_backlog=5000(默认常为 1000),避免软中断来不及处理导致丢包 - 强制开启 SACK:
sysctl -w net.ipv4.tcp_sack=1,这是 Oracle 11g+ DG 的硬性要求,禁用会导致单 segment 丢失引发全块重传 - 检查是否启用 timestamp:
sysctl net.ipv4.tcp_timestamps必须为1,否则高延迟链路上 RTT 估算失真,影响窗口动态调整 - Oracle 12c+ 建议关闭 TFO:
alter system set "_tcp_fast_open"=false scope=spfile,部分内核版本下 TFO 与 DG 重传逻辑冲突,引发间歇性 ORA-16198
ss -i 查看实际连接的 rcv_space 和 cwnd 值,确认它们真的涨上去了。











