[Grafana Loki] 프론트엔드 캐시를 리팩터링하고 캐시된 스트림을 요청에서 필터링
PR 링크: grafana/loki#20860 상태: Merged | 변경: +182 / -89
들어가며
Grafana Loki의 인제스트 리밋 프론트엔드에서 블룸 필터 기반 캐시를 사용하여 이미 승인된 스트림을 재검증하지 않도록 합니다. 기존에는 요청의 모든 스트림이 캐시에 있을 때만 백엔드 호출을 건너뛰었습니다. 하나라도 새로운 스트림이 있으면 모든 스트림을 다시 검증해야 했습니다. 이 PR은 세 가지 개선을 합니다: (1) 캐시를 독립 구조체로 분리, (2) 캐시된 스트림을 요청에서 제거하여 새로운 스트림만 검증, (3) 블룸 필터 크기 메트릭 추가.
핵심 코드 분석
Before: 전부 아니면 전무(All-or-Nothing) 캐시
func (c *cacheLimitsClient) ExceedsLimits(ctx context.Context,
req *proto.ExceedsLimitsRequest) ([]*proto.ExceedsLimitsResponse, error) {
c.expireTTL()
// 모든 스트림이 캐시에 있어야만 건너뜀
if c.hasKnownStreams(req) {
return []*proto.ExceedsLimitsResponse{}, nil
}
// 모든 스트림을 백엔드로 전송
resps, err := c.onMiss.ExceedsLimits(ctx, req)
// ...
}
After: 캐시된 스트림을 제거 후 나머지만 검증
func (c *cacheLimitsClient) ExceedsLimits(ctx context.Context,
req *proto.ExceedsLimitsRequest) ([]*proto.ExceedsLimitsResponse, error) {
c.acceptedStreamsCache.ExpireTTL()
// 캐시된 스트림을 요청에서 제거(in-place)
c.acceptedStreamsCache.FilterInPlace(req)
if len(req.Streams) == 0 {
return []*proto.ExceedsLimitsResponse{}, nil
}
// 새로운 스트림만 백엔드로 전송
resps, err := c.onMiss.ExceedsLimits(ctx, req)
// ...
}
FilterInPlace는 슬라이스 트릭(req.Streams[:0])을 사용하여 할당 없이 필터링합니다:
func (c *acceptedStreamsCache) FilterInPlace(req *proto.ExceedsLimitsRequest) {
filtered := req.Streams[:0]
c.mtx.RLock()
defer c.mtx.RUnlock()
for _, s := range req.Streams {
b.Reset()
encodeStreamToBuf(&b, req.Tenant, s)
if !c.bf.Test(b.Bytes()) {
filtered = append(filtered, s)
}
}
req.Streams = filtered
}
왜 이게 좋은가
- 부분 캐시 히트 활용: 100개 스트림 중 95개가 캐시에 있으면 5개만 백엔드에서 검증합니다. 기존에는 100개 모두를 보내야 했습니다.
- 구조적 분리:
acceptedStreamsCache가 독립 구조체가 되어 TTL 관리, 캐시 확인, 메트릭이 한 곳에 응집됩니다. - 운영 가시성: 블룸 필터의 최대 크기와 추정 사용량을 Prometheus 메트릭으로 노출하여 운영자가 false positive 비율을 모니터링할 수 있습니다.
- 제로 할당 필터링: Go 슬라이스 트릭으로 추가 메모리 할당 없이 in-place 필터링합니다.
참고 자료
관련 포스트
PR Analysis 의 다른글
- 이전글 [vllm] Decode Context Parallel - GPU Model Runner V2용 디코드 단계 컨텍스트 병렬화
- 현재글 : [Grafana Loki] 프론트엔드 캐시를 리팩터링하고 캐시된 스트림을 요청에서 필터링
- 다음글 [Ray] ExecutionCache 도입으로 데이터셋 캐싱 로직 통합 및 간소화
댓글