作者一直被某個(gè)項(xiàng)目的HP-UX折磨,系統(tǒng)運(yùn)行一段時(shí)間后就會(huì)出現(xiàn)大量的CLOSE_WAIT連接,然后Apusic應(yīng)用服務(wù)器就一直處于非常繁忙的狀態(tài),但是Dump JVM發(fā)現(xiàn)Apusic的許多線(xiàn)程處在空閑狀態(tài),此時(shí)將Apusic重新啟動(dòng)將連接全部釋放系統(tǒng)就恢復(fù)正常了。
分析認(rèn)為因?yàn)橄到y(tǒng)在公網(wǎng)上受到攻擊有關(guān),攻擊會(huì)建立大量的空閑連接,然后使連接處于CLOSE_WAIT狀態(tài),從而系統(tǒng)需要消耗大量的資源去維護(hù)這些連接直到斷開(kāi),從而影響系統(tǒng)運(yùn)行的效果。
為此,作者調(diào)整了相關(guān)的網(wǎng)絡(luò)參數(shù),效果比較明顯,CPU壓力大幅下降。
ndd -set /dev/tcp tcp_keepalive_interval 120000
但是,對(duì)于生產(chǎn)系統(tǒng)許多時(shí)候是不希望宕機(jī)的,有沒(méi)有直接斷開(kāi)CLOSE_WAIT連接呢?可以,先用
ndd -get /dev/tcp tcp_status |grep CLOSE_WAIT
把已經(jīng)CLOSE_WAIT的連接找出來(lái),然后使用
ndd -set /dev/tcp tcp_discon 0x<TCP地址>
例如:輸入 ndd -get /dev/tcp tcp_status |grep 133
結(jié)果
000000005843e168 010.010.010.133???????????????????????? 48a68cfa 48a68cf8 00008000 00008072 b64b7c33 b64b7c33 00008000 00500 01460 [17,c539] TCP_ESTABLISHED
再輸入 ndd -set /dev/tcp tcp_discon 0x000000005843e168
連接就會(huì)被主動(dòng)斷開(kāi)了。
如果有人可以寫(xiě)個(gè)腳本定期執(zhí)行,至少能夠解決臨時(shí)性問(wèn)題,如果要真正解決可能還需要想其他辦法,歡迎大家一起來(lái)討論。