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

게임 렉 백서 › 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가 비어 있는데 순간이동하면 서버 송신 쪽 문제가 아님. 그 사람의 회선 손실(“무선 구간 손실”)이나 화면 보간 쪽
확인 수단
게임 서버·클라이언트의 로그·지표가 필요

출처

  1. IP Sysctl Linux kernel
    tcp_wmem: 자동 조절되는 송신 버퍼 최대치 기본 64KB~4MB(메모리에 따라), tcp_notsent_lowat·TCP_NOTSENT_LOWAT로 아직 안 보낸 데이터 양 제한
  2. net/ipv4/tcp_diag.c (Linux v6.12) Linux kernel
    ss의 Recv-Q·Send-Q 값: 리슨 소켓은 accept를 기다리는 접속 수와 backlog 한도, 연결된 소켓은 앱이 아직 안 읽은 바이트와 ACK를 받지 못한 송신 바이트

함께 보면 좋은 원인

같은 층: L8 소켓과 프로토콜

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

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