解决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. 连接->打开常规,设置连接名(可以自由指定).主机名.端口 ...
随机推荐
- Python基础:内置异常(未完待续)
本文根据Python 3.6.5的官文Built-in Exceptions编写,不会很详细,仅对Python的内置异常进行简单(重难点)介绍——很多异常都可以从名称判断出其意义,罗列所有的内置异常. ...
- ArcMap2SLD添加中文支持
首先,你可以从作者提供的链接下载ArcMap2SLD.zip(支持ArcMap10.2) 1.打开LUT_sld_mapping_file.xml文件(上传文件中已经修改)修改文件<LUT> ...
- MyBatis3.4.0以上的分页插件错误:Could not find method on interface org.apache.ibatis.executor.statement.StatementHandler named prepare. Cause: java.lang.NoSuchMethodException: org.apache.ibatis.executor.stateme
错误: Could not find method on interface org.apache.ibatis.executor.statement.StatementHandler named p ...
- jre安装配置!
通常安装java开发环境都是jdk ,jre 一起安装,配置变量!分享一下只安装jre的配置! 去官网下载jre, 按提示安装成功! 和jdk配置一样 ,首先配置一下:JRE_HOME=C:\Prog ...
- MEF实现设计上的“松耦合”(三)
1.面向接口编程:有一定编程经验的博友应该都熟悉或者了解这种编程思想,层和层之间通过接口依赖,下层不是直接给上层提供服务,而是定义一组接口供上层调用.至于具体的业务实现,那是开发中需要做的事情,在项目 ...
- SSIS 学习之旅 第一个SSIS 示例(二)
这一章还是继上一章例子 进行一些小的知识扩展.主要是为了让大家更快的上手SSIS. 概要设计: 1.按用户组生成CSV文件到Pending目录下, 2.移动Pending目录下的CSV文件 ...
- 使用Kafka、Elasticsearch、Grafana搭建业务监控系统(三)Elasticsearch
https://blog.csdn.net/tonywu1992/article/details/83576863
- 007 Ajax中的购物车
1.大纲设计 2.shopingCartItem.java package beans; public class shopingCartItem { private String bookname; ...
- java对对象排序
一.前言 有时我们需要对类按照类中的某一个属性(或者多个属性)来对类的对象进行排序,有两种方法可以实现,一种方法是类实现Comparable<T>接口,然后调用Collections.so ...
- hdoj2955 Robberies(01背包)
题目链接 http://acm.hdu.edu.cn/showproblem.php?pid=2955 题意 有n家银行,每家银行有两个属性:钱数m,概率p,p表示抢这家银行被逮着的概率.有一个人想抢 ...