
LLM 서비스를 운영한다는 것은 단순히 모델을 띄워두는 것이 아니다. 사용자가 체감하는 속도, 서버가 감당할 수 있는 트래픽, GPU 비용까지 모두 수치로 측정하고 균형을 맞춰야 한다. 이 지표들은 각각 독립적으로 존재하는 것이 아니라 서로 트레이드오프 관계에 있기 때문에, 전체 구조를 이해하고 봐야 한다.
요청을 보낸 시점부터 첫 번째 토큰이 출력되기까지 걸리는 시간이다.
사용자 체감 UX에서 가장 직접적인 지표다. 챗봇에서 "응답 시작이 느리다"는 불만은 거의 대부분 TTFT 문제다. 전체 응답이 빠르더라도 첫 글자가 늦게 나오면 사용자는 느리다고 인식한다.
TTFT가 느려지는 원인
[요청 전송] ──── 대기 ────▶ [첫 토큰 출력]
↑
이 구간이 TTFT
"서버가 얼마나 빨리 반응을 시작하느냐" 를 측정하는 지표이다.
토큰 하나를 생성하는 데 걸리는 평균 시간이다.
첫 토큰이 나온 이후, 이어지는 토큰들이 얼마나 일정한 속도로 출력되는지를 나타낸다. 이 값이 일정하지 않고 튀는 구간이 생기면 사용자는 텍스트가 끊기는 느낌을 받는다.
TPOT에 영향을 주는 요소
핵심 해석: "말하기 시작한 뒤 얼마나 부드럽게 이어지는가"
요청 전송부터 응답 완전 수신까지의 총 시간이다.
E2E Latency = TTFT + (TPOT × 생성된 토큰 수)
배치 처리 작업이나 API SLA(Service Level Agreement) 계약에서 중요하게 다뤄진다. 다만 실시간 대화형 서비스에서는 사용자가 스트리밍으로 텍스트를 읽기 때문에 TTFT보다 체감 중요도가 낮다.
"전체 처리 시간 (백엔드 기준 KPI)"
초당 생성되는 토큰 수다.
LLM 서버 성능을 나타내는 가장 핵심적인 지표다. vLLM, TensorRT-LLM 같은 추론 최적화 프레임워크의 목표가 이 수치를 높이는 것이다.
TPS와 Latency의 트레이드오프
batch 크기를 늘리면 GPU 활용률이 높아져 TPS가 올라가지만, 각 요청의 대기 시간이 늘어나 TTFT가 증가한다. TPS와 Latency는 반비례 관계인 경우가 많다.
Batch Size ↑ → TPS ↑ → TTFT ↑
해석: "GPU를 얼마나 효율적으로 사용하고 있느냐"
초당 처리하는 API 요청 수다.
일반적인 웹 서버에서 자주 쓰이는 지표지만, LLM 서버 측면에서는 TPS보다 간접적인 지표다. 요청 하나당 생성되는 토큰 수가 천차만별이기 때문에, RPS가 높다고 해서 반드시 처리량이 많은 것은 아니다.
예를 들어 짧은 응답 1000개를 처리하는 것과 긴 응답 10개를 처리하는 것은 RPS 지표 자체는 다르지만 실제 GPU 부하는 비슷할 수 있다.
해석: "트래픽 감당 능력"
현재 동시에 처리 중인 요청 수다.
이 수치가 서버 용량을 초과하기 시작하면 요청이 queue에 쌓이고, 그 결과 TTFT가 직접적으로 증가한다. 오토스케일링 정책을 설계할 때 임계값 기준으로 자주 사용된다.
Concurrent Requests ↑ → Queue 발생 → TTFT ↑
해석: "현재 서버 부하 상태"
GPU 연산 유닛이 실제로 사용되는 비율이다.
낮으면 GPU를 놀리는 것이므로 비용 낭비다. 너무 높으면 모든 연산 자원이 포화 상태가 되어 latency가 증가한다.
| 구간 | 상태 |
|---|---|
| 0 ~ 50% | GPU 낭비, 배치 정책 재검토 필요 |
| 70 ~ 90% | 이상적인 균형 상태 |
| 90% 이상 | 포화 상태, latency 증가 위험 |
핵심 해석: "GPU 투자 대비 얼마나 뽑아쓰고 있느냐"
LLM 추론에서 메모리의 대부분은 KV cache가 차지한다.
KV cache는 이전에 처리한 토큰들의 Key-Value 벡터를 저장해두는 공간이다. 이미 계산한 내용을 재사용하기 위해 존재한다. 이 cache가 부족해지면 두 가지 문제가 발생한다.
KV Cache 부족
├── OOM 발생 → 서버 다운
└── Recompute → 성능 폭락
해석: "얼마나 긴 문맥을 안정적으로 처리하느냐"
토큰 1,000개를 생성하는 데 드는 비용이다.
서비스 운영 관점에서 가장 현실적인 KPI다. OpenAI, Anthropic 등의 API 과금 단위도 이 기준으로 책정된다.
Cost per 1K Tokens = (총 GPU 운영 비용) / (총 생성 토큰 수) × 1000
GPU 효율이 높을수록, TPS가 높을수록 이 값이 낮아진다. 결국 모든 최적화의 최종 목적지는 이 수치를 낮추는 것이라고도 볼 수 있다.
해석: "이 서비스를 운영하는 데 돈이 얼마나 드는가"
요청이 처리되기 전 대기열에서 기다린 시간이다.
이 시간이 TTFT에 직접 더해지기 때문에, TTFT를 낮추려면 Queue Time을 먼저 봐야 한다.
Queue Time이 길어지는 원인
해석: "서버가 요청을 얼마나 빠르게 집어올리는가"
vLLM이 도입한 PagedAttention 기술 기반의 KV cache 활용률이다.
기존 LLM 추론 방식은 KV cache를 연속된 메모리 블록으로 관리했기 때문에 메모리 단편화(Fragmentation)가 심했다. PagedAttention은 운영체제의 가상 메모리 페이징 방식을 차용하여 KV cache를 비연속적인 작은 블록으로 나눠 관리한다. 덕분에 같은 GPU 메모리로 훨씬 많은 요청을 동시에 처리할 수 있다.
| Cache 활용률 | 의미 |
|---|---|
| 높음 | 메모리 효율 좋음, 더 많은 요청 동시 처리 가능 |
| 낮음 | 메모리 낭비 발생, 배치 정책 재검토 필요 |
해석: "같은 GPU로 얼마나 많은 요청을 처리하느냐"
이 지표들은 서로 독립적으로 존재하지 않는다. 하나를 개선하면 다른 것이 나빠지는 트레이드오프 관계가 존재한다.
┌─────────────────────────────────────────────────────┐
│ 트레이드오프 관계 │
│ │
│ TPS ↑ → TTFT ↑ (요청당 대기 증가) │
│ Batch Size ↑ → TPS ↑ but Latency ↑ │
│ Concurrent ↑ → Queue ↑ → TTFT ↑ │
│ KV Cache ↑ → Memory ↑ → 안정성 ↑ │
│ GPU Util ↑ → Cost ↓ but Latency ↑ 가능 │
└─────────────────────────────────────────────────────┘
실제 운영에서는 서비스 성격에 따라 어떤 지표를 우선순위에 둘지 결정해야 한다.
| 서비스 유형 | 우선 지표 |
|---|---|
| 실시간 챗봇 | TTFT 최소화 |
| 문서 요약 배치 작업 | TPS, E2E Latency |
| 비용 절감 최우선 | GPU Utilization, Cost per 1K |
| 긴 문맥 처리 | KV Cache Usage |
LLM 서버 성능 지표는 사용자 경험(Latency), 처리 능력(Throughput), 비용 효율(Efficiency) 세 축으로 구성된다. 세 축은 항상 긴장 관계에 있으며, 하나를 극단적으로 최적화하면 다른 축이 희생된다. 좋은 LLM 서비스 운영이란 이 세 축의 균형점을 서비스 특성에 맞게 찾아내는 과정이다.