Send Queue에 데이터가 물려있는 경우..
서버를 테스트 한다고, 패킷 제너레이터를 서버에 두대 붙여서 한쪽에서는 보내고(1번 클라이언트) 다른 한쪽은(2번 클라이언트) 받아서 통계를 내는 테스트를 하고 있습니다.
서버에서는 1번에서 TCP 코넥션을 받아서 인증절차등을 밟고, 2번으로 커넥션을 맺고 필요한 데이터는 2번에서 서버로 다시 서버에서 1번으로 보내줍니다.
모든 처리가 다 끊나면 1번에서 연결을 끊겠다는 의미의 데이터를 서버로 보내고, 서버는 2번으로 보내주고 양쪽 연결이 모두 종료되는것이 정상적인 루틴입니다.
초당100건 이상의 부하를 걸어 테스트를 하는 도중에 문제가 생겨서 netstat로 살펴보니 서버에서 2번 클라이언트로 연결을 끊겠다는 의미의 데이터크기인 29와 그다음 연결을 close했기때문에 보내주는 1, 합해서 30이 Send-Q에 걸려 있습니다. --> 이런놈들이 3000건 이상이고 상태는 FIN_WAIT1 입니다.
테스트는 반복적으로 일정수(3500)의 연결을 모두 붙였다, 끊었다, 다시 붙였다를 지속적으로 반복시켜주는 것이고, 빠르면 두세번에서, 늦을때는 수백번 반복후에 이렇게 거의 모든 연결이 netstat에서 FIN_WAIT1상태가 되는 현상이 생깁니다.
위에서 처럼 서버의 Send-Q에 30(release_data 29, close 1 (close로 1이 플러스 되었다는건 제 추측입니다.)) 이 쌓여 있다는건 보내주지 못한 서버쪽 문제라고 해야될까요 아니면 받지못한 클라이언트 문제일까요?
제 생각엔 아무래도 서버쪽 send queue에 남아있으면 결국 보내지 못한 서버쪽 문제라 볼 수 있다고 생각하는데, 이런 문제는 왜 생기고 어떻게 해결해야 하는지 궁금하기만 합니다.
문제의 원인들인 서버나, 클라이언트를 제가 작업한게 아니라 이런 현상만 갖고 질문하려니 좀 힘드네요.. ^^;
도움이 될만한 어떤 글이라도 환영합니다. 즐거운 하루 되세요.
댓글 달기