[sglang] SGLang의 새로운 캐시 전략: T-LRU로 에이전트 워크로드의 TTFT 최적화하기
PR 링크: sgl-project/sglang#34012 상태: Merged | 변경: +349 / -8
들어가며
최근 LLM 서빙 시스템, 특히 에이전트 기반의 워크로드에서는 긴 대화 맥락(context)을 유지하는 것이 중요합니다. 하지만 기존의 LRU(Least Recently Used) 방식은 단순히 최근에 사용된 데이터를 보존하려다 보니, 정작 다음 요청의 TTFT(Time To First Token)를 줄이는 데 필요한 핵심 맥락보다 불필요한 꼬리(tail) 부분을 유지하는 비효율이 발생합니다. SGLang에 도입된 T-LRU(Tail-Optimized LRU)는 이 문제를 해결하기 위해, 다음 프리필(prefill)에 필요한 최소한의 맥락을 제외한 나머지 부분을 우선적으로 제거하여 전체적인 시스템 성능을 최적화합니다.
코드 분석
1. TLRUStrategy 구현 (python/sglang/srt/mem_cache/evict_policy.py)
핵심은 get_priority 함수입니다. T-LRU는 TEL-safe(Tail-Eviction-Safe)한 노드를 '무한히 오래된 것'으로 간주하여 우선적으로 제거합니다.
# Before/After: 새로운 전략 클래스 추가
class TLRUStrategy(EvictionStrategy):
def get_priority(self, node: TreeNode) -> Tuple[int, float]:
budget = max(
node._tlru_history_len + self.next_prompt_estimate - self.threshold, 0
)
cached_without_this_node = node._tlru_cached_prefix_len - len(node.key)
tel_safe = cached_without_this_node >= budget
return (-1 if tel_safe else 0, node.last_access_time)
여기서 budget은 TTFT SLO를 지키기 위해 유지해야 할 최소 토큰 수를 의미합니다. tel_safe가 참이면 해당 노드는 우선 제거 대상이 됩니다.
2. 상태 관리 및 최적화 (python/sglang/srt/mem_cache/unified_cache/unified_tree_core.py)
리뷰어 ispobock의 피드백을 반영하여, 불필요한 오버헤드를 줄이기 위해 변수명을 명확히 하고 기본 LRU 경로에서는 이 로직이 실행되지 않도록 가드(guard)를 추가했습니다.
# Before: 일반적인 depth 사용
# After: T-LRU 전용 필드 사용으로 가독성 및 안전성 확보
node._tlru_cached_prefix_len = ...
node._tlru_history_len = ...
왜 이게 좋은가
T-LRU는 단순히 캐시 히트율을 높이는 것이 아니라, TTFT(Time To First Token) 분포를 개선하는 데 목적이 있습니다. 벤치마크 결과에 따르면, C=32 환경에서 p99 TTFT가 8.6% 개선되었으며, ITL(Inter-Token Latency)의 경우 p99에서 무려 43.9%까지 개선되는 효과를 보였습니다.
핵심 교훈
- 워크로드 인지형 캐싱: 범용적인 LRU보다 특정 도메인(에이전트 대화)의 특성을 반영한 정책이 훨씬 효율적입니다.
- 우선순위 기반 제거: 별도의 제거 패스를 추가하는 대신, 기존 eviction 드라이버가 사용하는 우선순위 함수를 재정의함으로써 복잡도를 낮췄습니다.
- 성능과 트레이드오프: 평균적인 처리량(throughput)은 유지하면서 꼬리 지연 시간(tail latency)을 획기적으로 줄이는 전략은 실무 환경에서 매우 강력한 도구가 됩니다.
리뷰어 피드백 반영
리뷰 과정에서 _set_depth_and_raise_convo_length 함수가 모든 삽입 시 실행되는 문제를 지적받아, policy == "tlru"일 때만 동작하도록 최적화했습니다. 또한, 변수명을 depth에서 _tlru_history_len으로 변경하여 다른 정책과의 혼동을 방지한 점은 코드 유지보수 측면에서 매우 훌륭한 개선입니다.
참고 자료
- https://arxiv.org/abs/2510.15152
- https://docs.sglang.io/docs/advanced_features/radix_eviction_policy.html
⚠️ 알림: 이 분석은 AI가 실제 코드 diff를 기반으로 작성했습니다.
관련 포스트
PR Analysis 의 다른글
- 이전글 [ultralytics] YOLO 학습 성능 25% 향상: B200 GPU 최적화 분석
- 현재글 : [sglang] SGLang의 새로운 캐시 전략: T-LRU로 에이전트 워크로드의 TTFT 최적화하기
- 다음글 [onnxruntime] ONNX Runtime MoE 최적화: QMoE CPU GEMM 성능 대폭 향상
댓글