Mysql出现大量TIME_WAIT状态端口占用的解决方法 windows/linux/centos

windows篇mysql

1.查看一下占用状况.在cmd输入命令sql

netstat -ano | findstr "3306"

发现 Mysql 的 3306 端口存在大量 TIME_WAIT 状态链接,考虑到近期考勤人数的忽然增多,且指纹机打卡为实时上传等缘由,初步猜想是在短期内指纹机大量请求接口操做数据库,而端口并未释放所致使。数据库

解决问题

修改Mysql配置windows

[mysqld]
# 服务器关闭交互式链接前等待活动的秒数
interactive_timeout=30
# 服务器关闭非交互链接以前等待活动的秒数
wait_timeout=30

注意:须要同时配置interactive_timeout与wait_timeout才可生效!服务器

修改Windows服务器TCP链接配置cookie

因为Windows下默认Socket链接为5000个,且预设TIME_WAIT时间为4分钟。咱们同时须要修改服务器配置。socket

打开注册表 regedit
找到路径 HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Tcpip\Parameters
在该路径下修改或新建注册表
类型: DWORD值 名称:MaxUserPort 值(十进制):65543
类型: DWORD值 名称:TcpTimedWaitDelay 值(十进制):30tcp

保存后重启Windows服务器,发现3306的 TIME_WAIT端口数量正常,项目恢复正常使用。网站

Linux篇spa

用命令进行查询,

netstat -an | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'

反馈结果为:

TIME_WAIT 236
ESTABLISHED 13
LISTEN 11

显然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
net.ipv4.tcp_timestamps

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

修改以后能够命令查看修改后的值

cat /proc/sys/net/ipv4/tcp_syncookies
cat /proc/sys/net/ipv4/tcp_tw_reuse
cat /proc/sys/net/ipv4/tcp_tw_recycle
cat /proc/sys/net/ipv4/tcp_timestamps

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时间

一、开启tcp_timestamp是开启tcp_tw_recycle,tcp_tw_reuse和tcp_timestamp的前提条件。

二、可是在nat模式下,不用将tcp_tw_recycle和tcp_timestamp同时开启,这会形成tcp超时引起故障。

修改以后,再用命令查看TIME_WAIT链接数
 

netstat -ae|grep "TIME_WAIT" |wc -l
netstat -ae |grep mysql

发现大量的TIME_WAIT 已不存在,mysql进程的占用率很快就降下来的,网站访问正常。 不过不少时候,出现大量的TIME_WAIT状态的链接,每每是由于网站程序代码中没有使用mysql.colse(),才致使大量的mysql  TIME_WAIT。

相关文章
相关标签/搜索