【问题描述】

开发反馈有个应用在后端数据库某次计划性重启后经常会出现数据库连接异常问题,通过监控系统的埋点数据,发现应用连接数据库异常有两类表现:

  其一:连接超时

  131148.00ms Tomcat Connection Pool

  其二:连接耗时过长

  DAL.getConnectionCost 64018ms

【问题分析】

通过监控数据汇总,出现此异常问题来自应用群集中的多台WEB服务器,没有规律性,数据库服务器也没有做过系统版本升级及硬件调整,且数据库各主要性能指标正常,负载很低。因此最大可疑是网络通讯上的异常导致,于是通过客户端/服务器端同时抓包进行分析。

分析后,发现数据包中有许多TCP Retransmission

六次重连失败样例:



五次重连失败,第六次连接成功样例:

TCP SYN重传次数与请求端的tcp_syn_retries参数值有关,本案例中应用WEB服务器设置为6(查看命令:sudo sysctl -a | grep tcp_syn_retries),即重试的间隔时间从1s开始每次都翻倍,6次的重试时间间隔为1s, 2s, 4s, 8s,16s,32S总共63s,第6次发出后还要等64s才知道第6次也超时了,所以总共需要 1s + 2s + 4s+ 8s+ 16s + 32s+64S =127S,TCP才会断开连接。

因此上述问题描述中

  “连接超时”计算公式为:1s + 2s + 4s+ 8s+ 16s + 32s+64S =127S

  “建连耗时”计算公式与实际重试次数有关,以5次重试为例:1s + 2s + 4s+ 8s+ 16s + 32s=63S

查询资料得知TCP Retransmission问题很大可能与tcp_tw_recycle设置有关,在此参数开启后,服务端会对TCP包中timestamp有效性进行校验,数据包中的timestamp理应是顺序递增,如最新的数据包timestamp小于前一个包的timestamp,服务端则认为最新的数据包已过时从而丢弃,此问题常出现在NAT网络,如负载均衡设备后面,因为数据包经过转发,source_ip相同,但是后端不同机器的timestamp不同。

检查数据库服务器配置,发现tcp_tw_recycle功能被开启,同时网卡统计中存在因为时间戳被拒的数据包信息

netstat -s |grep reject
251286 passive connections rejected because of time stamp
795 packets rejects in established connections because of timestamp

关闭tcp_tw_recycle功能后,应用连接数据库恢复正常。本案例中为何数据库服务器重启后应用报错,那是因为参数先前只是做了动态关闭,没有修改配置文件固化,重启后读到旧的配置从而导致应用突然报错。

【问题重现】

本案例中的应用服务器与后端数据库直连,并不在NAT网络中,那理论上特定机器发送给DB的TCP包中timestamp数值是递增,不会出现乱序丢包问题,但实际抓包中的timestamp是乱序的,忽大忽小,没有规律性。

在不同Kernel版本环境中模拟用户请求,发现在不同内核环境中,timestamp行为有明显差异

Kernel 4.10.13,TSecr(请求方timestamp)随机



Kernel 3.10,TSecr(请求方timestamp)递增

查询资料发现timestamp生成算法在linux kernel 4.10之后进行了调整,加入偏移因子,从而变为随机性。因此如开启了tcp_tw_recycle,即使在非NAT网络环境中也会出现丢包问题,tcp_tw_recycle的弊端更为突显,因此在4.12内核中被移除

【结论】

tcp_tw_recycle在高版本内核中弊大于利,应保持系统默认设置,关闭参数。

【参考资料】

https://mp.weixin.qq.com/s/uwykopNnkcRL5JXTVufyBw
http://80x86.io/post/linux-kernel-v4.10.1-tcp-timestamps-random-offset-problem

