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