mysql连接需要15分钟_数据库连接池阻塞的十五分钟

29ea5ed5cb9f

业务反馈系统偶发卡顿,经过筛查复现卡顿时间的日志发现了日志内容如下:

29ea5ed5cb9f

居然有928秒的接口,发现的时候简直不敢相信自己的眼睛。首先怀疑接口存在性能问题,或者存在高并发的调用导致服务响应变慢,但是这个928秒也还是有些夸张。

结果翻查代码发现只有一个非常简单的sql查询,并且数据库的慢查询日志没有慢查询。翻查日志上下文发现,并没有高并发访问。并在尝试压测此接口时,发现远远达不到 928s 响应的情况,所以至此可以确定,是其它环境问题。

在上网寻找解决方案时,发现相关内容:

我们的网络通信过程如下:

Java服务器 防火墙 数据库服务器

防火墙会定时与不定时的删除 TCP 会话,在会话删除后,Java服务器使用连接池的连接发送数据库查询请求,过程如下:

Java服务器建立连接池,经由防火墙与数据库建立三次握手的请求

此时防火墙认可这些连接,会正常转发这些请求

某时刻,防火墙删除此连接,不会发送 ASK 与 FIN 包

Java服务器使用此连接发送数据库请求

防火墙收到请求后发现此连接无效,丢弃网络包,并且不会发送 ASK 包

Java服务器在2*RTT后判定网络包丢失,因为没收到 SDK,所以默认判定网络发生拥塞

在系统设定的退避时到达后,再次发送重试包,如此循环,退避时间会随着重试次数的增加而增加

当重试次数到达系统设定上限后,(Linux 默认次数为15次),重新发起三次握手连接。

我截取的网络日志验证了上述描述内容。

29ea5ed5cb9f

本地测试重试时间为18s,服务器为928s,此时间与系统设定有关

上网查找了重试次数与所需时间的关系表。

29ea5ed5cb9f

为了解决此问题,上网查找了 Linux 可以修改,/proc/sys/net/ipv4/tcp_retries2 参数来减少重试次数,当网络环境较好时,可以减少到 5~6 次。

以上就是这十五分钟数据库做的事情,正常来说服务器会定时访问数据库来保持连接的存活性,可能防火墙存在问题,导致连接误杀,只有等网络部门解决后才能从根本上解决此问题。

by 费城的二鹏 2020.05.14 长春

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
当数据库中的多个事务相互等待对方释放锁时,就会发生死锁。这种情况下,数据库无法自行解决死锁问题,需要人工介入。以下是一些可能导致死锁的原因: 1. 事务中操作的顺序不同导致的死锁。比如,事务A先申请锁1再申请锁2,而事务B则先申请锁2再申请锁1,这种情况下就可能出现死锁。 2. 事务中锁的粒度过大导致的死锁。如果事务A和事务B都需要锁住同一个表,那么当两个事务同时执行时就会发生死锁。 3. 数据库中的资源不足导致的死锁。比如,连接池满了,没有可用的连接了,那么新的事务就无法执行,从而导致死锁。 针对中间件连接池满的故障诊断,可以通过以下步骤进行: 1. 检查数据库是否存在死锁。可以通过查询数据库日志或使用工具检查数据库状态来判断是否存在死锁。 2. 检查中间件连接池的配置。检查连接池的最大连接数、空闲连接数等配置是否合理。如果连接池的配置不合理,可以调整配置来解决问题。 3. 检查中间件连接池的使用情况。使用工具检查连接池的使用情况,查看连接池是否被占满,是否存在长时间空闲的连接等情况。 4. 检查数据库服务器的负载情况。如果数据库服务器的负载过高,也会导致连接池满的问题,因此需要检查数据库服务器的负载情况。 根据以上步骤,可以快速定位中间件连接池满的故障原因,并采取相应的措施来解决问题。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值