解决MySQL建立连接问题,快速回收复用TCP的TIME_WAIT
最近同事遇到一个问题,使用python开发的工具在执行的时候无法和MySQL建立连接,其最直接的现象就是满篇的TIME_WAIT,最后通过调整tcp_timestamps参数问题得以解决,再次记录一下这次解决的经验总结。
ps:不过先汗颜一个,对基础的tcp知识太不敏感了,需要回炉重新学习啊。
一、看下TIME_WAIT产生的原因
大家都知道建立连接是著名的三次握手机制。
那么如何关闭连接呢? 其实也是著名的四次握手机制。
TIME_WAIT就产生在四次握手的的主动关闭方,而server端会进入close状态。
那么TIME_WAIT什么时候会消失呢?LINUX会在2MSL时间内消失。(MSL是最大分段生存期,默认为2分钟)
二、无法建立连接的原因
由于同事的脚本的用途是进行采集数据后的写入操作,为了加快速度故使用python的map功能并发写入数据库,当在脚本执行的服务器上报错后,发现满篇都是TIME_WAIT的现象。
经过我们内部讨论,初步认为是由于TIME_WAT没有快速回收导致Linux的可用端口被沾满导致无发建立连接,和MySQL的设置没有关系。
查看目前Linux可用端口范围:
[me]sysctl -a|grep ip_local_port_range
net.ipv4.ip_local_port_range =
查看当前占用的端口直接用netstat就可以了:
netstat -nat|grep -i time_wait|wc -l
三、如何解决?
对于TCP链接的优化大家都知道的三个参数:tcp_tw_reuse、tcp_tw_recycle、tcp_timestamp
1、我们先看看这3个参数的定义和作用。
tcp_tw_reuse:用来使用time-wait状态的sockets重用
Allow to reuse TIME-WAIT sockets for new connections when it is
safe from protocol viewpoint. Default value is 0.
It should not be changed without advice/request of technical experts.
tcp_tw_recycle:用来加速对time-wait
Enable fast recycling TIME-WAIT sockets. Default value is .
It should not be changed without advice/request of technical experts.
tcp_timestamp:在TCP的包头添加时间戳
Enable timestamps as defined in RFC1323
2、调整记录
我们先查看服务器的状态,发现reuse和recycle的参数都是1,但是time_wait并没有被很快的回收,也没有被快速的重用。
[root ~]# cat /proc/sys/net/ipv4/tcp_tw_reuse [root ~]# cat /proc/sys/net/ipv4/tcp_tw_recycle
后来发现是由于tcp_timestamp这个参数设置为0的原因
[root ~] cat /proc/sys/net/ipv4/tcp_timestamps
将这个参数置为1之后,time_wati的状态立刻下降了很多,脚本也可以正常执行了。看来tcp_timestamp非常关键。
3、探寻原因
但是,究竟是tcp_tw_reuse起作用了? 还是tcp_tw_recycle起作用了?我们还是不知道,只能从现象得知问题解决了。
我们将tcp_tw_recycle的值设定为0之后,再次测试,再次出现了大量的time_wait现象。
为了证明tcp_tw_recycle真正起作用了,我们再次将tcp_tw_reuse参数设置为1,这时候也再次出现了大量的time_wait的现象。
看来,最终我们的结论是同时开启tcp_tw_recycle,tcp_tw_reuse和tcp_timestamp才能真正做到快速回收和服用time-wait状态的socket。
从stackoverflow上看到的一个答案比较靠谱。点这里
但是同时也发现,网上有很多信息显示,如果同时开启tcp_tw_recycle和tcp_timestamp会出现问题。主要是由于TCP的一种行为
RFC 1323 TCP Extensions for High Performance Jacobson, Braden, & Borman
An additional mechanism could be added to the TCP, a per-host
cache of the last timestamp received from any connection.
This value could then be used in the PAWS mechanism to reject
old duplicate segments from earlier incarnations of the
connection, if the timestamp clock can be guaranteed to have
ticked at least once since the old connection was open. This
would require that the TIME-WAIT delay plus the RTT together
must be at least one tick of the sender's timestamp clock.
Such an extension is not part of the proposal of this RFC.
三、结论
1、开启tcp_timestamp是开启tcp_tw_recycle,tcp_tw_reuse和tcp_timestamp的前提条件。
2、但是在nat模式下,不用将tcp_tw_recycle和tcp_timestamp同时开启,这会造成tcp超时引发故障。
附录:
https://www.kernel.org/doc/Documentation/networking/ip-sysctl.txt
http://lxr.free-electrons.com/source/net/ipv4/tcp_minisocks.c#L92
http://www.ietf.org/rfc/rfc1323.txt
解决MySQL建立连接问题,快速回收复用TCP的TIME_WAIT的更多相关文章
- VS2013与MySql建立连接;您的项目引用了最新实体框架;但是,找不到数据链接所需的与版本兼容的实体框架数据库 EF6使用Mysql的技巧
因为之前都是看别人的项目,而没有自己从头到尾建立一个项目,所以这次尝试搭建时就出现了问题,主要是ASP.Net MVC项目中VS2013和MySql的连接. 第一个问题: 数据库表已建好,相应的数据库 ...
- [nodejs]解决mysql和连接池(pool)自动断开问题
最近在做一个个人项目,数据库尝试使用了mongodb.sqlite和mysql.分享一下关于mysql的连接池用法.项目部署于appfog,项目中我使用连接池链接数据库,本地测试一切正常.上线以后,经 ...
- PHP与MySql建立连接
通过PHP脚本建立与一个MySQL数据库的连接时,数据库服务器的主机位置(在本地就是localhost).用户名(root).密码.和数据库名是必须的.一旦建立连接,脚本就能执行SQL命令.二者联系的 ...
- golang中mysql建立连接超时时间timeout 测试
本文测试连接mysql的超时时间. 这里的"连接"是建立连接的意思. 连接mysql的超时时间是通过参数timeout设置的. 1.建立连接超时测试 下面例子中,设置连接超时时间为 ...
- 阿里云服务器解决mysql远程连接失败问题
嗯,自己买了个阿里云的学生机服务器,奈何装了mysql以后一直不能连接,也是够笨的. 记录一下自己遇到的问题. 当然了,首先需要在阿里云安全组开放3306端口,第一次玩儿云服务器差点把我搞坏了.... ...
- MySQL建立连接的过程
数据库连接的一些知识: import java.sql.Connection ; import java.sql.DriverManager ; import java.sql.Statement ; ...
- 解决mysql远程连接失败的问题
问题描述 在我远程连接我的服务器数据库的时候,navicat给我提示了这么一个错误: ERROR : Host 'xxx' is not allowed to connect to thisMySQL ...
- 【风马一族_php】PHP与Mysql建立连接
让php发出 Hi作为基础 http://www.cnblogs.com/sows/p/5990157.html 配置apache ../apache/conf/httpd.conf 创建p ...
- Navicat for mysql建立连接
1. 安装Navicat for MySQL. 2. 点击连接->MySQL,打开SSH,填写主机名.端口.用户名.密码. 3. 连接->打开常规,设置连接名(可以自由指定).主机名.端口 ...
随机推荐
- MySQL 导入CSV数据
第一步 创建表结构 create table t1( key1 ), v1 ) ); 第二步 导入数据 load data local infile 'D:/t1.csv' into table t1 ...
- angular 如何使用第三方组件ng-bootstrap
1.在你的项目中以下指令 npm install --save @ng-bootstrap/ng-bootstrap 安装完成会显示 + @ng-bootstrap/ng-bootstrap@1 ...
- 数据结构之队列(Python 版)
数据结构之队列(Python 版) 队列的特点:先进先出(FIFO) 使用链表技术实现 使用单链表技术,在表首尾两端分别加入指针,就很容易实现队列类. 使用顺序表list实现 # 队列类的实现 cla ...
- docker使用Dockerfile构建ssh容器
一.使用Dockerfile构建centos 1.创建 Dockerfile mkdir centos # 创建一个目录存放之后的Dockerfile,目录名无所谓 cd centos # 进入目录 ...
- MySQL学习笔记:upper、lower、ucase、lacase——字符串函数
在MySQL中,通过利用upper.lower.ucase.lacase几个函数对字符串进行大小写转换. upper(str)——根据当前字符集映射返回字符串str,并将所有字符更改为大写.默认值是l ...
- SSIS 学习之旅 FTP访问类
这章把脚本任务访问FTP的方法 全部给大家. 控件的使用大家如果有不懂得可以看下我之前的文章.第一章:SSIS 学习之旅 第一个SSIS 示例(一)(上) 第二章:SSIS 学习之旅 第一个SSIS ...
- 批处理命令篇--配置免安装mysql
免安装版的mysql是进行软件绿色发布的绝佳助手,本文介绍一种使用批处理命令自动配置mysql的方法. (1)建立三个文件,分别是:service install.bat,temp.txt,updat ...
- mongodb优化篇
在掌握了mongo的体系结构和基本操作后,开始学习 mongodb的优化,由于资源有限,只能网络上整理一些资料,我大致理解的mongo的优化分为以下几步: 1.监控 mongodb可以通过profi ...
- html5+css3 h5页面生成的思路
<!DOCTYPE html><html style="height: 100%;"> <head> <meta charset=&quo ...
- git更新到仓库
记录每次更新到仓库 现在我们手上已经有了一个真实项目的 Git 仓库,并从这个仓库中取出了所有文件的工作拷贝.接下来,对这些文件作些修改,在完成了一个阶段的目标之后,提交本次更新到仓库. 请记住,工作 ...