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

게임 렉 백서 › L6 서버 네트워크 카드

링 버퍼 부족 RX ring buffer overflow

원인 ID nic-ring · 주 담당 인프라팀·서버 인프라

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

NIC가 패킷을 잠시 담아 두는 링 버퍼가 작으면, 순간적으로 몰릴 때 버퍼가 넘쳐 패킷이 버려집니다.

왜 링 버퍼가 기본값(드라이버마다 슬롯 256~2,048개)으로 작음 → 그러면 버스트 때 CPU가 꺼내기 전에 버퍼가 넘침 → 화면에서는 버스트 순간에만 손실(순간이동·스킬 씹힘). 게임 서버 로그에는 흔적이 없음

증상
순간이동, 씹힘·롤백
요인
손실
누가 겪나
서버 전체
언제
사람이 몰릴 때
담당
주 담당 인프라팀·서버 인프라
인프라팀 할 일
링 버퍼 크게(ethtool -G), 폐기(drop) 카운터 감시(ethtool -S의 rx_missed_errors 등, 이름은 드라이버마다 다름).
수치 감각
초당 100만 패킷이 몰리면 슬롯 1,024개는 약 1ms 만에 찹니다. 그 사이 CPU가 한 번만 늦게 와도 넘칩니다. 대부분의 NIC는 수천 개까지 늘릴 수 있습니다.
그래프에서는
가끔 무작위로 튐 · NIC 수신 폐기 카운터
확인할 곳
ethtool -S의 수신 폐기 카운터(rx_missed_errors, rx_fifo_errors 등, 이름은 드라이버마다 다름)와 ip -s -s link의 missed를 짧은 간격으로 모으고, ethtool -g로 현재 링 크기와 최대값을 확인
이러면 맞음
버스트 순간에 폐기 카운터가 늘고 현재 링 크기가 최대값보다 한참 작음. 링을 키우면 폐기가 줄어듦
이러면 아님
폐기 카운터가 그대로인데 손실이 있으면 커널 다음 단계(“커널 소켓 버퍼 부족”)나 네트워크 구간. 한 코어의 %soft가 100%면 “NIC 인터럽트 단일 코어 집중”
확인 수단
인프라 도구로 확인(게임 코드 불필요)

출처

  1. Linux Base Driver for Intel(R) Ethernet Network Connection (e1000) Linux kernel
    e1000 수신 디스크립터(링 슬롯) 기본 256개, 4,096개까지 늘릴 수 있음
  2. drivers/net/ethernet/intel/ice/ice.h (Linux v6.12) Linux kernel
    ice 드라이버 수신 디스크립터 기본 2,048개, 최대 8,160개
  3. Interface statistics Linux kernel
    버퍼가 모자라 장치가 버린 패킷은 rx_missed_errors로 집계, 드라이버별 통계는 ethtool -S로 확인
  4. ethtool(8) — Linux manual page ethtool
    -g로 링 크기(현재값·최대값) 확인, -G로 변경, -S로 드라이버별 통계

함께 보면 좋은 원인

같은 층: L6 서버 네트워크 카드

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

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