tcp_tw_recycle参数引发的数据库连接异常
【问题描述】
开发反馈有个应用在后端数据库某次计划性重启后经常会出现数据库连接异常问题,通过监控系统的埋点数据,发现应用连接数据库异常有两类表现:
其一:连接超时
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参数引发的数据库连接异常的更多相关文章
- 【经验总结】tcp_tw_recycle参数引发的故障
tcp_tw_recycle参数引发的故障 By Eric 故障描述: 2010年9月7日,新上线的手机游戏论坛有部分地区用户反应登陆游戏时出现不能登陆或登陆超时等情况,观察用户同时在线数量开始下降情 ...
- tcp_tw_recycle参数引发的故障
文章转载自:https://blog.csdn.net/wireless_tech/article/details/6405755 故障描述: 2010年9月7日,新上线的手机游戏论坛有部分地区用户反 ...
- tcp_tw_recycle参数引发的系统问题
文章转载自: https://blog.csdn.net/zhuyiquan/article/details/68925707
- mysql数据库连接异常问题(总结)
mysql数据库连接异常问题(总结) 1.1 前言 最近项目由1个数据源增加至了3个数据源(连接池使用C3P0),结果各种奇葩的数据库连接问题接踵而至,为防止将来再次遇到同样的问题不犯同样错误,现 ...
- 网络优化之net.ipv4.tcp_tw_recycle参数
不要在linux上启用net.ipv4.tcp_tw_recycle参数 2015/07/27 CFC4N 本文为翻译英文BLOG<Coping with the TCP TIME-WAIT ...
- 不要在linux上启用net.ipv4.tcp_tw_recycle参数
不要在linux上启用net.ipv4.tcp_tw_recycle参数 发布于 2015/07/27 莿鸟栖草堂 本文为翻译英文BLOG<Coping with the TCP TIME-WA ...
- 【MySql】数据库连接异常:Thelastpacketsentsuccessfullytotheserverwas0millisecondsago
参考链接:http://blog.sina.com.cn/s/blog_7540bf5f0102xjpk.html 最近新入职,用了新版的mysql8数据库,结果连接数据库时出现了问题,报了几个异常, ...
- TR2021_0000偶发数据库连接异常问题排查
[问题描述] 数据库连接异常是很难排查的一类问题.因为它牵涉到应用端,网络层和服务器端.任何一个组件异常,都会导致数据库连接失败.开发遇到数据库连接不上的问题,都会第一时间找DBA来协助查看,DBA除 ...
- 一个purge参数引发的惨案——从线上hbase数据被删事故说起
在写这篇blog前,我的心情久久不能平静,虽然明白运维工作如履薄冰,但没有料到这么一个细小的疏漏会带来如此严重的灾难.这是一起其他公司误用puppet参数引发的事故,而且这个参数我也曾被“坑过”. ...
随机推荐
- emacs require和provide
Emacs的默认配置文件是.emacs,Emacs启动时会读取并执行.emacs中的LISP代码,用户使用.emacs达到自己的Emacs初始化配置目的. 不过单独使用.emacs有一个问题,因为时间 ...
- input:file样式怎样修改
问题描述: 我需要点击input:file来修改img中的图片,但是input:file样式太丑 解决办法: 给file设置透明度为0,让用户看不见他 创建新的button按钮 修改button按钮样 ...
- UML图示样例
- Velocity与Jsp、Freemarker的对比
在java领域,表现层技术主要有三种:jsp.freemarker.velocity.jsp是大家最熟悉的技术 优点: 1.功能强大,可以写java代码 2.支持jsp标签(jsp tag) 3.支持 ...
- FT_Get_Var error on comiling
[Julian@julian-linux-t450 gtk]$ gcc `pkg-config --cflags gtk+-.` -o exam00 exam00.c `pkg-config --li ...
- Docker 简单发布dotnet core项目 图文版
原文:https://www.cnblogs.com/chuankang/p/9474591.html docker发布dotnet core简单流程 需要结合这个版本看哈 地址:https://ww ...
- Unreal Engine 4 系列教程 Part 6:动画教程
.katex { display: block; text-align: center; white-space: nowrap; } .katex-display > .katex > ...
- 《Web前端开发》等级考试样题~以国家“1+X”职业技能证书为标准,厚溥推出Web前端开发人才培养方案
1+x证书Web前端开发初级理论考试样题2019 http://blog.zh66.club/index.php/archives/149/ 1+x证书Web前端开发初级实操考试样题2019 http ...
- netstat查看端口状态
netstat netstat -tunlp 用于显示 tcp,udp 的端口和进程等相关情况. netstat 查看端口占用语法格式: netstat -tunlp | grep 端口号 -t (t ...
- LeetCode28——实现strStr()
6月中下旬辞职在家,7 月份无聊的度过了一个月.8 月份开始和朋友两个人写项目,一个后台和一个 APP ,APP 需要对接蓝牙打印机.APP 和蓝牙打印机都没有搞过,开始打算使用 MUI 开发 APP ...