MySQL服务器发现大量TIME_WAIT解决办法

栏目: 数据库 · 发布时间: 8年前

内容简介:MySQL服务器发现大量TIME_WAIT解决办法

有同事就反映公司好几个网站都打不开,登陆 MySQL 数据库。 服务器(Windows), 发现很卡,于是重启了下服务器,进入系统后,没过一会问题依旧,查看了下系统进程,发现MySQL占用率达到99%,可以肯定的是MySQL连接出现问题:

netstat -an

192.168.12.13:3306      192.168.12.12:30443      TIME_WAIT

192.168.12.13:3306      192.168.12.12:30444      TIME_WAIT

192.168.12.13:3306      192.168.12.12:30445      TIME_WAIT

192.168.12.13:3306      192.168.12.12:30446      TIME_WAIT

192.168.12.13:3306      192.168.12.12:30447      TIME_WAIT

192.168.12.13:3306      192.168.12.12:30448      TIME_WAIT

192.168.12.13:3306      192.168.12.12:30449      TIME_WAIT

192.168.12.13:3306      192.168.12.12:30450      TIME_WAIT

192.168.12.13:3306      192.168.12.12:30451      TIME_WAIT

192.168.12.13:3306      192.168.12.12:30452      TIME_WAIT

... ...

根据TCP协议定义的3次握手断开连接规定,发起socket主动关闭的一方 socket将进入TIME_WAIT状态,TIME_WAIT状态将持续2个MSL(Max Segment Lifetime),在Windows下默认为4分钟,即240秒,TIME_WAIT状态下的socket不能被回收使用. 具体现象是对于一个处理大量短连接的服务器,如果是由服务器主动关闭客户端的连接,将导致服务器端存在大量的处于TIME_WAIT状态的socket, 甚至比处于Established状态下的socket多的多,严重影响服务器的处理能力,甚至耗尽可用的socket,停止服务. TIME_WAIT是TCP协议用以保证被重新分配的socket不会受到之前残留的延迟重发报文影响的机制,是必要的逻辑保证.

在HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters,添加名为TcpTimedWaitDelay的

DWORD键,设置为60,以缩短TIME_WAIT的等待时间

登陆到Web服务器(Linux):

netstat -ae |grep mysql

tcp        0      0 aaaa:53045              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53044              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53051              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53050              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53049              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53048              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53055              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53054              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53053              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53052              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53059              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53058              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53057              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53056              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53063              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53062              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53061              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53060              192.168.12.3:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53067              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53066              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53065              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53064              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa53071              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53070              192.168.12.13:mysql          TIME_WAIT  root      0

tcp        0      0 aaaa:53069              192.168.12.13:mysql          TIME_WAIT  root      0

发现系统存在大量TIME_WAIT状态的连接,通过调整内核参数解决,

vi /etc/sysctl.conf

编辑文件,加入以下内容:

net.ipv4.tcp_syncookies = 1

net.ipv4.tcp_tw_reuse = 1

net.ipv4.tcp_tw_recycle = 1

net.ipv4.tcp_fin_timeout = 30

然后执行 /sbin/sysctl -p 让参数生效。

net.ipv4.tcp_syncookies = 1 表示开启SYN Cookies。当出现SYN等待队列溢出时,启用cookies来处理,可防范少量SYN攻击,默认为0,表示关闭;

net.ipv4.tcp_tw_reuse = 1 表示开启重用。允许将TIME-WAIT sockets重新用于新的TCP连接,默认为0,表示关闭;

net.ipv4.tcp_tw_recycle = 1 表示开启TCP连接中TIME-WAIT sockets的快速回收,默认为0,表示关闭。

net.ipv4.tcp_fin_timeout 修改系統默认的 TIMEOUT 时间

修改之后,再用

netstat -ae|grep mysql

tcp        0      0 aaaa:50408              192.168.12.13:mysql          ESTABLISHED nobody    3224651

tcp        0      0 aaaa:50417              192.168.12.13:mysql          ESTABLISHED nobody    3224673

tcp        0      0 aaaa:50419              192.168.12.13:mysql          ESTABLISHED nobody    3224675

发现大量的TIME_WAIT 已不存在,mysql进程的占用率很快就降下来的,各网站访问正常!!

以上只是暂时的解决方法,最后仔细巡查发现是前天新上线的一个系统,程序代码中没有使用mysql.colse(),才导致大量的mysql  TIME_WAIT。

本文永久更新链接地址 http://www.linuxidc.com/Linux/2017-06/14449.htm


以上就是本文的全部内容,希望本文的内容对大家的学习或者工作能带来一定的帮助,也希望大家多多支持 码农网

查看所有标签

猜你喜欢:

本站部分资源来源于网络,本站转载出于传递更多信息之目的,版权归原作者或者来源机构所有,如转载稿涉及版权问题,请联系我们

PHP for the World Wide Web, Second Edition (Visual QuickStart Gu

PHP for the World Wide Web, Second Edition (Visual QuickStart Gu

Larry Ullman / Peachpit Press / 2004-02-02 / USD 29.99

So you know HTML, even JavaScript, but the idea of learning an actual programming language like PHP terrifies you? Well, stop quaking and get going with this easy task-based guide! Aimed at beginning ......一起来看看 《PHP for the World Wide Web, Second Edition (Visual QuickStart Gu》 这本书的介绍吧!

图片转BASE64编码
图片转BASE64编码

在线图片转Base64编码工具

UNIX 时间戳转换
UNIX 时间戳转换

UNIX 时间戳转换

正则表达式在线测试
正则表达式在线测试

正则表达式在线测试