피드로 돌아가기
Hacker NewsHacker News
Backend

TCP Socket close() 시 잔류 데이터로 인한 ECONNRESET 해결

The occasional ECONNRESET

2026년 5월 17일7advanced

Context

Nginx와 Gunicorn 기반 아키텍처에서 간헐적으로 발생하는 ECONNRESET 오류 분석. Socket에 읽지 않은 데이터가 남아있는 상태에서 close() 호출 시 TCP RST 패킷이 송신되는 네트워크 동작 특성으로 인한 통신 단절 발생.

Technical Solution

  • Client의 writev() 분할 전송으로 인해 Socket 수신 버퍼에 데이터가 잔류하는 상황 식별
  • Gunicorn 및 Application의 Lazy Reading 특성으로 인한 HTTP Body 미수신 상태 확인
  • Application 계층에서 HTTP Body에 대한 Dummy Operation을 수행하여 수신 버퍼 강제 비우기 처리
  • 모든 데이터 수신 완료 후 close()를 호출하는 순차적 흐름 보장으로 TCP RST 발생 원천 차단
  • Nginx의 client_max_body_size 설정을 통한 과도한 Body 수신으로 인한 DoS 위험 방지 설계

- TCP Socket 종료 전 수신 버퍼의 데이터 잔류 여부 확인 - Application의 Lazy Reading으로 인해 의도치 않게 버퍼에 데이터가 남는지 검토 - Socket close() 전 모든 Pending Data의 Read 완료 보장 로직 구현 - 대량 데이터 수신 시 메모리 보호를 위한 Max Body Size 제한 설정

원문 읽기