[Loki] 포인터 읽기 배치 크기 증가로 인덱스 조회 25% 가속
PR 링크: grafana/loki#20983 상태: Merged | 변경: +32 / -16
들어가며
Loki의 indexSectionsReader에서 포인터 섹션과 블룸 필터를 읽을 때 배치 크기가 128로 설정되어 있었다. 실제 프로덕션 인덱스 파일을 대상으로 테스트한 결과, 배치 크기를 늘리는 것만으로 읽기 시간이 433ms에서 318ms로 약 25% 개선되었다.
핵심 코드 분석
배치 크기 파라미터화
기존에는 하드코딩된 128이었던 배치 크기를 생성자 파라미터로 받도록 변경했다:
func newIndexSectionsReader(
logger log.Logger,
obj *dataobj.Object,
start, end time.Time,
matchers []*labels.Matcher,
predicates []*labels.Matcher,
batchSize int, // 새로 추가된 파라미터
) *indexSectionsReader {
if batchSize <= 0 {
batchSize = 8192
}
return &indexSectionsReader{
// ...
batchSize: batchSize,
}
}
포인터 읽기 배치 크기 변경
// Before
rec, err := pr.Read(ctx, 128)
// After
rec, err := pr.Read(ctx, r.batchSize)
블룸 필터 읽기도 동일하게 적용
// Before
rec, err := br.Read(ctx, 128)
// After
rec, err := br.Read(ctx, r.batchSize)
EOF 체크 버그 수정
배치 크기 변경과 함께 EOF 체크의 잠재적 버그도 수정했다:
// Before
if errors.Is(err, io.EOF) {
// After
if err != nil && errors.Is(err, io.EOF) {
왜 이게 좋은가
- 25% 성능 향상: 실제 프로덕션 인덱스 파일 기준 433ms에서 318ms로 개선되었다.
- I/O 효율: 작은 배치는 읽기 시스템콜 횟수를 늘리고, Arrow RecordBatch 생성 오버헤드도 증가시킨다. 큰 배치로 이를 줄인다.
- 파라미터화: 배치 크기를 하드코딩하지 않고 생성자 파라미터로 받아, 상위에서 제어할 수 있게 했다.
- 스트림/포인터/블룸 일관성: 세 종류의 읽기 모두 동일한
batchSize를 사용하여 일관된 동작을 보장한다.
참고 자료
관련 포스트
PR Analysis 의 다른글
- 이전글 [Ray] 메모리 압력 테스트의 로그 패턴 업데이트로 테스트 안정성 확보
- 현재글 : [Loki] 포인터 읽기 배치 크기 증가로 인덱스 조회 25% 가속
- 다음글 [Loki] 쿼리 엔진 캐시 정확성 테스트 추가
댓글