서버가 틱마다 수천 명분 업데이트를 한순간에 몰아 보내면, 스위치의 작은 버퍼나 클라우드의 순간 한도가 1ms도 안 돼 넘쳐 일부가 버려집니다.
왜 틱 시작 순간 모든 사람에게 보낼 패킷을 한꺼번에 전송 → 그러면 여러 서버의 트래픽이 모이는 스위치 포트 버퍼(포트당 수백 KB~수 MB)나 클라우드 인스턴스 한도가 순간적으로 넘침(평균 사용률은 낮음) → 화면에서는 여러 사람이 동시에 순간이동·멈칫, 평균 지표로는 원인이 안 보임
한 틱의 전송을 틱 안에 나눠 보내기(수천 개 연결이 틱 시작에 몰리는 것은 연결별 페이싱으로 잘 안 풀림), 서버마다 틱 시작 시각을 분산, 큰 데이터를 보내는 연결은 SO_MAX_PACING_RATE로 속도 상한.
인프라팀 할 일
서버 장비·OS: 서버 전체 송신 속도 상한(서버 OS의 셰이퍼, 리눅스 tc), 연결 하나가 몰아 보내는 것은 페이싱(리눅스 fq 큐, BBR)으로 고르게. 네트워크: 버퍼 큰 스위치, 스위치 포트의 출력 폐기 카운터를 짧은 간격으로 확인(평균 사용률로는 안 보임).
수치 감각
10Gbps 포트로 1ms 동안 보낼 수 있는 양은 약 1.25MB. 여러 서버의 틱이 맞물려 한 포트로 몰리면 버퍼가 순식간에 찹니다.
그래프에서는
인원·부하를 따라 오름 · 스위치 포트 출력 폐기 수, 재전송률
확인할 곳
서버가 붙은 스위치 포트와 그 윗단 포트의 출력 폐기(ifOutDiscards)를 몇 초 간격으로 모으고, 클라우드면 ethtool -S의 bw_out_allowance_exceeded·pps_allowance_exceeded를 봄. 같은 시각의 재전송을 bcc tcpretrans로 모아 맞춰 봄
이러면 맞음
분 단위 평균 사용률은 낮은데 출력 폐기나 allowance 초과가 늘고 그 양이 동시 접속·한곳에 모인 인원을 따라 커짐. 재전송이 특정 유저 IP 대역(통신사·지역)에 몰리지 않고 그 서버의 여러 연결에서 같은 순간에 생김
이러면 아님
같은 포트에 CRC·입력 오류가 함께 늘면 “물리 오류”. 받는 서버의 NIC 폐기 카운터나 softnet dropped가 늘면 “수신 서버 호스트의 패킷 폐기”
확인 수단
인프라 도구로 확인(게임 코드 불필요)
더 알아보기
페이싱은 연결마다 따로 작동합니다. 수천 개 연결이 틱 시작에 한두 개씩 보내는 몰림은 연결별 페이싱으로 잘 안 풀리고, 게임 서버가 보내는 시점을 직접 나눠야 합니다. 반대로 한 연결이 큰 데이터를 보낼 때는 NIC가 수십 KB 데이터를 패킷 크기로 잘라 연달아 내보내는데(TSO), 이런 몰림은 페이싱이 잘 나눠 줍니다.