[Grafana Loki] GetShards 호출에서 청크 크기 정보를 인덱스에서 직접 가져와 48% 성능 향상
PR 링크: grafana/loki#19221 상태: Merged | 변경: +335 / -307
들어가며
Grafana Loki의 GetShards 호출은 쿼리를 여러 샤드로 분할하기 위해 청크 엔트리와 크기 정보가 필요합니다. 기존 구현에서는 인덱스에서 청크 엔트리를 먼저 가져온 후, 같은 인덱스를 다시 읽어 크기 정보를 얻었습니다. TSDB는 청크 크기를 청크 메타데이터와 함께 저장하고 있었지만, 기존 인터페이스가 이를 노출하지 않았습니다. 이 PR은 크기 정보를 포함한 청크 레퍼런스를 한 번에 반환하는 새 메서드를 추가합니다.
핵심 코드 분석
Before: 인덱스 두 번 읽기 + ForSeries 콜백
// 1단계: 청크 레퍼런스 조회
grps, _, err := g.indexQuerier.GetChunks(ctx, instanceID, req.From, req.Through, p, nil)
// 2단계: ForSeries로 인덱스를 다시 읽어 크기 정보 매칭
forSeries.ForSeries(ctx, user, bounds, req.From, req.Through,
func(l labels.Labels, fp model.Fingerprint, chks []tsdb_index.ChunkMeta) (stop bool) {
// 필터된 청크와 인덱스 청크를 O(n*m) 비교
for i := range filteredChks {
for j < len(chks) {
// 매칭하여 KB, Entries 설정
}
}
return false
}, p.Matchers...)
After: 한 번의 읽기로 크기 정보 포함
// 크기 정보를 포함한 청크 레퍼런스를 한 번에 조회
refs, err := g.indexQuerier.GetChunkRefsWithSizingInfo(ctx, instanceID, req.From, req.Through, p)
// ForSeries 콜백과 이중 읽기가 완전히 제거됨
shards, chkGrps, err := accumulateChunksToShards(req, refs)
accumulateChunksToShards 함수의 시그니처도 forSeries, ctx, user, p 파라미터가 모두 제거되어 크게 단순화되었습니다.
왜 이게 좋은가
벤치마크 결과가 인상적입니다:
| 지표 | Before | After | 개선율 |
|---|---|---|---|
| 응답 시간 | 3.31ms | 1.71ms | -48.30% |
| 메모리 할당 | 1.60MB | 1.16MB | -27.26% |
| 할당 횟수 | 19.3k | 11.7k | ~39% 감소 |
- I/O 절반 감소: 같은 인덱스를 두 번 읽는 대신 한 번으로 해결합니다.
- 코드 단순화:
ForSeries콜백과 복잡한 매칭 로직이 제거되었습니다. - 인터페이스 개선:
HasChunkSizingInfo로 스토어가 크기 정보를 지원하는지 명확히 확인합니다.
참고 자료
관련 포스트
PR Analysis 의 다른글
- 이전글 [Triton] gfx950에서 PaddedLayout + AsyncCopy 파이프라이닝 지원
- 현재글 : [Grafana Loki] GetShards 호출에서 청크 크기 정보를 인덱스에서 직접 가져와 48% 성능 향상
- 다음글 [Triton] Blackwell barrierSlice 타이핑 버그 수정
댓글