패킷은 서버까지 왔는데 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가 늘고 이 카운터들은 그대로임
확인 수단
인프라 도구로 확인(게임 코드 불필요)
출처
Interface statisticsLinux kernel rx_missed_errors는 버퍼가 없어 호스트가 받지 못한 패킷 수(/proc/net/dev에서는 drop에 합산), ip -s -s link로 확인