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 `
- 우리는 클라이언트에서 포트를 재사용 할 수 있습니까? 콜 바인드() 전에 양말 수신 거부의 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));는 효과가없는 것처럼 보입니다. bind를 호출해야합니까? – jiamo
미안하지만 SO_REUSEPORT를 SO_REUSEADDR로 착각했습니다. 나는 SO_REUSEPORT를 사용하지 않았다! [Check This] (http://www.unixguide.net/network/socketfaq/4.11.shtml) – tuxuday
setsockopt()로 플래그를 설정하고 bind() 할 필요가 없길 바랍니다. 이것을 설정하면 반드시 CLOSED 상태로 이동하지 않을 것이라고 생각하지 않고 새로운 소켓이 해당 주소/포트 조합을 사용할 수있게합니다. [이것은 더 유용해야합니다] (http://serverfault.com/questions/329845/how-to-forcibly-close-a-socket-in-time-wait) – tuxuday