본문으로 건너뛰기

[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) {

왜 이게 좋은가

  1. 25% 성능 향상: 실제 프로덕션 인덱스 파일 기준 433ms에서 318ms로 개선되었다.
  2. I/O 효율: 작은 배치는 읽기 시스템콜 횟수를 늘리고, Arrow RecordBatch 생성 오버헤드도 증가시킨다. 큰 배치로 이를 줄인다.
  3. 파라미터화: 배치 크기를 하드코딩하지 않고 생성자 파라미터로 받아, 상위에서 제어할 수 있게 했다.
  4. 스트림/포인터/블룸 일관성: 세 종류의 읽기 모두 동일한 batchSize를 사용하여 일관된 동작을 보장한다.

참고 자료

댓글

관련 포스트

PR Analysis 의 다른글