게임 렉 백서 › TCP 재전송의 근본 원인
폴리서의 초과분 폐기 Traffic policing
원인 ID rt-policer · 주 담당 인프라팀·네트워크 인프라 · 함께 인프라팀·서버 인프라, 게임개발팀·서버 개발
그림과 실험이 있는 원본 카드로 열기 →
통신사 요금제, 클라우드 인스턴스 한도, DDoS 방어 장비는 정해진 속도를 넘는 패킷을 대기열에 넣지 않고 즉시 버리기도 합니다.
왜 순간 전송량이 허용 속도·허용 버스트를 넘음 → 그러면 넘는 패킷을 대기열 없이 바로 폐기(폴리싱) → 화면에서는 버스트가 큰 순간마다 여러 개가 사라져 멈춤 뒤 몰아치기, 평균 속도는 한도 아래로 보임
- 증상
- 멈춤, 몰아치기, 순간이동
- 요인
- 손실
- 누가 겪나
- 서버 전체, 특정 지역·통신사, 나만
- 언제
- 사람이 몰릴 때, 저녁 피크 시간
- 담당
- 주 담당 인프라팀·네트워크 인프라 · 함께 인프라팀·서버 인프라, 게임개발팀·서버 개발
- 게임개발팀 할 일
- 틱마다 몰아 보내는 양을 틱 안에 나눠 보내 순간 전송량을 허용 버스트 아래로 낮추기, 초당 패킷 수 한도에 걸리면 한 틱의 메시지를 한 패킷에 합치기.
- 인프라팀 할 일
- 네트워크: 장비의 폴리서 초과 카운터 확인, 폴리서 대신 셰이퍼, 허용 버스트 늘리기. 서버 장비·OS: 클라우드 한도 초과 지표(AWS는 ethtool -S의 bw_out_allowance_exceeded·pps_allowance_exceeded) 확인, 인스턴스 상향, 서버 페이싱(리눅스 fq 큐).
- 수치 감각
- 셰이퍼(대기열에 넣어 늦춤)는 지연을 늘리고 폴리서(즉시 폐기)는 손실을 늘립니다. TCP 게임 연결은 손실 한 번에 수백 ms 멈출 수 있어, 한도를 잠깐 넘는 정도라면 대개 폴리서 쪽이 영향이 큽니다.
- 그래프에서는
- 한도에 닿아 평평해짐 · 짧은 간격의 송신량, 폴리서·allowance 초과 카운터
- 확인할 곳
- 폴리서가 걸린 장비의 초과(exceed)·폐기 카운터를 보고 클라우드면 ethtool -S의 bw_out_allowance_exceeded·pps_allowance_exceeded를 봄. 손실이 난 연결은 ss -ti의 rtt나 패킷 캡처로 손실 직전의 RTT를 봄
- 이러면 맞음
- 초과 카운터가 늘고 짧은 간격으로 본 송신량이 어떤 값에서 잘린 듯 평평함. 손실 직전에 RTT가 오르지 않고 버스트가 큰 순간에만 여러 패킷이 한꺼번에 사라짐
- 이러면 아님
- 손실 직전에 RTT가 먼저 오르면 대기열 넘침(“병목 대기열 넘침”, “송신 버스트로 얕은 버퍼 넘침”). 초과 카운터가 그대로면 다른 원인
- 확인 수단
- 인프라 도구로 확인(게임 코드 불필요)
출처
- RFC 2475: An Architecture for Differentiated Services IETF
셰이핑은 패킷을 늦춰 트래픽 프로파일에 맞추고 폴리싱은 프로파일을 넘는 패킷을 버린다는 정의 - An Internet-Wide Analysis of Traffic Policing Google
폴리싱이 걸린 전송은 손실률이 평균 6배 높고 페이싱·셰이핑으로 같은 목적을 이룰 수 있음. 폴리싱은 RTT 증가 없이 초과분을 버리고 대기열 넘침은 손실 전에 RTT가 오른다는 구분(SIGCOMM 2016) - Monitor network performance for ENA settings on your EC2 instance AWS
ethtool -S의 bw_out_allowance_exceeded·pps_allowance_exceeded: 인스턴스 한도를 넘어 대기열에 넣거나 버린 패킷 수 - tc-fq(8) — Linux manual page iproute2
리눅스 fq 큐의 연결별 페이싱 - ss(8) — Linux manual page iproute2
ss -i의 rtt(평균 왕복 시간)
함께 보면 좋은 원인
같은 층: TCP 재전송의 근본 원인
같은 증상(멈춤)의 다른 층 원인
그림과 실험이 있는 원본 카드 보기