發現存在大量time_wait狀態的連線
tcp 0 0 127.0.0.1:3306 127.0.0.1:41378 time_wait
tcp 0 0 127.0.0.1:3306 127.0.0.1:41379 time_wait
tcp 0 0 127.0.0.1:3306 127.0.0.1:39352 time_wait
tcp 0 0 127.0.0.1:3306 127.0.0.1:39350 time_wait
tcp 0 0 127.0.0.1:3306 127.0.0.1:35763 time_wait
tcp 0 0 127.0.0.1:3306 127.0.0.1:39372 time_wait
tcp 0 0 127.0.0.1:3306 127.0.0.1:39373 time_wait
tcp 0 0 127.0.0.1:3306 127.0.0.1:41176 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時間
修改之後,再用命令檢視time_wait連線數
netstat -ae|grep 「time_wait」 |wc –l
發現大量的time_wait 已不存在,mysql程序的佔用率很快就降下來的,**訪問正常。
不過很多時候,出現大量的time_wait狀態的連線,往往是因為**程式**中沒有使用mysql.colse(),才導致大量的mysql time_wait.
如果你的伺服器是windows平台,可以修改下面的登錄檔鍵值:
[hkey_local_machine\system\currentcontrolset\services\tcpip\parameters]
"tcptimedwaitdelay"=dword:0000001e
此值是time_wait狀態的最長時間。預設為240秒,最低為30秒,最高為300秒。建議為30秒。
注釋:(
1,tcp結束的過程如下:
server client
-------------- fin --------------> server: fin_wait_1
<------------- ack --------------- client: close_wait server:fin_wait_2
<------------- fin --------------- client發出fin之後就關閉
-------------- ack -------------> server發出ack後進入time_wait狀態
time_wait的預設時間是2倍的mls,就是240秒鐘。mls是tcp片在網上的最長存活時間。
time_wait的主要作用是保證關閉的tcp埠不立即被使用。因為當網路存在延遲時,可能當某個埠被關閉後,網路中還有一些重傳的tcp片在發向這個埠,如果這個埠立即建立新的tcp連線,則可能會有影響。所以使用2倍的msl時間來限制這個埠立即被使用。
現在的問題在於,4分鐘的時間有點長。
因此,time_wait的影響,我想,首先每個tcp連線都各自有個資料結構,叫tcp control block.time_wait的時候這個資料結構沒有被釋放。所以當有太多的tcp連線時,記憶體可能會被占用很多。
2,to valorz:time_wait狀態也稱為2msl等待狀態,而不是2mls,筆誤吧!
每個tcp報文在網路內的最長時間,就稱為msl(maximum segment lifetime),它的作用和ip資料報的ttl類似。
rfc793指出,msl的值是2分鐘,但是在實際的實現中,常用的值有以下三種:30秒,1分鐘,2分鐘。
注意乙個問題,進入time_wait狀態的一般情況下是客戶端,大多數伺服器端一般執行被動關閉,不會進入time_wait狀態,當在伺服器端關閉某個服務再重新啟動時,它是會進入time_wait狀態的。
舉例:1.客戶端連線伺服器的80服務,這時客戶端會啟用乙個本地的埠訪問伺服器的80,訪問完成後關閉此連線,立刻再次訪問伺服器的80,這時客戶端會啟用另乙個本地的埠,而不是剛才使用的那個本地埠。原因就是剛才的那個連線還處於time_wait狀態。
2.客戶端連線伺服器的80服務,這時伺服器關閉80埠,立即再次重啟80埠的服務,這時可能不會成功啟動,原因也是伺服器的連線還處於time_wait狀態。
windows
tcptimedwaitdelay和maxuserport設定
描述:確定 tcp/ip 可釋放已關閉連線並重用其資源前,必須經過的時間。
關閉和釋放之間的此時間間隔通稱 time_wait 狀態或兩倍最大段生命週期(2msl)狀態。
此時間期間,重新開啟到客戶機和伺服器的連線的成本少於建立新連線。
減少此條目的值允許 tcp/ip 更快地釋放已關閉的連線,為新連線提供更多資源。如果執行的應用程式需要快速釋放和建立新連線,而且由於 time_wait 中存在很多連線,導致低吞吐量,則調整此引數。
如何檢視或設定: 使用 regedit 命令訪問 hkey_local_machine/system/currentcontrolset/ services/tcpip/parameters 登錄檔子鍵並建立名為 tcptimedwaitdelay 的新 reg_dword 值。
將此值設定為十進位制 30,其為十六進製制 0x0000001e。
該值將等待時間設定為 30 秒。
停止並重新啟動系統。 預設值:0xf0,它將等待時間設定為 240 秒(4 分鐘)。
建議值:最小值為 0x1e,它將等待時間設定為 30 秒。
maxuserport 描述:確定在應用程式從系統請求可用使用者埠時,tcp/ip 可指定的最高埠號。
如何檢視或設定: 使用 regedit 命令訪問 hkey_local_machine/system/currentcontrolset/ services/tcpip/parameters 登錄檔子鍵並建立名為 maxuserport 的新 reg_dword 值。
停止並重新啟動系統。
預設值:無 建議值:至少十進位制 32768。
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...
linux 下大量TIME WAIT 的處理
原文 linux 下大量time wait 的處理 linux下高併發的squid伺服器,tcp time wait套接字數量經常達到兩 三萬,伺服器很容易被拖死。通過修改linux核心引數,可以減少伺服器的ime wait套接字數量。vim etc sysctl.conf 增加以下幾行 net.i...
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...