mysql 大量time wait 解決辦法

2021-07-30 12:22:50 字數 3864 閱讀 8454

伺服器(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

tomcat大量time wait問題

在服務端訪問量大的時候檢測到大量的time wait,並且介面請求延時較高。執行 netstat n awk tcp end 這個shell命令的意思是把netstat n 後結果的最後一條放到s陣列中,如果相同則執行 1操作。此時能看到tcp各種狀態下的連線數量,示例 服務端架構是採用nginx ...

處理大量TIME WAIT的情況

登陸伺服器的時候輸入 netstat an grep mysql netstat an awk tcp sort uniq c 發現存在大量time wait狀態的連線 tcp 0 0 127.0.0.1 3306 127.0.0.1 41378 time wait tcp 0 0 127.0.0....

linux下解決大量的TIME WAIT

root web02 vi etc sysctl.conf 新增如下內容 net.ipv4.tcp tw reuse 1 net.ipv4.tcp tw recycle 1 net.ipv4.tcp syncookies 1 使核心引數生效 root web02 sysctl p readme ne...