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 `
- 我們可以重新使用在客戶端的端口?這種調用bind()之前連接()與襪子選擇SO_REUSEPORT
sysctl -w net.ipv4.tcp_timestamps=1 sysctl -w net.ipv4.tcp_tw_recycle=1
<
確實是這樣,有很大的幫助。但我仍然可以看到很多TIME_WAIT狀態- 設置套接字SO_LINGER選擇
l_onoff=0 ; l_liger=1
或一些其他的方式?
'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
對不起,我誤以爲SO_REUSEPORT爲SO_REUSEADDR。我沒有使用SO_REUSEPORT! [Check This](http://www.unixguide.net/network/socketfaq/4.11.shtml) – tuxuday 2012-04-09 11:29:35
希望你已經用setsockopt()設置了標誌並且不需要綁定()。如果你設置這些,不要認爲它會將它移到CLOSED狀態,而是允許新套接字使用該地址/端口組合。 [這應該更有用](http://serverfault.com/questions/329845/how-to-forcibly-close-a-socket-in-time-wait) – tuxuday 2012-04-09 11:41:51