<aside> 🎯
한 줄 핵심 — 프레임 = 그릇 크기(40ms), 틱 처리시간 = 담긴 물(일한 양), RTT = 왕복 결과.
가장 자주 헷갈리는 3쌍: ① 틱레이트 vs 스냅샷레이트 ② 지연 vs 처리량 ③ 평균 vs 꼬리(p99)
</aside>
| 개념 | 정의 | 우리 값 / 메트릭 | 누가 정함 / 측정 |
|---|---|---|---|
| 틱 / 프레임 (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>
<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>
| 개념 | 뜻 | 우리 메트릭 |
|---|---|---|
| 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>
| 개념 | 뜻 | 우리 시스템 |
|---|---|---|
| 틱 예산 / 헤드룸 (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>
| 개념 | 뜻 | 우리 시스템 |
|---|---|---|
| 클라 예측 (Client prediction) | 서버 응답 전에 클라가 미리 움직임 | UpdateMovingPlayers |
| 서버 재조정 (Reconciliation) | 서버 권위값으로 클라 예측 보정 | SYNC 브로드캐스트 |
| 보간 (Interpolation) | 띄엄띄엄 온 스냅샷 사이를 부드럽게 채움 | 클라측 |
| 지연 보상 (Lag compensation) | 히트 판정 시 쏜 시점으로 시간 되감기 | 전투 구현 시 |