2012-04-09 83 views
0

如果我們每次需要向db寫入數據或從數據庫讀取數據時都必須連接數據庫(redis)。有些操作後關閉連接。由於連接頻繁(假設該連接必須連接然後關閉)。因此,太多的TIME_WAIT狀態套接字停留在內核中。 像一些事情:客戶端儘快減少TIME_WAIT數量的方法

 
`netstat -vatnl | grep 6379 

tcp  0  0 127.0.0.1:6379    0.0.0.0:*     LISTEN   
tcp  0  0 127.0.0.1:36476    127.0.0.1:6379    TIME_WAIT 
tcp  0  0 127.0.0.1:37193    127.0.0.1:6379   ESTABLISHED 
tcp  0  0 127.0.0.1:36480    127.0.0.1:6379    TIME_WAIT 
tcp  0  0 127.0.0.1:36479    127.0.0.1:6379    TIME_WAIT 
tcp  0  0 127.0.0.1:36472    127.0.0.1:6379    TIME_WAIT 
tcp  0  0 127.0.0.1:36457    127.0.0.1:6379    TIME_WAIT 
tcp  0  0 127.0.0.1:36460    127.0.0.1:6379    TIME_WAIT 
tcp  0  0 127.0.0.1:36481    127.0.0.1:6379    TIME_WAIT ` 
  1. 我們可以重新使用在客戶端的端口?這種調用bind()之前連接()與襪子選擇SO_REUSEPORT
  2. sysctl -w net.ipv4.tcp_timestamps=1 sysctl -w net.ipv4.tcp_tw_recycle=1 <
    確實是這樣,有很大的幫助。但我仍然可以看到很多TIME_WAIT狀態
  3. 設置套接字SO_LINGER選擇l_onoff=0 ; l_liger=1 或一些其他的方式?

回答

1

TIME_WAITs是tcp協議拆除過程的一部分。它們確保舊連接的數據包不被接受爲新連接的一部分。所以除非有1000人應該離開他們。

話雖如此,作爲源/ dest是本地主機應該不會有舊連接數據包可以被視爲新連接的情況。可以使用您提出的解決方案1。解決方案2可能有更廣泛的含義,所以請在應用它們之前進行檢查。

+0

'bzero(&cliaddr,sizeof(cliaddr)); cliaddr.sin_family = AF_INET; cliaddr.sin_addr.s_addr = htonl(0x7f000001); cliaddr.sin_port = htons(43333); bind(s,(struct sockaddr *)&cliaddr,sizeof(cliaddr));'似乎不起作用。它是否需要調用綁定? – jiamo 2012-04-09 10:42:22

+0

對不起,我誤以爲SO_REUSEPORT爲SO_REUSEADDR。我沒有使用SO_REUSEPORT! [Check This](http://www.unixguide.net/network/socketfaq/4.11.shtml) – tuxuday 2012-04-09 11:29:35

+0

希望你已經用setsockopt()設置了標誌並且不需要綁定()。如果你設置這些,不要認爲它會將它移到CLOSED狀態,而是允許新套接字使用該地址/端口組合。 [這應該更有用](http://serverfault.com/questions/329845/how-to-forcibly-close-a-socket-in-time-wait) – tuxuday 2012-04-09 11:41:51