连接池 执行SQL超时15分钟

目录

  • 1、排查问题
  • 2、为什么防火墙删除会话后,主机要等15分钟?
  • 3、解决方案

1、排查问题

这次上线遇到客户端假死15分钟左右才能继续处理业务的问题。发现是在执行SQL时一直在等待15分钟后才能返回sql执行失败。查看日志错误是 ORA-03113: end-of-file on communication channel从这个错误看,应该是Oracle客户端返回了连接断开的错误,但是为什么要15分钟后才返回这个错误呢?
在网上找了很久,终于在防火墙断开数据库或者mq的连接造成的长时间重连等待找到了我想要的东西,猜测是由于防火墙删除了会话,但主机并不知道,有数据库操作的时候,由Oracle客户端发起TCP请求,但由于防火墙找不到会话,丢弃了这些包(目前是不是丢还不清楚),导致了TCP不停地超时重发。

2、为什么防火墙删除会话后,主机要等15分钟?

查看TCP/IP详解第一卷的21章节21.2节,都超时重发有这样的描述:参考资料1

连接池 执行SQL超时15分钟_第1张图片

这里提到9分钟,不过这本书写得比较早,猜测linux有所不一样,不过原理差不了太多,google了一下,

好像找到了15分钟的说法, 参考资料2中提到:

TCP_RTO_MIN=(HZ/5)=0.2s
TCP_RTO_MAX=(120HZ)=120s
linear_backoff_thresh = ilog2(120
5)=ilog2(0x258)=9
timeout:未超过linear_backoff_thresh=9的部分按TCP_RTO_MIN 2的指数倍增长,超过的部分按TCP_RTO_MAX线性增长
tcp_time_stamp:当前时钟时间
例如数据发送阶段,sysctl_tcp_retries2=9,则timeout=1023TCP_RTO_MIN=204.6s;sysctl_tcp_retries2=11时,timeout=1023TCP_RTO_MIN+2TCP_RTO_MAX=448.6s
默认sysctl_tcp_retries2=15,timeout=1023
TCP_RTO_MIN+6*TCP_RTO_MAX=920.6s,约15分钟

是根据RTO及一定的算法算出来的(具体的算法,可以看参考资料3)

简单说,就是如果系统配置重传次数小于9的话,就是指数增长时间,如果大于9的话,就是最大超时时间。

而linux默认是15,所以刚好是15分钟,查看我们主机的配置,确认是15:

[steven@kfjk2 ~]$ cat /proc/sys/net/ipv4/tcp_retries2
15

现在还有一个问题没弄清楚,就是防火墙删除会话后,是否会通知主机?现在看起来应该是不会的,至少在主机上是没收到防火墙的RST,由于两个防火墙的两个厂商不一样,也有可能是一个吃掉另外一个的包也说不定。假如删除会话后,在原来的会话上来有包上来,是重建会话呢?还是直接把包丢弃?还是发RST呢?从目前主机的现象来看,猜测是:

防火墙删除会话后,不会通知主机也就是不会给主机发RST,当有新包上来,找不到连接,但不是S包的时候,直接丢弃,

导致主机用完了重发次数后,自己发RST后给应用报断开连接。

3、解决方案

1、修改net.ipv4.tcp_retries2=5参考资料4
2、修改防火墙策略

【参考资料】


  1. linux的TCP超时重传–一次数据断开连接分析 ↩︎

  2. linux TCP超时重传. ↩︎

  3. TCP/IP重传超时–RTO ↩︎

  4. linux TCP 参数设置 ↩︎

你可能感兴趣的:(tcp)