tcp 埠的time_wait 問題

babyyellow發表於2012-06-05
最近發現幾個監控用的指令碼在連線監控資料庫的時候偶爾會連不上,報錯:
 Couldn't connect to host:3306/tcp: IO::Socket::INET: connect: Cannot assign requested address
檢視了一下發現系統中存在大量處於TIME_WAIT狀態的tcp埠
$netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 50013
ESTABLISHED 27
SYN_RECV 1
由於要監控的主機太多,監控的agent可能在短時間內建立大量連線到監控資料庫(MySQL)並釋放造成的。在網上查閱了一些tcp引數的相關資料,最後透過修改了幾個系統核心的tcp引數緩解了該問題:
#vi /etc/sysctl.conf

net.ipv4.tcp_tw_reuse = 1
net.ipv4.tcp_tw_recycle = 1

#sysctl -p
其中:
net.ipv4.tcp_tw_reuse = 1 表示開啟重用。允許將TIME-WAIT sockets重新用於新的TCP連線,預設為0,表示關閉;
net.ipv4.tcp_tw_recycle = 1 表示開啟TCP連線中TIME-WAIT sockets的快速回收,預設為0,表示關閉。
修改完成並生效後,系統中處於TIME_WAIT狀態的tcp埠數量迅速下降到100左右:
$netstat -n | awk '/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}'
TIME_WAIT 82
ESTABLISHED 36
簡單記錄於此,備忘。

來自 “ ITPUB部落格 ” ,連結:http://blog.itpub.net/133735/viewspace-731992/,如需轉載,請註明出處,否則將追究法律責任。

相關文章