게임 렉 백서 › L2 클라이언트 OS·기기
수신 버퍼 넘침 Socket receive buffer overflow
원인 ID co-rcvbuf · 주 담당 게임개발팀·클라이언트 개발
그림과 실험이 있는 원본 카드로 열기 →
게임이 바빠서 소켓(OS가 제공하는 네트워크 송수신 인터페이스)에서 패킷을 늦게 꺼내면 OS 버퍼가 넘칩니다.
왜 프레임이 밀려 게임이 소켓을 늦게 읽음 → 그러면 OS 수신 버퍼가 가득 차 UDP는 버리고 TCP는 수신 윈도우를 줄여 송신을 멈추게 함 → 화면에서는 순간이동(UDP) 또는 몰아치기(TCP)
- 증상
- 순간이동, 몰아치기
- 요인
- 손실, 정체
- 누가 겪나
- 나만
- 언제
- 사람이 몰릴 때
- 담당
- 주 담당 게임개발팀·클라이언트 개발
- 게임개발팀 할 일
- 수신 전용 스레드, 버퍼 크기 조정(SO_RCVBUF).
- 수치 감각
- 기본 수신 버퍼는 OS·설정에 따라 수십~수백 KB. 사람 많은 곳의 업데이트는 1초에 수백 KB가 되기도 합니다.
- 그래프에서는
- 인원·부하를 따라 오름 · UDP 수신 버퍼 폐기 수, 프레임 시간
- 확인할 곳
- 윈도우 성능 모니터의 Microsoft Winsock BSP\Dropped Datagrams(소켓 수신 버퍼가 모자라 버린 UDP 수)와 UDPv4\Datagrams Received Errors를 프레임 시간과 함께 기록하고, 게임은 받은 패킷 순번의 빈 곳을 셈
- 이러면 맞음
- 사람 많은 곳이나 긴 프레임 직후 Dropped Datagrams가 늘고 같은 순간 게임 순번에 빈 곳이 생김. 같은 시각 회선 쪽 손실은 없음
- 이러면 아님
- Dropped Datagrams는 그대로인데 순번만 빠지면 경로상의 손실
- 확인 수단
- 유저 쪽 환경에서 확인
출처
- socket(7) — Linux manual page Linux man-pages
SO_RCVBUF는 소켓 수신 버퍼 최대 크기, 기본값은 rmem_default, 최대값은 rmem_max로 정해짐(안드로이드도 리눅스 커널) - SOL_SOCKET Socket Options (Winsock2.h) Microsoft
윈도우 SO_RCVBUF: 소켓마다 수신용으로 잡아 두는 버퍼 공간 - RFC 9293: Transmission Control Protocol (TCP) IETF
TCP 윈도우 필드는 수신 측이 더 받을 수 있는 바이트 수, 0이면 송신 측은 제로 윈도우 프로브만 보내며 기다림 - Low Latency Workloads Management and Operations Microsoft
Microsoft Winsock BSP 카운터 세트의 Dropped Datagrams·Dropped Datagrams/sec: 앱이 처리하는 속도보다 UDP가 빨리 오거나 수신 소켓 버퍼가 모자라 버린 수 - Network-Related Performance Counters Microsoft
UDPv4·UDPv6: Datagrams Received Errors, Microsoft Winsock BSP: Dropped Datagrams 카운터
함께 보면 좋은 원인
같은 층: L2 클라이언트 OS·기기
같은 증상(순간이동)의 다른 층 원인
그림과 실험이 있는 원본 카드 보기