tcp 접속이 딜레이 되는 현상
리눅스 커널 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 설정값 변경으로 해결할 수 있는 방안이 있을까요?
아님 어플리케이션 문제 일까요..?

