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

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

수신 서버 호스트의 패킷 폐기 Receiver host drops (ring, softirq, CPU)

원인 ID rt-host-drop · 주 담당 인프라팀·서버 인프라

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

패킷은 서버까지 왔는데 NIC의 링 버퍼(도착한 패킷을 잠시 담아 두는 버퍼)가 넘치거나, 커널의 수신 처리 코어가 포화되어 버려집니다.

왜 접속자 폭증·코어 하나에 몰린 인터럽트·가상 머신 CPU 스틸·가상 스위치 과부하 → 그러면 링 버퍼(rx_missed_errors 등, 이름은 드라이버마다 다름)나 커널 수신 대기열(softnet dropped)에서 폐기 → 화면에서는 사람 몰릴 때 서버 전체에서 동시에 입력이 늦게 먹히고 멈칫

증상
입력 지연, 멈춤, 몰아치기, 순간이동
요인
손실, 정체
누가 겪나
서버 전체
언제
사람이 몰릴 때
담당
주 담당 인프라팀·서버 인프라
인프라팀 할 일
ethtool -S의 rx_missed_errors 같은 폐기 카운터와 /proc/net/softnet_stat의 dropped를 모니터링에 추가, 링 버퍼 크기 늘리기(ethtool -G), RSS·인터럽트를 여러 코어로 분산, 게임 스레드와 수신 처리 코어 분리, CPU 여유 확보, 가상 머신이면 CPU 스틸·가상 스위치 부하 확인.
수치 감각
서버가 받다가 버린 패킷은 클라이언트가 다시 보내므로 서버의 재전송 지표에는 잘 안 잡힙니다. 이런 폐기는 ethtool -S의 rx_missed_errors 같은 폐기 카운터(이름은 드라이버마다 다름)와 /proc/net/softnet_stat의 dropped에 먼저 나타납니다.
그래프에서는
한도에 닿아 평평해짐 · 코어별 softirq 사용률, NIC 폐기 카운터
확인할 곳
ethtool -S의 폐기 카운터(rx_missed_errors 등, mlx5는 rx_out_of_buffer·rx_discards_phy), ip -s -s link의 missed, /proc/net/softnet_stat의 2번째 열(dropped)·3번째 열(time_squeeze)을 보고, mpstat -P ALL로 코어별 %soft(소프트 인터럽트 처리)를 봄. 가상 머신이면 %steal도 봄
이러면 맞음
사람이 몰리는 시각에 폐기 카운터나 softnet dropped가 늘고 수신 처리를 맡은 코어의 %soft가 100% 가까이에서 더 오르지 못함. 그 서버의 모든 연결에서 동시에 입력이 늦어짐
이러면 아님
서버의 폐기 카운터가 그대로이고 재전송이 특정 지역·통신사 연결에 몰리면 경로 쪽 손실. 서버가 보낸 패킷을 경로에서 잃으면 서버의 nstat TcpRetransSegs가 늘고 이 카운터들은 그대로임
확인 수단
인프라 도구로 확인(게임 코드 불필요)

출처

  1. Interface statistics Linux kernel
    rx_missed_errors는 버퍼가 없어 호스트가 받지 못한 패킷 수(/proc/net/dev에서는 drop에 합산), ip -s -s link로 확인
  2. drivers/net/ethernet/intel/igb/igb_ethtool.c Linux kernel
    ethtool -S 카운터 이름은 드라이버가 정함(예: igb의 rx_missed_errors·rx_no_buffer_count)
  3. Ethtool counters Linux kernel
    mlx5 드라이버의 rx_out_of_buffer(수신 큐에 버퍼가 없음)·rx_discards_phy(포트 버퍼 부족으로 폐기)
  4. net/core/net-procfs.c Linux kernel
    /proc/net/softnet_stat은 CPU마다 한 줄, 16진수이며 2번째 열이 dropped, 3번째 열이 time_squeeze
  5. Documentation for /proc/sys/net/ Linux kernel
    netdev_max_backlog: 커널이 처리하는 것보다 빨리 들어올 때 쌓아 두는 수신 대기열 한도
  6. Scaling in the Linux Networking Stack Linux kernel
    RSS: NIC가 여러 수신 큐로 나눠 여러 CPU에서 처리
  7. ethtool(8) — Linux manual page ethtool
    -G(--set-ring)로 링 버퍼 크기 변경
  8. proc_stat(5) — Linux manual page Linux man-pages
    /proc/stat의 steal: 가상화 환경에서 다른 OS가 CPU를 쓴 시간
  9. mpstat(1) — Linux manual page sysstat
    mpstat -P ALL로 코어별 사용률, %soft는 소프트 인터럽트 처리 시간, %steal은 하이퍼바이저가 다른 가상 CPU를 처리하느라 기다린 시간
  10. net/ipv4/proc.c Linux kernel
    nstat에 나오는 TcpRetransSegs(Tcp 항목의 RetransSegs)

함께 보면 좋은 원인

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

같은 증상(입력 지연)의 다른 층 원인

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