서비스 운영하다보니 서버에 CLOSE_WAIT된 socket이 엄청많이 발생하는것이 발견됨...
* CLOSE_WAIT는 왜 발생하는가? - 요 한장의 이미지가 제일 좋은 설명인듯 - http://kukuta.tistory.com/155
- 요거를 코드로 구현해 놓은건 이쪽 사이트에서 확인해볼수 있음. http://www.sysnet.pe.kr/Default.aspx?mode=2&sub=0&detail=1&pageno=0&wid=1334&rssMode=1&wtype=0
* 서버의 소켓 상태 확인
# netstat -nto | grep CLOSE_WAIT.*on ~~~~~~~ CLOSE_WAIT on (10.51/11/0) ~~~~~~~ CLOSE_WAIT on (115.64/12/0) ~~~~~~~ CLOSE_WAIT on (5.27/14/0) ~~~~~~~ CLOSE_WAIT on (110.84/13/0) ~~~~~~~ CLOSE_WAIT on (90.57/15/0) ......
- client로부터 FIN을 receive 받고 ACK를 send를 했는데 ACK가 처리되지 못하고 있어서(send-q에 처리되지 못한 q가 남아있음) 다음단계로 넘어가지를 못하는 상태로 볼수 있다.
-> timer가 돌면서 retry를 하지만 오래 걸림(15분 ~ 30분)
* 변경 - 기존 tcp_retries2 설정을 확인해보면 15로 설정이 되어있음 # cat /proc/sys/net/ipv4/tcp_retries2 15
- 15인 경우 전체 timeout까지는 13 ~ 30분 정도 소요 - 해당 설정을 줄여서 빠르게 재전송 시도 후 실패하도록 변경 - /etc/sysctl.conf 설정 net.ipv4.tcp_retries2 = 3 ~ 5
* 참조 - http://stackoverflow.com/questions/5907527/application-control-of-tcp-retransmission-on-linux |