한국어English日本語简体中文繁體中文DeutschไทยTiếng ViệtРусскийPortuguês (Brasil)EspañolBahasa Indonesia

게임 렉 백서 › TCP 재전송의 근본 원인

RTO 설정이 환경과 맞지 않음 RTO min too low or too high

원인 ID rt-rto-setting · 주 담당 인프라팀·서버 인프라 · 함께 게임개발팀·서버 개발

그림과 실험이 있는 원본 카드로 열기 →

RTO 최소값을 너무 낮추면 조금만 늦어도 불필요한 재전송이 나고 기본값(200ms)은 게임 입장에서 너무 길어 한 번 잃을 때마다 오래 멈춥니다.

왜 데이터센터용으로 RTO 최소값을 크게 낮춤, 또는 인터넷 구간에 기본값 그대로 사용 → 그러면 낮으면 순간 지연에도 재전송 폭주, 높으면 손실마다 긴 대기 → 화면에서는 기본값이면 손실 한 번에 수백 ms 멈춤 뒤 몰아치기, 너무 낮추면 멈춤은 줄지만 불필요한 재전송이 급증해 회선을 낭비

증상
멈춤, 몰아치기, 입력 지연
요인
지연
누가 겪나
서버 전체
언제
항상
담당
주 담당 인프라팀·서버 인프라 · 함께 게임개발팀·서버 개발
게임개발팀 할 일
리눅스 6.15 이상이면 게임 연결에 TCP_RTO_MAX_MS로 RTO 상한 낮추기 검토(포기까지 걸리는 시간도 짧아지므로 TCP_USER_TIMEOUT으로 끊김 판정 시간을 함께 정하기), 서버 간 내부 연결만 소켓 옵션 TCP_RTO_MIN_US(6.15 이상)로 RTO 최소값 낮추기, 소켓 옵션 TCP_THIN_LINEAR_TIMEOUTS로 게임 연결만 연속 RTO가 두 배로 늘지 않게 하기 검토.
인프라팀 할 일
서버 간 내부 연결만 경로별로 rto_min 낮추기, 인터넷 구간은 기본값 유지하되 RACK-TLP·thin stream 설정(tcp_thin_linear_timeouts)으로 보완.
수치 감각
리눅스 RTO = 왕복 시간 + max(200ms, RTT 편차×4). 실패할 때마다 두 배, 최대 120초. 리눅스 6.15 이상은 TCP_RTO_MAX_MS로 이 상한을 1초까지 낮출 수 있습니다.
그래프에서는
처음부터 늘 높음 · 연결별 RTO, 불필요한 RTO 수
확인할 곳
서버의 RTO 최소값 설정(ip route show의 rto_min, 리눅스 6.11 이상은 sysctl net.ipv4.tcp_rto_min_us)과 ss -ti의 rto·rtt를 보고, nstat의 TcpExtTCPSpuriousRTOs 증가분을 봄
이러면 맞음
최소값을 낮춘 서버에서 인터넷 연결의 rto가 rtt에 바짝 붙어 있고 TcpExtTCPSpuriousRTOs가 많이 늘어남. 기본값 그대로면 게임 연결의 rto가 rtt보다 200ms 이상 크고 손실 한 번마다 그만큼 멈춤
이러면 아님
rto가 기본 계산대로(rtt + 200ms 안팎)이고 불필요한 RTO도 적은데 멈춤이 유난히 길면 연속 손실이나 복구 방식 쪽(“thin stream의 느린 복구”, “중간 장비의 TCP 옵션 제거”)
확인 수단
인프라 도구로 확인(게임 코드 불필요)

출처

  1. RFC 6298: Computing TCP's Retransmission Timer IETF
    RTO = SRTT + max(G, 4·RTTVAR), 최소 1초 권고, 실패할 때마다 두 배, 최대값을 두려면 60초 이상
  2. include/net/tcp.h Linux kernel
    리눅스 TCP_RTO_MIN 200ms, TCP_RTO_MAX 120초
  3. net/ipv4/tcp_input.c Linux kernel
    리눅스 RTO는 SRTT + rttvar이고 rttvar는 RTO 최소값(기본 200ms) 아래로 내려가지 않음
  4. tcp: add the ability to control max RTO Linux kernel
    TCP_RTO_MAX_MS 소켓 옵션 추가(1~120초), 리눅스 6.15부터
  5. tcp: add sysctl_tcp_rto_min_us Linux kernel
    서버 전체 기본 RTO 최소값 tcp_rto_min_us 추가, 리눅스 6.11부터
  6. tcp: support TCP_RTO_MIN_US for set/getsockopt use Linux kernel
    소켓마다 RTO 최소값을 정하는 TCP_RTO_MIN_US 소켓 옵션 추가, 리눅스 6.15부터
  7. IP Sysctl Linux kernel
    tcp_rto_min_us 기본 200000(경로 옵션 rto_min, 소켓 옵션 TCP_RTO_MIN_US가 우선), tcp_rto_max_ms 1,000~120,000(기본 120,000), tcp_thin_linear_timeouts
  8. ip-route(8) — Linux manual page iproute2
    경로별 rto_min 옵션: 그 목적지와 통신할 때의 RTO 최소값
  9. Thin-streams and TCP Linux kernel
    TCP_THIN_LINEAR_TIMEOUTS로 thin stream 연결만 지수 백오프를 끌 수 있음
  10. tcp(7) — Linux manual page Linux man-pages
    TCP_USER_TIMEOUT: 확인받지 못한 데이터를 기다리다 연결을 닫기까지의 시간
  11. ss(8) — Linux manual page iproute2
    ss -i의 rto(ms)와 rtt
  12. SNMP counter Linux kernel
    TcpExtTCPSpuriousRTOs: F-RTO가 감지한 불필요한 RTO

함께 보면 좋은 원인

같은 층: TCP 재전송의 근본 원인

같은 증상(멈춤)의 다른 층 원인

그림과 실험이 있는 원본 카드 보기