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

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

송신 버스트로 얕은 버퍼 넘침 Sender bursts overflow shallow buffers

원인 ID rt-burst · 주 담당 게임개발팀·서버 개발 · 함께 인프라팀·서버 인프라, 인프라팀·네트워크 인프라

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

서버가 틱마다 수천 명분 업데이트를 한순간에 몰아 보내면, 스위치의 작은 버퍼나 클라우드의 순간 한도가 1ms도 안 돼 넘쳐 일부가 버려집니다.

왜 틱 시작 순간 모든 사람에게 보낼 패킷을 한꺼번에 전송 → 그러면 여러 서버의 트래픽이 모이는 스위치 포트 버퍼(포트당 수백 KB~수 MB)나 클라우드 인스턴스 한도가 순간적으로 넘침(평균 사용률은 낮음) → 화면에서는 여러 사람이 동시에 순간이동·멈칫, 평균 지표로는 원인이 안 보임

증상
순간이동, 멈춤, 몰아치기
요인
손실
누가 겪나
특정 장소·채널, 서버 전체
언제
사람이 몰릴 때
담당
주 담당 게임개발팀·서버 개발 · 함께 인프라팀·서버 인프라, 인프라팀·네트워크 인프라
게임개발팀 할 일
한 틱의 전송을 틱 안에 나눠 보내기(수천 개 연결이 틱 시작에 몰리는 것은 연결별 페이싱으로 잘 안 풀림), 서버마다 틱 시작 시각을 분산, 큰 데이터를 보내는 연결은 SO_MAX_PACING_RATE로 속도 상한.
인프라팀 할 일
서버 장비·OS: 서버 전체 송신 속도 상한(서버 OS의 셰이퍼, 리눅스 tc), 연결 하나가 몰아 보내는 것은 페이싱(리눅스 fq 큐, BBR)으로 고르게. 네트워크: 버퍼 큰 스위치, 스위치 포트의 출력 폐기 카운터를 짧은 간격으로 확인(평균 사용률로는 안 보임).
수치 감각
10Gbps 포트로 1ms 동안 보낼 수 있는 양은 약 1.25MB. 여러 서버의 틱이 맞물려 한 포트로 몰리면 버퍼가 순식간에 찹니다.
그래프에서는
인원·부하를 따라 오름 · 스위치 포트 출력 폐기 수, 재전송률
확인할 곳
서버가 붙은 스위치 포트와 그 윗단 포트의 출력 폐기(ifOutDiscards)를 몇 초 간격으로 모으고, 클라우드면 ethtool -S의 bw_out_allowance_exceeded·pps_allowance_exceeded를 봄. 같은 시각의 재전송을 bcc tcpretrans로 모아 맞춰 봄
이러면 맞음
분 단위 평균 사용률은 낮은데 출력 폐기나 allowance 초과가 늘고 그 양이 동시 접속·한곳에 모인 인원을 따라 커짐. 재전송이 특정 유저 IP 대역(통신사·지역)에 몰리지 않고 그 서버의 여러 연결에서 같은 순간에 생김
이러면 아님
같은 포트에 CRC·입력 오류가 함께 늘면 “물리 오류”. 받는 서버의 NIC 폐기 카운터나 softnet dropped가 늘면 “수신 서버 호스트의 패킷 폐기”
확인 수단
인프라 도구로 확인(게임 코드 불필요)
더 알아보기
페이싱은 연결마다 따로 작동합니다. 수천 개 연결이 틱 시작에 한두 개씩 보내는 몰림은 연결별 페이싱으로 잘 안 풀리고, 게임 서버가 보내는 시점을 직접 나눠야 합니다. 반대로 한 연결이 큰 데이터를 보낼 때는 NIC가 수십 KB 데이터를 패킷 크기로 잘라 연달아 내보내는데(TSO), 이런 몰림은 페이싱이 잘 나눠 줍니다.

출처

  1. High-Resolution Measurement of Data Center Microbursts Meta
    데이터센터 랙 스위치 버스트의 70% 이상이 수십 µs 안에 끝나고 분 단위 평균 사용률과 드롭의 관계가 약함(IMC 2017)
  2. tc-fq(8) — Linux manual page iproute2
    fq 큐는 소켓(연결)마다 페이싱하고 SO_MAX_PACING_RATE로 연결별 최대 속도를 정함
  3. net/ipv4/tcp_bbr.c Linux kernel
    BBR은 추정한 병목 대역폭으로 pacing_rate를 정해 보냄
  4. IP Sysctl Linux kernel
    TCP는 흐름 속도에 맞춰 TSO 프레임 크기를 정함(최대 64KB, tcp_min_tso_segs)
  5. Monitor network performance for ENA settings on your EC2 instance AWS
    bw_out_allowance_exceeded·pps_allowance_exceeded: 인스턴스의 대역폭·초당 패킷 한도를 넘어 대기열에 넣거나 버린 패킷 수
  6. RFC 2863: The Interfaces Group MIB IETF
    ifOutDiscards: 오류가 없는데도 버퍼 공간 확보 등의 이유로 내보내지 않고 버린 패킷 수
  7. Demonstrations of tcpretrans, the Linux eBPF/bcc version IO Visor
    재전송마다 상대 주소·포트·연결 상태를 한 줄씩 보여 줌

함께 보면 좋은 원인

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

같은 증상(순간이동)의 다른 층 원인

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