실시간 튜닝
실시간 튜닝 (Real-Time Tuning)
실시간(real-time) 테이블의 성능을 튜닝하는 방법을 안내해요.
출처: 문서
본문
개요 (Overview)
실시간 테이블은 Kafka 같은 스트림을 지속적으로 소비하며 데이터를 메모리(consuming 세그먼트)에 쌓고 플러시해요. 소비와 플러시 동작을 올바르게 튜닝하면 적재 래그를 줄이고 메모리 사용과 쿼리 성능의 균형을 잡을 수 있어요.
소비 세그먼트 (Consuming segments)
- 각 실시간 서버는 Kafka 파티션당 하나의 consuming 세그먼트를 메모리에 유지해요.
- consuming 세그먼트는 힙(또는 오프힙)에 상주하므로 메모리 용량을 산정할 때 중요해요.
플러시 임계값 (Flush thresholds)
플러시는 행 수, 시간, 세그먼트 크기 임계값 중 먼저 도달하는 것으로 트리거돼요:
realtime.segment.flush.threshold.rows
realtime.segment.flush.threshold.time
realtime.segment.flush.threshold.segment.size
- rows/time — 너무 작으면 작고 많은 세그먼트가 생겨 메타데이터 오버헤드와 쿼리 지연이 늘어나요.
- 세그먼트 크기를 300MB~1GB 수준이 되도록 임계값을 조정하는 것을 권장해요.
메모리 산정 (Memory sizing)
- 실시간 서버의 메모리 = 힙 + 직접(off-heap) 메모리로 consuming 세그먼트, 인덱스, 스타트리 등을 유지해요.
- RealtimeProvisioningHelper는 적재 속도와 데이터 특성을 바탕으로 호스트 수, 소비 기간, 세그먼트 크기를 추정하는 데 도움을 줘요.
소비 래그 (Consumption lag)
pinot.server.realtimeConsumptionCatchupRatio로 소비 래그를 모니터링해요. 래그가 계속 증가하면 서버나 파티션을 추가하고, 플러시 임계값을 점검하세요.
모범 사례 (Best practices)
- 세그먼트 크기가 목표 범위(300MB~1GB)가 되도록 플러시 임계값을 설정하세요.
- consuming 세그먼트가 서버 메모리에 맞는지 산정하세요.
- 소비 래그와 메모리 사용을 지속적으로 모니터링하세요.