Socket과 OS Network

3줄 요약

  • Socket은 애플리케이션 네트워크 연결이 OS에서 표현되는 객체이며 file descriptor와 port를 사용한다.
  • Listen backlog, accept queue, connection state, TIME_WAIT은 서버가 요청을 받기 전후의 병목을 드러낸다.
  • Tomcat connector 설정은 Java thread와 OS socket queue 사이를 연결하므로 네트워크 장애 분석에서 함께 봐야 한다.

핵심 정리

  • Port는 process가 network endpoint를 식별하는 번호이고 socket은 연결 또는 수신 대기 상태를 가진 OS 객체다.
  • Listen backlog와 accept queue가 부족하면 애플리케이션 코드에 도달하기 전에 연결 대기가 생긴다.
  • TIME_WAIT은 TCP 연결 종료 후 지연 상태이며, 과도하면 port나 connection churn 문제를 의심한다.
  • Tomcat의 max threads, accept count, connection timeout은 OS socket과 요청 thread 사이의 완충 장치다.
  • ss, lsof, netstat는 socket state와 process 매핑을 보는 기본 도구다.

헷갈리는 지점

  • HTTP 장애는 항상 Spring Controller 문제라고 보기 쉽다.
    • 연결 수락, TLS, socket queue, file descriptor 고갈은 Controller 이전에 발생한다.
    • Tomcat과 OS 지표를 함께 봐야 한다.
  • Port와 socket을 같은 말로 쓰기 쉽다.
    • Port는 endpoint 번호이고 socket은 OS가 관리하는 통신 객체다.
    • 하나의 process는 여러 socket과 file descriptor를 가질 수 있다.
  • TIME_WAIT은 무조건 없애야 한다고 생각하기 쉽다.
    • TIME_WAIT은 TCP의 정상 동작이다.
    • 문제는 비정상적으로 많은 연결 churn이나 timeout 설정 불일치다.

확인 질문

  • Socket이 file descriptor와 연결되는 이유는 무엇인가?
    • Linux에서 socket도 process가 읽고 쓰는 열린 파일 같은 자원으로 관리되기 때문이다.
  • Accept queue 병목은 어디에서 나타나는가?
    • 연결은 들어오지만 애플리케이션이 accept하거나 thread로 넘기기 전에 대기할 때 나타난다.
  • Tomcat connector 설정을 OS와 함께 봐야 하는 이유는 무엇인가?
    • max thread, accept count, timeout이 socket backlog와 요청 처리 thread의 경계를 만들기 때문이다.