주문 서비스(order-svc)는 사내 L4 로드밸런서 뒤에 있는 재고 API(inventory.internal:80)를 HTTP keep-alive 연결 풀로 호출합니다. 요청이 몰리는 낮에는 아무 문제가 없는데, 트래픽이 한산한 새벽과 점심 직후에만 'connection reset by peer' 오류가 몇 건씩 납니다. 재시도하면 바로 성공합니다. 재고 API 팀은 "우리 서버 로그에는 그 요청이 아예 없다"고 하고, 주문 팀은 "재고 API가 가끔 연결을 끊는다"며 타임아웃을 늘리자고 합니다. 주문 서비스 파드에서 패킷을 잡아 봤습니다.
tcpdump로 HTTP 흐름 읽기: 한가할 때만 나는 connection reset by peer
주문 서비스(order-svc)는 사내 L4 로드밸런서 뒤에 있는 재고 API(inventory.internal:80)를 HTTP keep-alive 연결 풀로 호출합니다.
시나리오
단서
12:30:01.102 IP 10.0.3.21.51544 > 10.20.4.15.80: Flags [P.], seq 1:212, ack 1, length 211: HTTP: GET /v1/stock?sku=A-1001 HTTP/1.1 12:30:01.104 IP 10.20.4.15.80 > 10.0.3.21.51544: Flags [.], ack 212, length 0 12:30:01.118 IP 10.20.4.15.80 > 10.0.3.21.51544: Flags [P.], seq 1:305, ack 212, length 304: HTTP: HTTP/1.1 200 OK 12:30:01.118 IP 10.0.3.21.51544 > 10.20.4.15.80: Flags [.], ack 305, length 0 … 이 연결로 오간 패킷 없음 … 12:36:12.540 IP 10.0.3.21.51544 > 10.20.4.15.80: Flags [P.], seq 212:423, ack 305, length 211: HTTP: GET /v1/stock?sku=B-2002 HTTP/1.1 12:36:12.541 IP 10.20.4.15.80 > 10.0.3.21.51544: Flags [R], seq 305, win 0, length 0
12:36:12.542 ERROR call inventory failed: GET http://inventory.internal/v1/stock?sku=B-2002: read: connection reset by peer 12:36:12.561 INFO retry 1/2 succeeded (new connection)
# order-svc HTTP 클라이언트 연결 풀 maxIdleConnections: 50 idleTimeout: 10m tcpKeepAlive: off # 사내 L4 로드밸런서 (인프라팀 문서) TCP idle timeout: 350초 (변경 불가) — 시간이 지나면 연결 정보를 조용히 지우고, 그 뒤 들어오는 패킷에는 RST로 응답
과제 reset이 나는 원인을 패킷으로 설명하고, 당장의 조치와 설정 수정(검증 포함), 재발 방지책을 적어 보세요.
구독하면 이어서 볼 수 있어요
이 문제의 전체 시나리오와 점검 체크리스트, 복구 순서, 모범 풀이는 Pro 구독에서 열립니다.
먼저 볼 것
- tcpdump에서 한 연결(같은 포트 쌍)의 흐름만 따라 읽기
- RST를 누가 보냈는지, 요청이 서버까지 갔는지 판단하기
- 연결 풀의 idle timeout과 중간 장비의 idle timeout 비교
점검 체크리스트
- tcpdump -nn 으로 실패한 요청의 포트 쌍(10.0.3.21.51544)을 골라 그 연결만 시간순으로 읽기
- 실패 직전 그 연결이 얼마나 쉬었는지 타임스탬프로 계산
- 클라이언트 풀의 idleTimeout·TCP keepalive 설정과 로드밸런서·NAT·방화벽의 idle timeout 표 비교
- 재시도 대상이 멱등 요청(GET)인지 확인
복구와 재발 방지
같이 보면 좋은 질문
현장에서 본 비슷한 케이스
0/10