게임 렉 백서 › L8 소켓과 프로토콜
유휴 후 슬로 스타트 Slow start after idle
원인 ID sk-slowstart · 주 담당 인프라팀·서버 인프라 · 함께 게임개발팀·서버 개발
그림과 실험이 있는 원본 카드로 열기 →
TCP는 한동안 유휴 상태면 혼잡 윈도우(한 번에 보낼 수 있는 양)를 다시 줄여, 갑자기 큰 데이터를 보낼 때 여러 번에 나눠 보냅니다.
왜 유휴 상태이던 연결로 마을 입장 등 큰 데이터를 보냄 → 그러면 혼잡 윈도우가 줄어 있어 여러 왕복에 나눠 전송 → 화면에서는 입장 직후 주변 캐릭터와 NPC가 왕복 몇 번만큼 늦게 나타남(먼 서버일수록 눈에 띔)
- 증상
- 입력 지연, 안 보임·유령 개체
- 요인
- 지연
- 누가 겪나
- 나만
- 언제
- 이동 중·지역 전환 때, 가만히 있다가
- 담당
- 주 담당 인프라팀·서버 인프라 · 함께 게임개발팀·서버 개발
- 게임개발팀 할 일
- 입장 데이터 줄이기(꼭 필요한 것부터 먼저 보내기).
- 인프라팀 할 일
- tcp_slow_start_after_idle 끄기(리눅스, 서버 전체 설정).
- 수치 감각
- RTO보다 오래 유휴 상태면 혼잡 윈도우가 줄기 시작해, 오래 유휴 상태였다면 약 14KB(패킷 10개)까지 내려갑니다. 그러면 100KB는 한 번에 못 보내고 왕복 3번에 나눠 보냅니다.
- 그래프에서는
- 일부만 높음 · 입장 직후 전송 시간(RTT가 긴 유저)
- 확인할 곳
- sysctl net.ipv4.tcp_slow_start_after_idle 값을 확인하고, 유휴 뒤 지역에 입장하는 순간 그 연결의 ss -ti에서 cwnd(혼잡 윈도우)가 작아졌는지 봄
- 이러면 맞음
- 설정이 1(기본)이고 유휴 뒤 입장 순간 cwnd가 10 안팎으로 줄어 전송이 왕복 여러 번에 나뉨. RTT가 긴 유저일수록 늦게 나타나고 0으로 바꾸면 사라짐
- 이러면 아님
- cwnd가 크게 유지되는데도 늦게 나타나면 서버 쪽 입장 처리(“밀집 지역 진입 시 스폰 폭주”)
- 확인 수단
- 인프라 도구로 확인(게임 코드 불필요)
출처
- IP Sysctl Linux kernel
tcp_slow_start_after_idle 기본 켜짐, RTO 동안 유휴면 혼잡 윈도우를 줄임(RFC 2861 방식) - RFC 5681: TCP Congestion Control IETF
RTO보다 오래 데이터를 보내지 않았으면 혼잡 윈도우를 재시작 윈도우 min(IW, cwnd) 이하로 줄이고 슬로 스타트 - RFC 6928: Increasing TCP's Initial Window IETF
초기 윈도우 10세그먼트, 최대 14,600바이트 - ss(8) — Linux manual page iproute2
-i의 cwnd(혼잡 윈도우)·ssthresh(슬로 스타트 임계값)
함께 보면 좋은 원인
같은 층: L8 소켓과 프로토콜
같은 증상(입력 지연)의 다른 층 원인
그림과 실험이 있는 원본 카드 보기