close_wait 문제

TCP 의 close_wait 상태가 서버쪽에서만 있는 줄 알았는데 클라이언트(클라)에서도 close_wait 상태가 발생하였다. 운영중인 서비스의 서버가 클라입장이 되어 다른 서버로 요청을 하고 있었는데 다수의 close_wait 발생으로 소켓을 리소스가 점점 고갈되는 현상을 경험했다.

# 정상적인 세션 닫기(종료) 처리
1. 세션 종료를 위해 클라이언트가 서버로 FIN 패킷을 보내고 서버에서는 닫기처리를 수행한다. 이때가 서버는 close_wait 상태가 된다.
2. 서버에서 닫기 작업이 완료되면 클라이언트에 닫기 완료 패킷을 보내게 되고 클라쪽에서 정상적인 세션 종료 처리가 이뤄진다.

그런데 서버쪽에서 먼저 클라에게 종료 패킷을 보내게 되는 경우가 클라는 close_wait 상태가 된다. 서버는 세션 종료가 끝나 상태인데, 클라쪽에서는 세션 종료를 위해 FIN 패킷을 서버로 보내고 응답을 계속 기다리게 된다. 하지만 서버에서 응답을 받지 못해 계속 close_wait 로 남아 있게 된다.

결국 클라이언트 입장에서 close_wait 로 빠지는 세션들에 대해서 확실한 종료 처리 과정이 있어야 한다.
막연히 생각나는 방법으로 close_wait 상태에서 일정 시간이 지나면 강제로 세션 정리를 한다던지... 좀더 고민이 필요한 부분이다.

참고



comments:

댓글 쓰기