Posted on 2009-04-29 14:30
Prayer 閱讀(3955)
評(píng)論(1) 編輯 收藏 引用 所屬分類:
SOCKET
在HTTP應(yīng)用中,存在一個(gè)問題,SERVER由于某種原因關(guān)閉連接,如KEEPALIVE的超時(shí),這樣,作為主動(dòng)關(guān)閉的SERVER一方就會(huì)進(jìn)入 FIN_WAIT2狀態(tài),但TCP/IP協(xié)議棧有個(gè)問題,F(xiàn)IN_WAIT2狀態(tài)是沒有超時(shí)的(不象TIME_WAIT狀態(tài)),所以如果CLIENT不關(guān)閉,這個(gè)FIN_WAIT_2狀態(tài)將保持到系統(tǒng)重新啟動(dòng),越來越多的FIN_WAIT_2狀態(tài)會(huì)致使內(nèi)核crash。
產(chǎn)生原因:
1。常連接并且當(dāng)連接一直處于IDLE狀態(tài)導(dǎo)致SERVER CLOSE時(shí),CLIENT編程缺陷,沒有向SERVER 發(fā)出FIN和ACK包
2。APACHE1.1和APACHE1.2增加了linger_close()函數(shù),前面的帖子有介紹,這個(gè)函數(shù)可能引起了這個(gè)問題(為什么我也不清楚)
解決辦法:
1。對(duì)FIN_WAIT_2狀態(tài)增加超時(shí)機(jī)制,這個(gè)特性在協(xié)議里沒有體現(xiàn),但在一些OS中已經(jīng)實(shí)現(xiàn)
如:LINUX、SOLARIS、FREEBSD、HP-UNIX、IRIX等
2。不要用linger_close()編譯
3。用SO_LINGER代替,這個(gè)在某些系統(tǒng)中還能很好地處理
4。增加用于存儲(chǔ)網(wǎng)絡(luò)連接狀態(tài)的內(nèi)存mbuf,以防止內(nèi)核crash
5。DISABLE KEEPALIVE