1:13 · frame time · RTT · server tick · diagnosis

렉 걸렸다. 서버 탓일까, 내 탓일까?

이 영상은 "렉"이라는 하나의 증상을 클라렉, 네트워크렉, 서버렉으로 나누는 방법을 보여 준다. 체감 지연은 클라, 네트워크, 서버 구간 지연의 합이므로 어느 구간이 늘었는지 재면 원인이 갈린다. 실제로 볼 지표는 프레임타임, 전송 핑, 앱 핑 세 가지와 영향 범위다.

01렉의 세 구간

한 번의 반응 = 클라 + 네트워크 + 서버 · ▶ 이 장면 보기

화면 위쪽에 Client와 Server 박스가 있고 그 사이 Network 구간으로 패킷이 오간다. 아래에는 "키 입력 → 결과가 보이기까지" 걸리는 시간을 구간별로 쌓은 막대가 나온다.

합계는 104ms다. 입력 처리와 렌더링은 클라, 업링크와 다운링크는 네트워크, 서버 큐 + 틱은 서버로 묶인다. 화면 문구는 "체감 렉 = 이 구간들의 합. 어느 구간이 늘었는지 찾는 게 판별입니다."다. 사용자는 합계만 느끼기 때문에 증상만으로는 어느 구간 문제인지 알 수 없고, 구간별 지표를 따로 봐야 한다.

02클라렉

내 컴퓨터가 제때 프레임을 못 그리는 경우 · ▶ 이 장면 보기

왼쪽 "내 화면" 미니뷰에서 캐릭터와 몬스터가 움직이다가 갑자기 전부 멈추고, 상태 칩이 FPS 60에서 FPS 4로 바뀌며 "화면 · UI · 입력 전부 멈칫"이 뜬다. 오른쪽 프레임타임 막대그래프에는 60fps = 16.7ms 예산선이 있고, 멈춘 구간에서 막대가 200ms대로 솟는다. 같은 순간에도 Ping 45ms · 정상 칩은 그대로다.

클라렉의 신호는 네 가지로 정리된다.

흔한 원인으로는 GC 스파이크, 리소스 로딩, 렌더링 과부하, 메인 스레드 블로킹, 저사양 · 발열이 제시된다. 클라 메인 스레드가 한 프레임 안에 일을 끝내지 못하면 화면 갱신과 입력 처리가 함께 멈추므로, UI까지 굳는 것이 클라렉의 특징이다.

03네트워크렉

패킷이 늦게 오가거나 사라지는 경우 · ▶ 이 장면 보기

미니뷰에서 내 캐릭터는 부드럽게 움직이고 FPS 60, "UI 즉시 반응" 상태다. "공격" 버튼도 바로 눌린다. 그런데 "다른 플레이어"가 잠시 멈췄다가 다른 위치로 튀고 "순간이동 · 러버밴딩" 칩이 뜬다. 오른쪽 RTT (ms) 그래프는 평소 45ms 안팎에서 800ms 근처까지 솟고, 그동안 손실 칩이 패킷 손실 0%에서 패킷 손실 12%로 바뀐다.

네트워크렉의 신호는 다음과 같다.

흔한 원인은 와이파이 간섭, 모바일 망 전환, ISP 경로 문제, 대역폭 포화(다운로드 중)다. 클라는 정상적으로 그리고 있지만 서버에서 오는 상태 갱신이 늦거나 빠지니, 다른 캐릭터의 위치처럼 서버가 알려 줘야 하는 정보만 끊긴다.

04서버렉

서버가 틱 안에 일을 못 끝내는 경우 · ▶ 이 장면 보기

왼쪽 "서버 틱 처리시간 (ms)" 막대그래프에는 20Hz 예산 = 50ms 선이 있다. 처음에는 막대가 20~30ms대로 예산 안에 있다가, 어느 순간 100ms를 훌쩍 넘기고 칩이 Tick 20Hz에서 Tick 20Hz → 8Hz로 바뀐다. 오른쪽 "채널 3 · 24명" 그리드에서는 24명 전원의 점이 거의 동시에 빨갛게 바뀌고 "전원 동시에 반응 지연"이 뜬다. 이때도 FPS 60과 전송 핑 42ms는 정상 표시다.

서버렉의 신호는 다음과 같다.

흔한 원인은 대규모 전투 · 공성, 몬스터 대량 스폰, DB 응답 대기, 서버 GC, 락 경합이다. 한 채널은 같은 프로세스나 같은 틱 루프에서 처리되는 경우가 많아서, 틱 하나가 늦어지면 그 채널의 모든 플레이어가 똑같이 영향을 받는다.

05핑 두 개로 가르기

전송 핑은 커널 · 소켓의 TCP RTT, 앱 핑은 게임 로직을 거친다 · ▶ 이 장면 보기

Client에서 Server로 선이 두 개 이어진다. 위쪽 "전송 핑"은 커널 · 소켓 단에서 재는 TCP RTT라 클라 앱의 프레임 루프에 영향받지 않고, 아래쪽 "앱 핑"은 소켓을 지나 "게임 로직 큐 → 틱"을 거친 뒤 돌아온다. 같은 왕복이라도 앱 핑에는 서버 내부 대기 시간이 더해진다.

화면은 세 상황을 차례로 보여 준다.

두 값의 차이가 곧 서버 안에서 기다린 시간이다. 아래 문구는 "클라렉이면 앱 핑만 오를 수 있음 (전송 핑은 커널이 재므로 정상)"이다. 클라가 멈춰 있으면 앱 핑 응답을 늦게 꺼내 읽지만, 커널이 재는 TCP RTT는 그대로다. 다만 게임이 핑을 자기 앱 루프에서 재면 클라렉에도 두 값이 함께 오르므로, 프레임타임을 먼저 확인한다.

06판별 순서

세 가지만 보면 어디가 문제인지 나온다 · ▶ 이 장면 보기

왼쪽은 세 단계 질문이다. 앞 질문에 "예"면 그 자리에서 결론을 내고, "아니오"면 다음 질문으로 내려간다.

셋 다 아니면 "복합 원인 · 타임스탬프로 구간을 쪼개서 확인"한다. 오른쪽 비교표는 앞 챕터 내용을 한 장으로 모은 것이다.

보는 순서는 "프레임타임 → 전송 핑 → 앱 핑 · 영향 범위"다. 범위만 보고 판단하지 않는다. 클라 문제는 앱 핑까지 끌어올리고, 핑을 앱 루프에서 재는 게임이면 전송 핑도 함께 올리므로 프레임타임을 가장 먼저 봐야 뒤 단계의 판단이 흔들리지 않는다.

이 영상에 나온 용어는 용어집에 정리했다.