tcp 접속이 딜레이 되는 현상

anarche의 이미지

리눅스 커널 2.6 에서 어플리케이션 서버를 운영하고 있습니다.

그런데 접속이 몰리는 시간대에 서버에서 클라이언트 접속이 delay 되는 현상이 발생합니다.

현상이 일어나는 시점에 대략 분당 1000 - 1200 건의 접속이 발생하고 있구요.

정상적으로 접속이 발생하는 건들도 있고 delay 되는 건들도 있습니다. (약 1/10 정도가 delay 됨)

그 시점에서 netstat 을 결과를 보면 SYN_RECEIVED 상태의 연결이 상당히 많은 상태이구요

그렇다고 항상 발생하는건 아닙니다. 어떨땐 분당 2000 건 이상이 접속될때에도 정상적으로 동작을 하구요..

아래는 접속이 delay 되고 있는 접속 현상중 하나의 tcpdump 결과

09:07:32.298142 클라이언트 > 서버: S 4095571688:4095571688(0) win 65535

09:07:32.298153 서버 > 클라이언트: S 1154391730:1154391730(0) ack 4095571689 win 5840

09:07:32.358102 클라이언트 > 서버: . ack 1154391731 win 65535

09:07:32.490252 클라이언트 > 서버: P 4095571689:4095571756(67) ack 1154391731 win 65535

09:07:35.349903 클라이언트 > 서버: P 4095571689:4095571756(67) ack 1154391731 win 65535

09:07:36.701209 서버 > 클라이언트: S 1154391730:1154391730(0) ack 4095571689 win 5840

09:07:36.765614 클라이언트 > 서버: . ack 1154391731 win 65535

09:07:41.377104 클라이언트 > 서버: P 4095571689:4095571756(67) ack 1154391731 win 65535

09:07:42.700299 서버 > 클라이언트: S 1154391730:1154391730(0) ack 4095571689 win 5840

09:07:42.720868 클라이언트 > 서버: . ack 1154391731 win 65535 -> server application 에서 접속을 인지함

09:07:53.046508 서버 > 클라이언트: F 1154391731:1154391731(0) ack 4095571689 win 5840 -> server 에서 접속을 끊음

09:07:53.095629 클라이언트 > 서버: . ack 1154391732 win 65535

09:07:53.099502 클라이언트 > 서버: F 4095571756:4095571756(0) ack 1154391732 win 65535

09:07:53.099507 서버 > 클라이언트: R 1154391732:1154391732(0) win 0

설명을 하자면

클라이언트가 syn 전송
서버에서 syn+ack 전송
클라이언트 syn ack 전송
클라이언트 데이터 push
클라이언트 데이터 재전송
서버에서 syn+ack 재전송
클라이언트 syn ack 전송
클라이언트 데이터 재전송
서버에서 syn+ack 재전송
클라이언트 syn ack 전송 -

문제는 서버에서 syn syn+ack syn ack 를 다 받았음에도 syn+ack 를 재전송하고 있다는 겁니다.
재전송하는 시점에서는 application에도 인지를 못하고 있구요...

혹시 이러한 문제에 대해서 tcp 설정값 변경으로 해결할 수 있는 방안이 있을까요?
아님 어플리케이션 문제 일까요..?