linux服務器出現大量TIME_WAIT的解決方法

今天突然發現博客的訪問速度變得緩慢,反覆查找原因,發現服務器存在大量的TIME_WAIT連接。

通過netstat -an | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’命令進行查詢,反饋結果爲:

TIME_WAIT 236
ESTABLISHED 13
LISTEN 11

顯然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讓參數生效。

net.ipv4.tcp_syncookies = 1表示開啓SYN Cookies。當出現SYN等待隊列溢出時,啓用cookies來處理,可防範少量SYN***,默認爲0,表示關閉;

net.ipv4.tcp_tw_reuse = 1表示開啓重用。允許將TIME-WAIT sockets重新用於新的TCP連接,默認爲0,表示關閉;

net.ipv4.tcp_tw_recycle = 1表示開啓TCP連接中TIME-WAIT sockets的快速回收,默認爲0,表示關閉。

net.ipv4.tcp_fin_timeout修改系統默認的TIMEOUT時間

修改之後,再用命令查看TIME_WAIT連接數
netstat -ae|grep “TIME_WAIT” |wc –l

發現大量的TIME_WAIT 已不存在,mysql進程的佔用率很快就降下來的,網站訪問正常。 不過很多時候,出現大量的TIME_WAIT狀態的連接,往往是因爲網站程序代碼中沒有使用mysql.colse(),才導致大量的mysql  TIME_WAIT。

如果你的服務器是Windows平臺,可以修改下面的註冊表鍵值:
[HKEY_LOCAL_MACHINESYSTEMCurrentControlSetServicesTcpipParameters]
“TcpTimedWaitDelay”=dword:0000001e

一般情況下,使用虛擬空間的用戶不太需要擔心此類問題,如果是使用VPS的用戶,建議按照此類方法進行排查和設置,可以有效的提升mysql服務的查詢速度。對於wordpress這種程序尤爲重要,如果是使用wordpress建站的朋友請務必重視起來。


發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章