作者一直被某個項目的HP-UX折磨,系統運行一段時間后就會出現大量的CLOSE_WAIT連接,然后Apusic應用服務器就一直處于非常繁忙的狀態,但是Dump JVM發現Apusic的許多線程處在空閑狀態,此時將Apusic重新啟動將連接全部釋放系統就恢復正常了。
分析認為因為系統在公網上受到攻擊有關,攻擊會建立大量的空閑連接,然后使連接處于CLOSE_WAIT狀態,從而系統需要消耗大量的資源去維護這些連接直到斷開,從而影響系統運行的效果。
為此,作者調整了相關的網絡參數,效果比較明顯,CPU壓力大幅下降。
ndd -set /dev/tcp tcp_keepalive_interval 120000
但是,對于生產系統許多時候是不希望宕機的,有沒有直接斷開CLOSE_WAIT連接呢?可以,先用
ndd -get /dev/tcp tcp_status |grep CLOSE_WAIT
把已經CLOSE_WAIT的連接找出來,然后使用
ndd -set /dev/tcp tcp_discon 0x<TCP地址>
例如:輸入 ndd -get /dev/tcp tcp_status |grep 133
結果
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
連接就會被主動斷開了。
如果有人可以寫個腳本定期執行,至少能夠解決臨時性問題,如果要真正解決可能還需要想其他辦法,歡迎大家一起來討論。