게임 렉 백서 › L8 소켓과 프로토콜
느린 클라이언트(slow consumer) 처리 정책 Slow-consumer policy
원인 ID sk-slow-client · 주 담당 게임개발팀·서버 개발
그림과 실험이 있는 원본 카드로 열기 →
보낼 게 계속 쌓이는 클라이언트에게 서버가 오래된 업데이트를 버리거나 연결을 끊습니다.
왜 클라이언트의 회선이 서버가 보내는 양을 못 따라감 → 그러면 서버가 오래된 업데이트를 버리거나 한도 초과 시 연결 해제 → 화면에서는 그 사람만 순간이동 또는 접속 끊김
- 증상
- 순간이동, 접속 끊김
- 요인
- 손실
- 누가 겪나
- 나만
- 언제
- 사람이 몰릴 때
- 담당
- 주 담당 게임개발팀·서버 개발
- 게임개발팀 할 일
- 보내는 양 줄이기(거리별 갱신 빈도), 품질 낮춰 계속 보내기, 커널에 쌓아 두는 양 줄이기(리눅스 TCP_NOTSENT_LOWAT).
- 수치 감각
- 송신 버퍼가 256KB면 30KB/s 회선에서는 8초 넘게 밀린 데이터가 쌓입니다. 리눅스는 이 버퍼를 자동으로 수 MB까지 키우기도 합니다.
- 그래프에서는
- 일부만 높음 · 연결별 Send-Q, 클라이언트별 버린 업데이트 수
- 확인할 곳
- 게임 서버가 남기는 클라이언트별 송신 대기열 길이·버린 업데이트 수·끊김 사유를 보고, 서버에서 ss -tni로 그 연결의 Send-Q와 cwnd를 함께 확인
- 이러면 맞음
- 튀거나 끊긴 사람의 연결만 Send-Q가 계속 차 있고 게임 로그에 그 사람의 업데이트 폐기나 송신 대기열 초과로 인한 끊김이 기록됨
- 이러면 아님
- Send-Q가 비어 있는데 순간이동하면 서버 송신 쪽 문제가 아님. 그 사람의 회선 손실(“무선 구간 손실”)이나 화면 보간 쪽
- 확인 수단
- 게임 서버·클라이언트의 로그·지표가 필요
출처
- IP Sysctl Linux kernel
tcp_wmem: 자동 조절되는 송신 버퍼 최대치 기본 64KB~4MB(메모리에 따라), tcp_notsent_lowat·TCP_NOTSENT_LOWAT로 아직 안 보낸 데이터 양 제한 - net/ipv4/tcp_diag.c (Linux v6.12) Linux kernel
ss의 Recv-Q·Send-Q 값: 리슨 소켓은 accept를 기다리는 접속 수와 backlog 한도, 연결된 소켓은 앱이 아직 안 읽은 바이트와 ACK를 받지 못한 송신 바이트
함께 보면 좋은 원인
같은 층: L8 소켓과 프로토콜
같은 증상(순간이동)의 다른 층 원인
그림과 실험이 있는 원본 카드 보기