[ 一日30分 인생승리의 학습법] 소켓 CLOSE_WAIT 발생 현상 및 처리 방안
2023.12.03 17:00
[ 一日30分 인생승리의 학습법] 소켓 CLOSE_WAIT 발생 현상 및 처리 방안
서버에서 CLOSE_WAIT 행 현상이 발생 할 경우 대처 방안으로 많은시간을 하는데요.
예를들어 서버에서 Thread Pool에 할당을 50개 Thread 할당하고 CLOSE_WAIT가 50개 발생하면 서비스는 행이 걸립니다.
- 현상 : 50개 Thread는 응답을 못주고 waiting 상태에 빠지는 경우가 발생하면서 서비스 중지
- 원인1 : TCP 핸드쉐이크 순서를 간단히 보면 ESTABLISHED 상태에서 거래를 끝내고 소켓 close가 제대로 안되는 상황이 발생합니다. 이 때
CLOSE_WAIT가 발생합니다.
- 원인2 : 응답을 못주고 Exception 으로 빠졌을 경우가 많습니다. 예를 들어 Exception 이 발생하거나 RuntimeException이 발생하였는데 이를 처리 못하는 경우입니다. server.close();가 호출안되고 서버 행이 발생합니다.
- 소스 문제 : try catch를 만들어서 정상적으로 보이나 IOException 에서도 다른 에러가 발생할 소지를 생각하면 catch 구문에서 server.close()를 호출하면 안됩니다. 이 catch안에서도 에러가 발생하면 곧바도 CLOSE_WAIT 상태로 빠지게 됩니다.
<일반적인 서버 Soket 구현>
- TIP : CLOSE_WAIT는 서버에서 발생하고 이때 클라이언트는 TIME_WAIT가 발생합니다 이를 해결하기 위해서는 클라인트에서는 문제가 없기 때문에 처리 할수 없습니다. 단지 서버에서 처리만 가능합니다. Thread Pool의 Thread의 상태는 wait 상태에 빠지고 점점 더 Thread가 wait 상태가 발생되면 Thread Pool의 상태는 고갈되기 때문에 Server Socket은 연결만 되고 대기 상태가 발생하게 됩니다.
- 소스 수정 : IOException 에서도 다른 에러가 발생할 소지를 생각해서 finally 구문에서는 에러 응답 전문 처리 같은 것이 없는 순수 socket 처리를 합니다.
<close_wait를 막기 위한 finally 처리>
CLOSE_WAIT 상태는 결국 서버에서 발견되며
CLOSE_WAIT 상태가 유지되는 이유는 close 못한 Thread가 wait 가 발생하기 때문입니다.
CLOSE_WAIT를 해결 위치는 서버 소켓 처리이며
CLOSE_WAIT상태를 막기 위해서는 try.. catch에서 소켓 close 를 사용하는 대신 finally 에서 close를 사용합니다.
[출처] 소켓 CLOSE_WAIT 발생 현상 및 처리 방안|작성자 zulu
광고 클릭에서 발생하는 수익금은 모두 웹사이트 서버의 유지 및 관리, 그리고 기술 콘텐츠 향상을 위해 쓰여집니다.

