게임 렉 백서 › 증상별로 찾기
몰아치기: 원인 36가지와 담당
다른 말: 파파파팍, 빨리감기, 한꺼번에 처리
그림이 있는 원본 증상 사전으로 열기 →
멈춰 있던 화면이 다시 움직이면서 밀린 움직임·타격·데미지가 한꺼번에 빠르게 지나갑니다.
몬스터와 사람들이 빨리 감기처럼 움직이고 데미지 숫자와 이펙트가 한 번에 쏟아집니다.
어딘가에서 패킷이 쌓여 있다가 한 번에 풀렸습니다. TCP 재전송 대기, 서버 따라잡기, 클라 처리 밀림이 대표적입니다.
이 증상을 만드는 원인
L1 클라이언트 게임 프로세스
- 메인 스레드 패킷 처리 병목: 받은 패킷을 프레임마다 정해진 만큼만 처리하면, 몰려온 패킷이 다음 프레임으로 계속 밀립니다. (게임개발팀·클라이언트 개발)
- 고정 타임스텝 따라잡기 폭주: 한 번 멈춘 뒤 밀린 계산을 몰아서 하다가, 그 계산 때문에 또 밀립니다. (게임개발팀·클라이언트 개발)
L2 클라이언트 OS·기기
- 백그라운드 프로세스의 CPU 점유: 백신 검사, 윈도우 업데이트, 방송 프로그램, 브라우저 영상이 코어를 차지하면 게임 스레드가 CPU를 배정받지 못하고 기다립니다. (외부·외부)
- 수신 버퍼 넘침: 게임이 바빠서 소켓(OS가 제공하는 네트워크 송수신 인터페이스)에서 패킷을 늦게 꺼내면 OS 버퍼가 넘칩니다. (게임개발팀·클라이언트 개발)
- 같은 기기의 다른 앱이 대역폭 점유: 클라우드 동기화, 대용량 다운로드, 게임 패치가 같은 PC에서 돌면 게임 패킷이 대기열에서 기다립니다. (외부·외부)
- 창 최소화·비활성 시 처리 제한: 다른 창을 보거나 게임을 최소화하면 게임과 윈도우가 전기를 아끼려고 게임을 느리게 돌립니다. 돌아오면 밀린 패킷이 몰려오거나, 이미 접속이 끊겨 있습니다. (게임개발팀·클라이언트 개발)
L3 집 네트워크
- 버퍼블로트 (공유기 대기열): 가족 누군가 영상을 올리거나 큰 파일을 받으면 공유기 대기열에 수백 ms 분량의 패킷이 쌓이고, 게임 패킷도 그 뒤에서 기다립니다. (외부·외부)
L6 서버 네트워크 카드
- 클라우드 호스트 점검·라이브 마이그레이션: 클라우드 사업자가 물리 서버(호스트)를 점검할 때 가상 머신을 다른 호스트로 옮기거나(라이브 마이그레이션) 잠시 멈춥니다. 그동안 서버 전체가 멈추고 멈춘 시간이 길면 연결이 끊깁니다. (인프라팀·서버 인프라)
L7 서버 OS (커널)
- 커널 소켓 버퍼 부족: 송수신 버퍼가 작으면 버스트 트래픽이 몰릴 때 UDP로 받은 패킷은 버려지고, TCP 송신은 버퍼에 여유가 없어 막힙니다. (인프라팀·서버 인프라)
- 시스템 시계 점프 (NTP 스텝): 서버 시계가 한 번에 몇 초 앞뒤로 조정되면 시스템 시계에 의존하는 타이머가 한꺼번에 발동하거나 멈춥니다. (게임개발팀·서버 개발)
L8 소켓과 프로토콜
- TCP HOL 블로킹: TCP는 순서를 지키려고 잃어버린 패킷 하나를 다시 받을 때까지 뒤에 도착한 패킷을 게임에 넘기지 않습니다. (게임개발팀·서버 개발)
- 신뢰성 UDP 재전송 설정: UDP 위에 직접 만든 재전송 규칙이 너무 보수적이면 복구가 늦고 너무 공격적이면 회선을 더 막습니다. (게임개발팀·서버 개발)
- 혼잡 제어로 전송량 급감: TCP는 손실을 혼잡 신호로 보고 전송 속도를 30~50% 줄입니다. 와이파이 손실에도 똑같이 반응합니다. (인프라팀·서버 인프라)
L9 서버 게임 프로세스
- 브로드캐스트 폭증: 한 명의 움직임을 그를 보는 모두에게 보내면, 모인 인원의 제곱만큼 보낼 업데이트가 생깁니다. (게임개발팀·서버 개발)
- 한 대상에 몰린 전투 (월드 보스): 수백 명이 보스 하나를 동시에 때리면, 보스 한 마리의 계산이 한곳에 몰리고 타격 정보가 보는 모두에게 전송됩니다. (게임개발팀·서버 개발)
- 밀집 지역 진입 시 스폰 폭주: 사람이 가득한 마을로 텔레포트하면, 서버는 새로 보이게 된 수백 명의 외형·장비·상태를 한꺼번에 보내야 합니다. (게임개발팀·서버 개발)
L10 메모리
- 서버 GC 전체 멈춤: Java·C# 서버가 가비지를 수집하려고 모든 스레드를 멈추는 동안(stop-the-world) 서버 전체가 멈춥니다. (게임개발팀·서버 개발)
동기화 설계
- 타임스탬프 없는 도착 즉시 재생: 서버 이벤트에 발생 시각을 붙이지 않고 받자마자 재생하면, 네트워크 지터 때문에 연출 타이밍이 그대로 들쭉날쭉해집니다. (게임개발팀·클라이언트 개발)
일부에게만 생기는 문제
- 느린 사람이 남의 화면에서 몰아서 움직임: 회선이 나쁜 사람의 입력은 들쭉날쭉 몰려서 서버에 도착합니다. 서버가 틱마다 받은 만큼 적용하면, 다른 사람 눈에는 그 캐릭터가 멈칫했다가 한 번에 여러 걸음을 갑니다. (게임개발팀·서버 개발)
- 도착 즉시 처리하는 서버의 몰아치기: 패킷이 도착하는 대로 바로 처리하고 알리는 서버에서는, 느린 사람의 몰려 온 행동이 연달아 즉시 실행됩니다. (게임개발팀·서버 개발)
- 몬스터 제어 권한이 느린 클라이언트에 있음: 서버 부하를 줄이려고 몬스터 이동 계산을 근처 플레이어 한 명의 클라이언트에 맡기는 게임이 있습니다. 그 사람 회선이 나쁘면 그 몬스터가 모두의 화면에서 이상하게 움직입니다. (게임개발팀·서버 개발)
- 백그라운드 창의 처리 제한: 클라이언트 창이 백그라운드에 있으면 게임·엔진·OS가 그 클라이언트의 프레임과 처리를 줄입니다. 받은 패킷을 제때 처리하지 못해 밀리거나 넘칩니다. (게임개발팀·클라이언트 개발)
TCP 재전송의 근본 원인
- 무선 구간 손실: 와이파이와 모바일망은 무선 구간에서 몇 번 재전송하다가, 그래도 안 되면 패킷을 버립니다. 버려진 패킷은 TCP가 한참 뒤에 다시 보냅니다. (외부·외부)
- 병목 대기열 넘침 (혼잡 손실): 공유기, 통신사 사이 연결 구간, 데이터센터 회선처럼 가장 좁은 곳의 대기열이 가득 차면 새로 오는 패킷을 버립니다. (인프라팀·네트워크 인프라)
- 송신 버스트로 얕은 버퍼 넘침: 서버가 틱마다 수천 명분 업데이트를 한순간에 몰아 보내면, 스위치의 작은 버퍼나 클라우드의 순간 한도가 1ms도 안 돼 넘쳐 일부가 버려집니다. (게임개발팀·서버 개발)
- 폴리서의 초과분 폐기: 통신사 요금제, 클라우드 인스턴스 한도, DDoS 방어 장비는 정해진 속도를 넘는 패킷을 대기열에 넣지 않고 즉시 버리기도 합니다. (인프라팀·네트워크 인프라)
- 물리 오류 (불량 선·광모듈·커넥터): 케이블 손상, 먼지 낀 광커넥터, 수명이 다한 광모듈은 비트 오류를 만들고 깨진 패킷은 장비가 조용히 버립니다. (인프라팀·네트워크 인프라)
- 듀플렉스 불일치: 한쪽은 자동 협상, 다른 쪽은 속도·듀플렉스를 고정해 두면 한쪽이 반이중으로 동작하며 부하가 걸릴 때마다 충돌로 패킷을 잃습니다. (인프라팀·네트워크 인프라)
- 수신 서버 호스트의 패킷 폐기: 패킷은 서버까지 왔는데 NIC의 링 버퍼(도착한 패킷을 잠시 담아 두는 버퍼)가 넘치거나, 커널의 수신 처리 코어가 포화되어 버려집니다. (인프라팀·서버 인프라)
- 중간 장비 처리 한도 초과 (방화벽·IPS·DDoS 방어): 방화벽, 침입 방지 장비(IPS), DDoS 방어 장비는 지나가는 패킷을 하나하나 검사합니다. 검사 능력을 넘는 순간부터 처리하지 못한 패킷을 버립니다. (인프라팀·네트워크 인프라)
- 경로 변경·ECMP 불량 경로: 인터넷 경로가 바뀌는 몇 초 동안, 또는 여러 ECMP 경로 중 불량인 경로에 배정된 연결에서 패킷이 사라집니다. (인프라팀·네트워크 인프라)
- 지연 급등으로 인한 불필요한 재전송: 패킷은 사라지지 않고 잠깐 아주 늦게 도착했을 뿐인데, 그 지연이 RTO보다 길면 보내는 쪽이 손실로 판단해 재전송합니다. (외부·외부)
- RTO 설정이 환경과 맞지 않음: RTO 최소값을 너무 낮추면 조금만 늦어도 불필요한 재전송이 나고 기본값(200ms)은 게임 입장에서 너무 길어 한 번 잃을 때마다 오래 멈춥니다. (인프라팀·서버 인프라)
- thin stream의 느린 복구: 게임처럼 작은 패킷을 드문드문 보내면 “뒤따르는 패킷 3개”가 모이기 전에 RTO가 먼저 옵니다. 대용량 전송보다 같은 손실에 훨씬 오래 멈춥니다. (게임개발팀·서버 개발)
- 중간 장비의 TCP 옵션 제거: 일부 방화벽·가속 장비가 TCP 옵션을 지우거나 고치면, 여러 개를 잃었을 때 한 왕복에 하나씩만 복구하거나 윈도우(한 번에 보낼 수 있는 양)가 작아져 느려집니다. (인프라팀·네트워크 인프라)
- 제로 윈도우 (재전송처럼 보이는 멈춤): 받는 쪽 프로그램이 소켓을 제때 읽지 않아 버퍼가 가득 차면, 보내는 쪽은 전송을 멈추고 제로 윈도우 프로브만 보냅니다. 회선 문제가 아닙니다. (게임개발팀·클라이언트 개발)
그림이 있는 원본 증상 사전 보기