[20200220]关于SQLNET.EXPIRE_TIME and ENABLE=BROKEN的总结.txt
--//昨天做了大量关于SQLNET.EXPIRE_TIME and ENABLE=BROKEN的测试,晚上再仔细看,测试做的有点乱。
--//做一些总结:
1. 12c之前设置SQLNET.EXPIRE_TIME在sqlnet.ora文件中,DCD判断链接并不使用TCP keep-alive feature特性。它会定期发送探测包给客
户端检测链接是否正常,如果在1个SQLNET.EXPIRE_TIME之内客户端有数据包发送,这个探测包在SQLNET.EXPIRE_TIME(单位:分钟)时
间到来时,不会发送探测数据包给客户端,这样有可能出现最大2*SQLNET.EXPIRE_TIME时间端内,没有发送探测数据包给客户端的情
况。
这样会导致一种情况,假设路由器等网络相关设置在10分钟发送接受数据包网络就会断开,设置SQLNET.EXPIRE_TIME最安全的方式是
设置SQLNET.EXPIRE_TIME=5,这样才能保持连接在空闲时链接不会断开。
--//注:关于这个10分钟来历,可以参考链接:http://blog.itpub.net/267265/viewspace-2150614/=>[20180129]测量网络断开时间.txt
2. 12之前如果不设置SQLNET.EXPIRE_TIME在sqlnet.ora文件中,网络链接使用TCP keep-alive feature特性。这点你可以执行
netsta -npo | grep
而linux下实际上使用如下参数:
# echo /proc/sys/net/ipv4/tcp_keepalive* | xargs -n 1 strings -1 -f
/proc/sys/net/ipv4/tcp_keepalive_intvl: 75
/proc/sys/net/ipv4/tcp_keepalive_probes: 9
/proc/sys/net/ipv4/tcp_keepalive_time: 7200
--//参数解析:
/proc/sys/net/ipv4/tcp_keepalive_time 当keepalive起用的时候,TCP发送keepalive消息的频度。默认是2小时。
/proc/sys/net/ipv4/tcp_keepalive_intvl 当探测没有确认时,keepalive探测包的发送间隔。缺省是75秒。
/proc/sys/net/ipv4/tcp_keepalive_probes 如果对方不予应答,keepalive探测包的发送次数。缺省值是9。
默认的参数tcp_keepalive_time设置太长,不使用SQLNET.EXPIRE_TIME在sqlnet.ora文件中,必须修改内核对应参数符合实际需求。
假设路由器等网络相关设置在10分钟发送接受数据包网络就会断开,这样必须修改/etc/sysctl.conf文件:
net.ipv4.tcp_keepalive_time = 590
net.ipv4.tcp_keepalive_intvl = 10
net.ipv4.tcp_keepalive_probes=4
这也是我个人推荐的模式,我个人感觉这样不会出现上面设置SQLNET.EXPIRE_TIME=5的情况。而且采用TCP keep-alive feature特性
更加科学,因为如果链接有数据包发送接收,计时重新开始(注:你可以执行sql语句后,使用netsta -npo | grep
段是否是keepalive确定),不会像设置SQLNET.EXPIRE_TIME时,定期发送探测包给客户端检测链接是否正常。
缺点就是必须手工设置内核参数/proc/sys/net/ipv4/tcp_keepalive*参数,符合网络需求。
3.12c之后(包括12c)设置SQLNET.EXPIRE_TIME在sqlnet.ora文件中,DCD判断链接使用TCP keep-alive feature特性。实际上就是将
SQLNET.EXPIRE_TIME的数值换成秒,通过调用setsockopt(N, SOL_SOCKET, SO_KEEPALIVE, [1], 4) [注:这里N对应socket的句柄]。
可以通过netsta -npo | grep
从这里也可以看出使用TCP keep-alive feature特性更加合理科学,不然oracle不会采用这种方式。
4.ENABLE=BROKEN 设置在tns连接串中,设置它相当于客户端使用TCP keep-alive feature特性。
如果不设置ENABLE=BROKEN,就是出现链接http://blog.itpub.net/267265/viewspace-2150555/=>奇怪的SQLNet message from dblink模拟
的情况,大约等927秒(15分钟)才会报错。
"缺点"就是必须手工设置内核参数/proc/sys/net/ipv4/tcp_keepalive*参数,符合网络需求,[注:是指客户端的内核参数。]
而且许多客户端或者中间服务器使用的是windows系统,如何修改注册表,我还给上网查询测试看看,明天继续在查一些资料看看。
5.链接是否可以使用TCP keep-alive feature特性,linux下可以通过执行netsta -npo | grep <进程号> 观察 最后一列是否是keepalive确定。
这是一种简单快捷的方式。