發現大量的TIME WAIT解決辦法

2021-09-07 15:38:07 字數 3720 閱讀 2337

陸資料庫伺服器(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: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

發現系統存在大量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  

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...

大量的TIME WAIT解決辦法

windows平台 netstat an netstat an find 1433 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...

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...