<aside> 🎯

한 줄 핵심 — 프레임 = 그릇 크기(40ms), 틱 처리시간 = 담긴 물(일한 양), RTT = 왕복 결과.

가장 자주 헷갈리는 3쌍: ① 틱레이트 vs 스냅샷레이트 ② 지연 vs 처리량 ③ 평균 vs 꼬리(p99)

</aside>

1. 핵심 3개 (틱 · 프레임 · RTT)

개념 정의 우리 값 / 메트릭 누가 정함 / 측정
틱 / 프레임 (Tick/Frame) 서버 권위 시뮬의 심장박동. 정해진 주기로 한 바퀴 돎 25Hz = 40ms/프레임 (FRAME_PER_SEC) 서버가 정함
틱 처리시간 (Tick duration) 그 한 바퀴에서 실제 일한 시간 (sleep 제외) mmo_tick_duration 서버 내부
RTT (왕복) 요청에서 응답까지 돌아오는 end-to-end 시간 mmo_dummy_rtt (약 50ms) 클라가 측정

셋의 관계 (핵심):

RTT ≈ 틱 게이트 대기(평균 틱간격/2 ≈ 20ms)
      + 네트워크
      + 서버 처리 (handle-latency)
      + 클라 처리 (루프 적체)

프레임(40ms) = 틱 처리시간(일한 양) + sleep(남은 여유)

<aside> 💡

프레임은 간격(시간 단위), 틱 처리시간은 그 안에서 쓴 비용, RTT는 왕복 결과. RTT의 바닥은 동접이 아니라 틱 주기(40ms) 가 만든다.

</aside>


2. 유사 · 관련 개념 (5묶음)

A) 주기(rate) 계열 — 얼마나 자주?

<aside> 📐

Hz(헤르츠) = "1초에 몇 번" (빈도 단위). 주기(ms)와 역수 관계 → 주기 = 1000 ÷ Hz.

예) 25Hz → 40ms · 30Hz → 약 33ms · 60Hz → 약 16.7ms. Hz가 높을수록 주기는 짧아져 더 촘촘하게 돈다.

</aside>

개념 우리 시스템
틱레이트 (Tick rate) 서버 시뮬 빈도 (Hz) 25Hz
스냅샷/업데이트 레이트 서버가 상태를 클라에 보내는 빈도. 틱레이트와 분리 가능 SYNC 주기 위치동기화 (SYNC_INTERVAL_FRAMES=13, 약 500ms)
입력/커맨드 레이트 클라가 입력을 서버로 보내는 빈도 더미 move/heartbeat 송신 주기
클라 렌더 FPS 클라 화면 그리는 빈도. 서버 틱과 완전 별개 GameClient 렌더링
하트비트/킵얼라이브 연결 유지용 주기 핑 heartbeatIntervalSec

<aside> ⚠️

틱레이트(시뮬) ≠ 스냅샷레이트(송신) ≠ 입력레이트 ≠ 렌더 FPS. 잘 만든 서버는 이 넷을 따로 돌린다.

</aside>

B) 지연(latency) 계열 — 얼마나 오래?

개념 우리 메트릭
RTT (왕복) 왕복 전체 mmo_dummy_rtt
OWD (편도, One-Way Delay) 한 방향만. 대략 RTT/2지만 상하행 비대칭 가능 미측정
처리 지연 (Handle/Processing) 서버가 요청 처리에 쓴 시간 (큐 대기 + 핸들러) mmo_handle_latency (#1)
큐 대기 지연 (Queue/Standing) 처리 전 큐에서 기다린 시간. handle의 일부 mmo_event_queue_size 로 간접
지터 (Jitter) 지연의 변동폭(분산). 값이 아니라 흔들림 p99 빼기 p50 으로 근사
꼬리 지연 (Tail, p99/p999) 평균이 아니라 최악 상위 1퍼센트. 체감을 지배 p50/p99 패널

<aside> 🔑

평균은 거짓말한다. avg 30ms인데 p99 300ms면 1퍼센트 유저가 지옥. 그리고 지터가 평균보다 나쁠 때가 많다 — 항상 50ms는 적응되지만 20~200ms로 출렁이면 끊겨 보인다.

</aside>

C) 용량/포화 계열 — 한계에 닿았나?

개념 우리 시스템
틱 예산 / 헤드룸 (Budget/Headroom) 프레임 40ms 중 남은 여유 (40 빼기 tick_duration) 그라파나 임계값을 이 예산에 맞춰 재보정함
포화 (Saturation) 도착이 배출 이상. 코어가 꽉 참 cpu_ratio{gameloop}=1.0
백프레셔 (Backpressure) 못 따라가서 큐/버퍼가 차오르는 압력 event_queue_size 증가, send 체류
랙/드리프트 (Lag/Tick drift) tick_duration이 예산 초과 → sleep=0 → 25Hz 못 지키고 뒤처짐 진단정리의 틱 동결
타임 딜레이션 (Time Dilation) 부하 시 일부러 틱을 늘려 서버 보호 (EVE식) 미구현, degrade 정책 후보
처리량 (Throughput) 단위시간 처리량 (pps/bw). 지연과 직교 축 recv/send_packets_total

<aside> ⚠️

처리량(throughput)과 지연(latency)은 다른 축. 초당 12만 패킷 처리(높은 처리량)와 왕복 50ms(낮은 지연)는 따로 논다. 둘 다 봐야 한다.

</aside>

D) 체감 보정 기법 — 지연을 숨기는 기술

개념 우리 시스템
클라 예측 (Client prediction) 서버 응답 전에 클라가 미리 움직임 UpdateMovingPlayers
서버 재조정 (Reconciliation) 서버 권위값으로 클라 예측 보정 SYNC 브로드캐스트
보간 (Interpolation) 띄엄띄엄 온 스냅샷 사이를 부드럽게 채움 클라측
지연 보상 (Lag compensation) 히트 판정 시 쏜 시점으로 시간 되감기 전투 구현 시