조사가 진행되는 동안 누군가가 우리에게 도움이되기를 바랍니다.TCP 소켓 서버가 CLOSE_WAITs를 정상적으로 생성하지 못함 작동하지 않을 때까지
우리는 C#으로 작성된 간단한 비동기 소켓 서버를 ASP.NET 웹 응용 프로그램의 연결을 받아들이고 메시지를 보내고 일부 처리 (일반적으로 DB뿐만 아니라 다른 시스템에 대해서도)를 수행 한 다음 응답을 보냅니다 다시 클라이언트에게. 클라이언트가 연결 종료를 담당합니다.
우리는 시스템이 오랜 기간 동안 (보통 며칠간) 과부하 상태에있는 경우 프로세스가 수행 할 수없는 정도까지 서버 상자 (netstat -a)에 CLOSE_WAIT 소켓이 쌓이게되었습니다 더 이상의 연결을 수락하십시오. 그 시점에서 우리는 프로세스를 바운스하고 다시 실행합니다.
우리는 ASP.NET 응용 프로그램의 일부로드 테스트를 실행하여 문제를 복제하려고 시도했습니다. 코드의 일부 문제를 추론 할 수 없었기 때문에 문제를 재현하려고 시도했습니다.
은 System.Net.Sockets.SocketException : 기존의 연결이 강제로 폐쇄되었다 우리는 우리가 이것을 관리하고 소켓 서버의 로그에서의 SocketException으로 스스로를 만들어 낸 문제의 WireShark로 packet trace으로 돌아가 셨습니다 것 같아요 System.Net.Sockets.Socket.BeginSend (바이트 [] 버퍼 오프셋 INT32, INT32 크기 socketFlags socketFlags, AsyncCallback 콜백, 객체 상태)에서 원격 호스트는
난에서 문제를 재현 시도한 단일 ASP.NET 응용 프로그램과 동일한 코드를 사용하여 소켓 서버에 직접 연결하는 단일 스레드 프로세스로 패킷 추적을 수행 할 수 없습니다.
아무도 우리가 잘못했을 가능성이 있는지 확인하거나 시도 할 다음 일을 제안하지 않았습니까?
소켓은 사용 (..) 블록의 일부로 닫혀 있습니다. 그러나 현재는 .Shutdown 및 .Close를 명시 적으로 수행하지 않습니다. 일반적인 테스트에서는 문제가되지 않습니다. 서버는 우리가 찾을 수있는 모든 코드 경로에서 명시 적으로 둘 다 수행합니다 (비동기이기 때문에 복잡합니다). –
@Kieran - 서버 프로세스를 수신 거부하면 CLOSE_WAITs가 지워진다는 사실은 내가 어딘가에서 닫히지 않는다는 것을 나타냅니다. –