一、現象:
登陸伺服器的時候輸入netstat -natup
發現存在大量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
二、原因:
time_wait狀態也稱為2msl等待狀態
每個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狀態。
三、解決:
通過調整核心引數解決
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_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狀態的最長時間。預設為240秒,最低為30秒,最高為300秒。建議為30秒。
然後執行/sbin/sysctl -p讓引數生效。
修改之後,再用命令檢視time_wait連線數
netstat -ae|grep 「time_wait」 |wc –l
發現大量的time_wait 已不存在,mysql程序的佔用率很快就降下來的,**訪問正常。
不過很多時候,出現大量的time_wait狀態的連線,往往是因為**程式**中沒有使用mysql.colse(),才導致大量的mysql time_wait.
四、注釋:
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時間來限制這個埠立即被使用。
TIME WAIT狀態的意義
客戶端與伺服器端建立tcp ip連線後關閉socket後,伺服器端連線的埠 狀態為time wait 是不是所有執行主動關閉的socket都會進入time wait狀態呢?有沒有什麼情況使主動關閉的socket直接進入closed狀態呢?主動關閉的一方在傳送最後乙個ack 後 就會進入time wa...
TIME WAIT和CLOSE WAIT狀態區別
在伺服器的日常維護過程中,會經常用到下面的命令 plain view plain copy print netstat n awk tcp end netstat n awk tcp end 它會顯示例如下面的資訊 time wait 814 close wait 1 fin wait1 1 est...
也說說TIME WAIT狀態
乙個朋友問到,自己用go寫了乙個簡單的http服務端程式,為什麼壓測的時候服務端會出現一段時間的time wait超高的情況,導致壓測的效果不好呢?記得老王有兩篇文章專門說這個,當時粗粗看了一遍,正好碰上這個問題,又翻出來細細摟了。第乙個要弄懂的,是time wait是怎麼產生的。要弄懂time w...