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。

相關文章
相關標籤/搜索