게임 렉 백서 › 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 인터럽트 단일 코어 집중”
- 확인 수단
- 인프라 도구로 확인(게임 코드 불필요)
출처
- Linux Base Driver for Intel(R) Ethernet Network Connection (e1000) Linux kernel
e1000 수신 디스크립터(링 슬롯) 기본 256개, 4,096개까지 늘릴 수 있음 - drivers/net/ethernet/intel/ice/ice.h (Linux v6.12) Linux kernel
ice 드라이버 수신 디스크립터 기본 2,048개, 최대 8,160개 - Interface statistics Linux kernel
버퍼가 모자라 장치가 버린 패킷은 rx_missed_errors로 집계, 드라이버별 통계는 ethtool -S로 확인 - ethtool(8) — Linux manual page ethtool
-g로 링 크기(현재값·최대값) 확인, -G로 변경, -S로 드라이버별 통계
함께 보면 좋은 원인
같은 층: L6 서버 네트워크 카드
같은 증상(순간이동)의 다른 층 원인
그림과 실험이 있는 원본 카드 보기