CLOSE_WAIT이 발생하여 서버가 먹통이 되는 현상이 생기는데여??
Multi Thread로 작성한 소스에서 시간이 지나면 CLOSE_WAIT 이 증가하여서
Server가 accept까지만되고 쓰레드도 생성이 되지않습니다.
소스.
main() { listen() select() sockfd=accept() sockfd를 queue에 넣어서 보관 pthread_create(...AcceptThread,..); } AcceptThread() {\ queue에서 sockfd를 꺼냄..//mutex적용 }
server와 client는 매번 connection을 연결하고 close합니다.
초당 4-5번정도의 connection이 맺어지구여.
근데 시간이 지나면 CLOSE_WAIT 의 갯수가 증가하여서 Server에서
accept한 후에 소켓에서 데이터를 읽지를 못합니다.
tcp 217 0 xxx.xxx.xxx.xxx:8001 xxx.xxx.xxx.xxx:2143 CLOSE_WAIT
tcp 242 0 xxx.xxx.xxx.xxx:8001 xxx.xxx.xxx.xxx:2185 CLOSE_WAIT
tcp 242 0 xxx.xxx.xxx.xxx:8001 xxx.xxx.xxx.xxx:2314 CLOSE_WAIT
tcp 242 0 xxx.xxx.xxx.xxx:8001 xxx.xxx.xxx.xxx:2252 CLOSE_WAIT
tcp 217 0 xxx.xxx.xxx.xxx:8001 xxx.xxx.xxx.xxx:2124 CLOSE_WAIT
tcp 217 0 xxx.xxx.xxx.xxx:8001 xxx.xxx.xxx.xxx:2191 CLOSE_WAIT
CLOSE_WAIT 은 상대방에서 close를 했고 이쪽에서 close를 하기를 기다리는건데
어찌된게 소켓의 RecvQ에 데이터가 남아 있을수 있는지..의문이 듭니다..
혹시나해서 AcceptThread에서 close하기전에 shutdown을 해도마찬가지네여
"AcceptThread" 에서 close() 가 정확히 호출되는지 확인
"AcceptThread" 에서 close() 가 정확히 호출되는지 확인해 보셔야 할것 같습니다.
또, close하는 fd 가 accept 한 fd가 맞는지도 확인해 보셔야 할듯 하구요.
우리 모두 리얼리스트가 되자. 그러나 가슴에 이룰 수 없는 꿈을 가지자
thread생성시 pthread_detach를 가능하도록했읍니다.
Thread생성이 안되는것이 문제였읍니다.
AcceptThread를 생성하고나서 AcceptThread가 종료되면 자원반납이
자동으로 되는줄 알았더니 아니였군여..
소스상 pthread_join으로 쓰레드 종료를 체크하기엔 로직이 조금 바뀌어
될것 같아서 안했더니 이런문제가 생겼던것입니다.
pthread_detach로 자원반납을 시키니 해결되었읍니다.
[/code]제 무지가 부른 소치네여.
댓글 달기