1. 程式人生 > >Linux伺服器出現TIME_WAIT太多的問題

Linux伺服器出現TIME_WAIT太多的問題

伺服器很卡,mysql程序佔用很高,出現了mysql大量連線TIME_WAIT狀態

netstat -an |grep  TIME_WAIT

tcp_syncookies 布林值,預設值是 0

 是否開啟SYN Cookies。當出現SYN等待佇列溢位時,啟用cookies來處理,可防範少量SYN攻擊,預設為0,表示關閉。

tcp_tw_reuse 布林值,預設值是 0

  是否允許重新應用處在TIME-WAIT狀態的socket用於新的TCP連線。

tcp_tw_recycle 布林值,預設值是 0

  開啟快速TIME-WAIT sockets回收。一般不修改。如果做NAT的時候,建議開啟。

tcp_fin_timeout 預設值是 60

  對於本端斷開的socket連線,TCP保持在FIN_WAIT_2狀態的時間。對方可能會斷開連線或一直不結束連線或不可預料的程序死亡。預設值為60秒。可以修改該值﹐但需要注意﹐如果伺服器部署負載很重的web伺服器﹐可能存在風險:記憶體將可能被大量無效資料報填滿。FIN_WAIT_2 sockets 的危險性低於 FIN-WAIT-1 ﹐因為它們最多隻吃 1.5K 的記憶體﹐但是它們存在時間更長。另外參考 tcp_max_orphans。

  如果做NAT,應該降低該值。
  
發現系統存在大量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

然後執行 /sbin/sysctl -p 讓引數生效。

調整以後,發現大量的TIME_WAIT消失,mysql程序的佔用率很快就降下來的,伺服器正常。

但要主機,這個只是暫時的解決方法,關鍵還是要排查程式程式碼中,是否存在遺漏mysql.colse(),才導致大量的mysql  TIME_WAIT的情況。