Posted on 2010-09-06 10:59
瘋狂 閱讀(2030)
評論(0) 編輯 收藏 所屬分類:
java 、
java性能
今天啟動mysql的時候,發現一起無法啟動,然后就去檢查3306是否被占用,結果使用netstat -ano 一看如下:
結果一看竟然被qq進程占用著,并且處于close_wait狀態。
處理方法:直接干掉qq進程,然后啟動mysql即可。
以下是關于tcp 狀態一些介紹 供大家參考:
Close_Wait
狀態解釋
CLOSE_WAIT狀態的生成原因
通過TCP的狀態圖我們可以看出只有被動關閉的一端才有CLOSE_WAIT狀態,當收到Fin并發送了Ack后
服務器狀態就變成了CLOSE_WAIT狀態,如果我們的服務器一直處于CLOSE_WAIT狀態的話,說明套接字是被動關閉的!,并且沒有發送Fin信令,原因往往是沒有調用TCP的CloseSocket。
解決CLOSE_WAIT的方法:
1 一般原因都是TCP連接沒有調用關閉方法。需要應用來處理網絡鏈接關閉。
2 對于Web請求出現這個原因,經常是因為Response的BodyStream沒有調用Close.
比如Widnows下:
使用HttpWebRequest 一定要保證GetRequestStream和GetResponse對象關閉,否則容易造成連接處于CLOSE_WAIT狀態
3 TCP的KeepLive功能,可以讓操作系統替我們自動清理掉CLOSE_WAIT的連接。
但是KeepLive在Windows操作系統下默認是7200秒,也就是2個小時才清理一次。往往滿足不了要求??梢哉{小該數值。
Windows下的調整方法為
HKEY_LOCAL_MACHINE"CurrentControlSet"Services"Tcpip"Parameters下的以下三個參數:
KeepAliveInterval,設置其值為1000
KeepAliveTime,設置其值為300000(單位為毫秒,300000代表5分鐘)
TcpMaxDataRetransmissions,設置其值為5
Close_Wait引發的問題:
Close_Wait會占用一個連接,網絡可用連接小。數量過多,可能會引起網絡性能下降,并占用系統非換頁內存。 尤其是在有連接池的情況下(比如HttpRequest)
會耗盡連接池的網絡連接數,導致無法建立網絡連接
--------------------------------------------
TCP狀態轉移要點
TCP協議規定,對于已經建立的連接,網絡雙方要進行四次握手才能成功斷開連接,如果缺少了其中某個步驟,將會使連接處于假死狀態,連接本身占用的資源不會被釋放。網絡服務器程序要同時管理大量連接,所以很有必要保證無用連接完全斷開,否則大量僵死的連接會浪費許多服務器資源。在眾多TCP狀態中,最值得注意的狀態有兩個:CLOSE_WAIT和TIME_WAIT。
1、LISTENING狀態
FTP服務啟動后首先處于偵聽(LISTENING)狀態。
2、ESTABLISHED狀態
ESTABLISHED的意思是建立連接。表示兩臺機器正在通信。
3、CLOSE_WAIT
對方主動關閉連接或者網絡異常導致連接中斷,這時我方的狀態會變成CLOSE_WAIT 此時我方要調用close()來使得連接正確關閉
4、TIME_WAIT
我方主動調用close()斷開連接,收到對方確認后狀態變為TIME_WAIT。TCP協議規定TIME_WAIT狀態會一直持續2MSL(即兩倍的分段最大生存期),以此來確保舊的連接狀態不會對新連接產生影響。處于TIME_WAIT狀態的連接占用的資源不會被內核釋放,所以作為服務器,在可能的情況下,盡量不要主動斷開連接,以減少TIME_WAIT狀態造成的資源浪費。
目前有一種避免TIME_WAIT資源浪費的方法,就是關閉socket的LINGER選項。但這種做法是TCP協議不推薦使用的,在某些情況下這個操作可能會帶來錯誤。
詳細一點的文檔:
http://apps.hi.baidu.com/share/detail/10908121