tcp_tw_recycle参数引发的数据库连接异常的更多相关文章

  1. 【经验总结】tcp_tw_recycle参数引发的故障

    tcp_tw_recycle参数引发的故障 By Eric 故障描述: 2010年9月7日,新上线的手机游戏论坛有部分地区用户反应登陆游戏时出现不能登陆或登陆超时等情况,观察用户同时在线数量开始下降情 ...

  2. tcp_tw_recycle参数引发的故障

    文章转载自:https://blog.csdn.net/wireless_tech/article/details/6405755 故障描述: 2010年9月7日,新上线的手机游戏论坛有部分地区用户反 ...

  3. tcp_tw_recycle参数引发的系统问题

    文章转载自: https://blog.csdn.net/zhuyiquan/article/details/68925707

  4. mysql数据库连接异常问题(总结)

    mysql数据库连接异常问题(总结) 1.1 前言   最近项目由1个数据源增加至了3个数据源(连接池使用C3P0),结果各种奇葩的数据库连接问题接踵而至,为防止将来再次遇到同样的问题不犯同样错误,现 ...

  5. 网络优化之net.ipv4.tcp_tw_recycle参数

    不要在linux上启用net.ipv4.tcp_tw_recycle参数  2015/07/27  CFC4N 本文为翻译英文BLOG<Coping with the TCP TIME-WAIT ...

  6. 不要在linux上启用net.ipv4.tcp_tw_recycle参数

    不要在linux上启用net.ipv4.tcp_tw_recycle参数 发布于 2015/07/27 莿鸟栖草堂 本文为翻译英文BLOG<Coping with the TCP TIME-WA ...

  7. 【MySql】数据库连接异常:Thelastpacketsentsuccessfullytotheserverwas0millisecondsago

    参考链接:http://blog.sina.com.cn/s/blog_7540bf5f0102xjpk.html 最近新入职,用了新版的mysql8数据库,结果连接数据库时出现了问题,报了几个异常, ...

  8. TR2021_0000偶发数据库连接异常问题排查

    [问题描述] 数据库连接异常是很难排查的一类问题.因为它牵涉到应用端,网络层和服务器端.任何一个组件异常,都会导致数据库连接失败.开发遇到数据库连接不上的问题,都会第一时间找DBA来协助查看,DBA除 ...

  9. 一个purge参数引发的惨案——从线上hbase数据被删事故说起

    在写这篇blog前,我的心情久久不能平静,虽然明白运维工作如履薄冰,但没有料到这么一个细小的疏漏会带来如此严重的灾难.这是一起其他公司误用puppet参数引发的事故,而且这个参数我也曾被“坑过”.   ...

随机推荐

  1. 关于APICloud与DCloud的我的一些看法

    最近因为项目需要,研究了一下市场较为流行的四种移动开发平台:Wex5.APPcan.Dcloud.APICloud,Wex5因为界面UI较为老旧,且语法和js有较大出入,APPcan不开源等缘故,主要 ...

  2. 在MVC视图中将数字转换为string类型后保留两位小数

    <td>@item.recharge_reward_rate.ToString("F2")%</td> @*保留小数两位*@ <td>@item ...

  3. 关于tomcat setenv

    tomcat setenv首先寻找执行base下的若不存在,寻找home下的只会执行一个

  4. c# WF 第10节 textbox 控件

    本节内容: 1:textbox 在哪里 2:textbox 的属性 1:textbox 在哪里 2:textbox 的属性 3:实例 实现如下: 步骤1 :7个label  2个textbox 步骤2 ...

  5. 【CometOJ】Comet OJ - Contest #8 解题报告

    点此进入比赛 \(A\):杀手皇后(点此看题面) 大致题意: 求字典序最小的字符串. 一场比赛总有送分题... #include<bits/stdc++.h> #define Tp tem ...

  6. Comet OJ CCPC-Wannafly & Comet OJ 夏季欢乐赛(2019)

    Preface 在一个月黑风高的夜晚我这个蒟蒻正踌躇着打什么比赛好 是继续做一场AGC,还是去刷一场CF 然后,一道金光闪过(滑稽),我们的红太阳bzt给我指明了方向: 你太菜了,我知道有一场很水的比 ...

  7. vue怎么给自定义组件绑定原生事件

     下面主要以4个示例Demo演示(示例代码JS引用的Vue CDN),建议小伙伴直接复制示例代码运行查看, 赶时间的小伙伴可直接往下拉,看示例demo4 注:全局或局部注册的组件称为子组件,其中声明的 ...

  8. 关于 BenchmarkDotNet

    using BenchmarkDotNet.Attributes; using BenchmarkDotNet.Order; using System.Reflection; namespace Be ...

  9. Java8新特性——新一套时间API的使用

    JDK 1.0中包含了一个java.util.Date类,但是它的大多数方法已经在JDK 1.1引入Calendar类之后被弃用了.而Calendar并不比Date好多少.它们面临的问题是: 可变性: ...

  10. 排障利器之远程调试与监控 --jmx & remote debug

    监控和调试功能是应用必备的属性之一,其手段也是多种多样. 一般地,我们可以通过:线上日志, zabbix, grafana, cat 等待系统做一问题留底,有问题及时报警,从而达到监控效果. 而对于应 ...