라디스 캐시 내보내기 정책

라디스 캐시 내보내기 정책 (Radix Cache Eviction Policies)

KV 캐시 풀이 가득 차면 라디스 캐시는 캐시된 프리픽스를 내보내서 공간을 확보해요. 이때 어느 프리픽스를 먼저 내보낼지 정하는 게 내보내기 정책이에요. 기본값인 lru가 대부분의 워크로드에 맞는 선택이고, 나머지 정책들은 최근성 대신 적중 빈도, 재사용 이력, 또는 요청 우선순위를 따르도록 바꾼 것이에요.

출처: 공식문서

내보내기가 희생자를 고르는 법

내보내기는 **내보낼 수 있는 잎(evictable leaf)**만 고려해요. 즉 KV가 실제로 있고, 잠겨 있지 않으며(진행 중인 요청이 붙잡고 있지 않고), 여전히 KV를 보유한 자식에게 가려지지 않은 노드만이 대상이에요. 루트는 절대 내보낼 수 없어요.

정책은 각 후보에 점수를 매기고 점수가 가장 낮은 것을 먼저 내보내요. 잎 하나가 내보내지면 그 부모가 새로운 잎이 되어 후보 집합에 다시 들어올 수 있어요. 그래서 내보내기는 한 가지(branch)의 끝에서 루트 방향으로 진행돼요.

정책은 점수만 매길 뿐이에요. 얼마나 많이 해제할지는 결정하지 않고, KV를 메모리에 고정(pin)하지도 못해요. 정책이 보호하는 노드도, 다른 걸 다 내보내도 부족하면 결국 내보내져요.

사용 가능한 정책

--radix-eviction-policy로 하나를 고르면 돼요. 모두 동률일 때는 최근 사용 안 된(LRU) 순서로 폴백해요.

정책 먼저 내보내는 대상 언제 쓰면 좋은지
lru (기본) 가장 오래 사용 안 된 프리픽스. 일반 서빙. 프리픽스 재사용이 시간과 함께 감소하는 방식과 잘 맞아요.
lfu 적중이 가장 적은 프리픽스, 그다음은 최근 사용 안 된 것. 소수의 프리픽스가 다른 것보다 훨씬 많이 재사용되고, 그 프리픽스가 일회성 트래픽의 폭주에도 살아남길 바랄 때.
slru 아직 유예(probationary) 세그먼트에 있는 프리픽스, 그다음 세그먼트 내 최근 사용 안 된 것. lfu와 비슷하지만, 일회성 프리픽스가 검증된 프리픽스를 밀어내는 양에 하한을 두고 싶을 때. slru 파라미터 참고.
priority 가장 낮은 우선순위 요청의 프리픽스, 그다음 최근 사용 안 된 것. 우선순위 스케줄링을 쓰고, 캐시 유지도 admission과 같은 순위를 따르길 원할 때.

점수 입력에 관한 참고:

  • 적중 수(lfu, slru)는 어떤 노드가 이후 요청과 매칭된 횟수를 세요. 청크 프리필(chunked-prefill) 단계, 내보내진 노드, 또는 write-back HiCache 아래에서는 증가하지 않아요.
  • 요청 우선순위(priority)는 그 프리픽스를 삽입한 요청의 priority 필드예요. 여러 요청이 노드에 닿으면 그중 가장 높은 우선순위를 유지해요. 우선순위 스케줄링을 쓰지 않으면 모든 노드가 우선순위 0이라 이 정책은 lru와 같아져요.

fifo, mru, filo도 정책 레지스트리에 존재하지만 명령줄에서는 제공되지 않아요. 이들은 선택 목록을 확장하는 out-of-tree 코드에서만 닿을 수 있고, 서빙보다는 실험용이에요.

정책 튜닝

일부 정책은 파라미터를 받아요. --radix-eviction-policy-config에 JSON 객체로 넘기면 되고, 키는 그 정책 고유의 것이므로 선택한 정책에서만 유효해요.

python3 -m sglang.launch_server \
  --model-path MODEL_PATH \
  --radix-eviction-policy slru \
  --radix-eviction-policy-config '{"protected_threshold": 4}'

플래그를 생략하면 모든 기본값을 받아들이는 거예요. 인식되지 않은 키는 무시되지 않고 시작 시 실패해요.

TypeError: SLRUStrategy.__init__() got an unexpected keyword argument 'protected_treshold'

참고: --radix-eviction-policy-config는 실험용 Rust 트리 코어(SGLANG_UNIFIED_RADIX_TREE_CORE_BACKEND=rust)에서 지원되지 않아요. 거기선 정책 이름만으로 전략을 세우기 때문인데, 둘을 함께 넘기면 시작 시 실패해요.

정책 파라미터

현재 파라미터를 받는 건 slru뿐이에요. lru, lfu, priority는 파라미터가 없어서 --radix-eviction-policy-config가 그 정책에선 효과가 없고, 어떤 키든 에러가 돼요.

slru 파라미터

slru는 캐시를 유예(probationary) 세그먼트와 보호(protected) 세그먼트로 나눠요. 프리픽스는 유예로 들어왔다가 충분히 적중되면 보호로 승격돼요. 유예에 있는 모든 것은 보호에 있는 것보다 먼저 내보내져요.

타입 기본값 의미
protected_threshold int 2 이 적중 수에 도달하면 프리픽스가 보호 세그먼트로 승격됨.

이 값을 올리면 승격이 더 어려워져서 보호 집합이 작게 유지되고, 정말 뜨거운 프리픽스에 가까워져요. 3번 적중된 프리픽스는 4로 두면 유예에 남지만 기본값 2에서는 보호가 돼요. 값 1로 낮추면 한 번만 재사용돼도 승격되므로, 1회 유예 기간이 있는 lru에 가까워져요.

어떤 정책을 고를까

lru로 시작하고, 측정된 캐시 적중률을 보고서만 바꾸세요 — 카운터는 --enable-metrics 아래 노출돼요. lfuslru는 트래픽에 안정적인 핫셋이 있는데 순수 최근성 정책이 계속 그걸 털어내는 경우에 도움이 돼요. 반대로 프리픽스 인기가 시간에 따라 변하면 해로워요. 한 번 높은 적중 수를 벌어둔 프리픽스는 더 이상 유용하지 않게 된 뒤에도 계속 이점을 유지하기 때문이에요.

더 알아보기 (Learn more)