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参数引发的事故,而且这个参数我也曾被“坑过”. ...
随机推荐
- day35作业
1. 查询所有大于60分的学生的姓名和学号 (DISTINCT: 去重) -- 2.查询每个老师教授的课程数量 和 老师信息 -- 3. 查询学生的信息以及学生所在的班级信息 -- 4.学生中男生的个 ...
- Mysql—索引原理与详解
索引的原理 索引的优点和缺点和使用原则 索引优点: 可以加快数据的检索速度,提高查询速度. 所有的MySql列类型(字段类型)都可以被索引,也就是可以给任意字段建立索引. 全文检索字段进行搜索优化. ...
- centos 7下配置阿里yum源
1.打开centos的yum文件夹 cd /etc/yum.repos.d/ 2.用wget下载repo文件 wget http://mirrors.aliyun.com/repo/Centos-7. ...
- 后台传给前端字符串为null或解析JSON字符错误——SyntaxError: JSON.parse: unterminated string literal at line 1 column 9018638 of the JSON data
第一种情况: 第二种情况: 首先看看你的JSONObject或JSONArray的引用有没有Getter()和Setter()方法,这个必须要加上 问题:两张表双向多对一.一对多时.响应给后台使,出现 ...
- Pwnable-flag
Download : http://pwnable.kr/bin/flag 先下载下来,之后用IDA打开,发现没有什么特别的东西,之后发现是经过UPX压缩过的 xxd flag 先脱壳再说, 之后再将 ...
- 非阻塞式I/O
套接字的默认状态是阻塞的.这就意味着当发出一个不能立即完成的套接字调用时,其进程将被投入睡眠,等待相应的操作完成.可能阻塞的套接字调用可分为以下4类 (1)输入操作,包括read,readv,recv ...
- python27期前端
第一天笔记:HTML:是一种标识性的语言css:层叠样式表是一种用来表现HTML等文件样式(效果)的计算机语言JavaScript:简称“JS”,是一种属于网络的脚本语言 常用来为网页添加各式各样的动 ...
- Vue 事件的基本使用与语法差异
"v-on:"可以简写为"@" "click"单击 "dblclick"双加 代码: <!doctype html ...
- mysql小知识点汇总---(时间与时间戳的转换, 修改mysql用户名密码, navicate 导入sql文件报错 1153)
1. 时间与时间戳的转换 1.1 时间戳转时间 FROM_UNIXTIME(add_time, '%Y-%m-%d') 1.2 时间转时间戳 UNIX_TIMESTAMP('2015-04-29') ...
- Nginx+Tomcat+Memcache 实现session共享
Nginx + Tomcat + Memcache 实现session共享 1. Nginx 部署 1.上传源码包到服务器,解压安装 下载地址:http://nginx.org/en/download ...