2012-04-09 2 views
0

우리가 db에 쓰거나 읽어야 할 때마다 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. 우리는 클라이언트에서 포트를 재사용 할 수 있습니까? 콜 바인드() 전에 양말 수신 거부의 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 프로토콜 분석 프로세스의 일부입니다. 그들은 old-connection 패킷이 새로운 연결의 일부로 받아 들여지지 않도록 보장합니다. 그러니 1000 명이 없으면 그대로 두어야합니다.

source/dest가 localhost이므로 구형 연결 패킷을 새 연결로 간주 할 수있는 상황이 없어야합니다. 당신의 제안 된 해결책 가운데 1이 사용될 수 있습니다. 솔루션 2 & 3이 더 많은 영향을 미칠 수 있으므로 적용하기 전에 확인하십시오.

+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));는 효과가없는 것처럼 보입니다. bind를 호출해야합니까? – jiamo

+0

미안하지만 SO_REUSEPORT를 SO_REUSEADDR로 착각했습니다. 나는 SO_REUSEPORT를 사용하지 않았다! [Check This] (http://www.unixguide.net/network/socketfaq/4.11.shtml) – tuxuday

+0

setsockopt()로 플래그를 설정하고 bind() 할 필요가 없길 바랍니다. 이것을 설정하면 반드시 CLOSED 상태로 이동하지 않을 것이라고 생각하지 않고 새로운 소켓이 해당 주소/포트 조합을 사용할 수있게합니다. [이것은 더 유용해야합니다] (http://serverfault.com/questions/329845/how-to-forcibly-close-a-socket-in-time-wait) – tuxuday