Basic Tuning 의 이해

Basic Tuning 의 이해

ClickHouse 분류
Core Architecture
Type
Research
작성자

Ken

ClickHouse의 튜닝 방법 중 퍼포먼스 튜닝에 대한 기초를 다룹니다.

  • 1. ClickHouse 성능 튜닝 방법론
  • 2. 주요 성능 튜닝 파라미터와 설정 방법
  • 2.1. 조인 관련 파라미터
  • partial_merge_join
  • partial_merge_join_optimizations
  • 2.2. 메모리 및 외부 정렬/그룹바이 관련 파라미터
  • max_bytes_before_external_group_by
  • max_bytes_before_external_sort
  • max_memory_usage
  • 2.3. 병렬 처리 및 블록 크기 관련 파라미터
  • max_threads
  • max_block_size
  • max_insert_threads
  • 2.4. MergeTree 및 백그라운드 작업 관련 파라미터
  • background_pool_size
  • max_background_merges
  • 3. 주요 파라미터 설정 시 고려사항 및 실전 팁
  • 4. 파라미터 튜닝 적용 방법
  • 4.1 세션 레벨 실행
  • 4.2 쿼리 단위 SETTINGS 절
  • 4.3 클라이언트 실행 시 옵션
  • 4.4 HTTP 쿼리 파라미터
  • 4.5 드라이버별 설정 전달
  • 4.6 서버 측 ‘설정 프로필’(영구 적용)
  • 4.7 서버 설정 파일(관리자용, 지속 적용)
  • 5. 결론

1. ClickHouse 성능 튜닝 방법론

ClickHouse는 대용량 데이터의 실시간 분석을 위해 설계된 고성능 컬럼형 데이터베이스입니다. 기본적으로 빠른 쿼리 처리를 제공하지만, 실제 업무 환경에서는 데이터 특성, 하드웨어, 쿼리 패턴에 따라 세밀한 튜닝이 필요합니다. 튜닝의 목적은 하드웨어 자원을 최대한 활용하여 쿼리 응답 속도와 시스템 안정성을 동시에 확보하는 것입니다.

튜닝은 크게 다음의 원칙을 따릅니다.

  • 스키마 및 파티셔닝 최적화: 데이터 모델링과 파티션, 인덱스 설계가 쿼리 성능에 미치는 영향이 매우 큽니다.
  • 쿼리 최적화: 불필요한 컬럼 조회, 비효율적 조인, 과도한 리소스 사용을 피하도록 쿼리를 작성합니다.
  • 리소스(메모리, CPU, 디스크) 관리: 설정 파라미터를 통해 쿼리당/전체 리소스 사용량을 제어합니다.
  • 병렬성과 블록 크기 조절: 하드웨어의 코어 수, I/O 성능에 맞춰 병렬 처리 및 데이터 블록 크기를 조정합니다.
  • 백그라운드 작업 최적화: 데이터 병합, 압축 등 백그라운드 작업의 효율성을 확보합니다.

이러한 방법론을 바탕으로 튜닝은 다각면에서 고려하여 이루어집니다. 단, 이미 구성되어 있는 환경에서는 시스템 파라미터를 조정하며 최적의 성능을 도출합니다[1][2][3][4].

2. 주요 성능 튜닝 파라미터와 설정 방법

2.1. 조인 관련 파라미터

partial_merge_join

  • 설명: ClickHouse의 조인 알고리즘 중 하나로, 메모리 사용량이 많은 대규모 조인 시 메모리 초과를 방지하고 디스크를 활용할 수 있도록 지원합니다.
  • 설정: SET partial_merge_join = 1
  • 적용 시점: 조인 대상 테이블이 매우 크거나, 해시 조인으로는 메모리 부족이 발생할 수 있는 환경에서 사용합니다.
  • 고려사항: partial_merge_join은 조인 키가 정렬되어 있을 때 특히 효과적이며, 메모리 사용량이 제한적인 환경에서 권장됩니다[5].

partial_merge_join_optimizations

  • 설명: partial_merge_join 알고리즘의 추가 최적화 기능을 활성화합니다.
  • 설정: SET partial_merge_join_optimizations = 1
  • 적용 시점: partial_merge_join 사용 시 추가적인 성능 개선을 위해 활성화합니다.
  • 고려사항: 최신 ClickHouse 버전에서는 partial_merge_join_optimizations를 1로 두는 것이 일반적입니다. 단, 실험적으로 도입된 기능이므로 테스트를 권장합니다[5].

2.2. 메모리 및 외부 정렬/그룹바이 관련 파라미터

max_bytes_before_external_group_by

  • 설명: GROUP BY 연산에서 사용할 수 있는 최대 메모리 용량(바이트 단위)을 지정합니다. 이 값을 초과하면 디스크로 데이터를 spill하여 처리합니다.
  • 설정: SET max_bytes_before_external_group_by = 5000000000 (약 5GB)
  • 적용 시점: 대규모 집계 쿼리에서 메모리 부족으로 인한 쿼리 실패를 방지하고, 서버의 전체 메모리 사용량을 제어합니다.
  • 고려사항: 시스템 전체 메모리와 동시 실행 쿼리 수를 고려해 설정해야 하며, 너무 낮게 설정하면 디스크 I/O가 증가해 성능 저하가 발생할 수 있습니다. 일반적으로 전체 메모리의 50%를 동시 쿼리 수로 나눈 값 정도에서 시작합니다[6][7][4].

max_bytes_before_external_sort

  • 설명: 대용량 정렬(SORT) 연산에서 메모리 내에서 처리할 수 있는 최대 바이트 수를 지정합니다. 초과 시 외부 정렬(디스크 사용)로 전환됩니다.
  • 설정: SET max_bytes_before_external_sort = 5000000000
  • 적용 시점: 대량 데이터 정렬 시 메모리 초과 방지 및 서버 안정성 확보를 위해 사용합니다.
  • 고려사항: 위와 동일하게 서버 메모리 용량과 쿼리 동시성, 디스크 성능을 종합적으로 고려해야 하며, 실측 테스트를 통해 최적값을 찾는 것이 좋습니다[4].

max_memory_usage

  • 설명: 단일 쿼리가 사용할 수 있는 최대 메모리 용량을 제한합니다.
  • 설정: 예) SET max_memory_usage = 8000000000 (8GB)
  • 고려사항: 전체 서버 메모리, 동시 쿼리 수, 쿼리의 복잡도에 따라 적절히 조정합니다. 너무 높으면 OOM 위험, 너무 낮으면 쿼리 실패가 잦아질 수 있습니다[7][4].

2.3. 병렬 처리 및 블록 크기 관련 파라미터

max_threads

  • 설명: 하나의 쿼리에서 사용할 수 있는 최대 스레드(병렬 처리 단위) 수를 지정합니다.
  • 설정: SET max_threads = <CPU 코어 수>
  • 적용 시점: CPU 코어 수와 쿼리 동시성을 고려하여 설정합니다.
  • 고려사항: 단일 쿼리에서 최대 성능을 내고 싶다면 물리적 CPU 코어 수로 설정합니다. 여러 쿼리가 동시에 실행된다면 이 값을 줄여 각 쿼리가 적절히 CPU를 나눠쓰도록 조정합니다[8].

max_block_size

  • 설명: 쿼리 실행 시 한 번에 처리하는 최대 행(row) 수를 지정합니다.
  • 설정: 기본값은 65,536이며, 대규모 분석 쿼리에서는 더 크게 설정할 수도 있습니다.
  • 고려사항: 블록 크기가 크면 CPU 효율이 올라가지만, 메모리 사용량이 증가할 수 있습니다. 일반적으로 기본값으로 충분하며, 워크로드에 따라 조정합니다[8].

max_insert_threads

  • 설명: 대량 데이터 INSERT 시 병렬로 사용할 수 있는 최대 스레드 수를 지정합니다.
  • 설정: CPU 코어 수에 맞게 설정(예: 8코어 서버라면 8)
  • 고려사항: 디스크 I/O 및 네트워크 대역폭을 고려해야 하며, 과도하게 높이면 리소스 경합이 발생할 수 있습니다[6][8].

2.4. MergeTree 및 백그라운드 작업 관련 파라미터

background_pool_size

  • 설명: MergeTree 엔진의 백그라운드 작업(머지, 압축 등)에 사용할 수 있는 스레드 풀 크기입니다.
  • 설정: 서버의 코어 수 및 I/O 성능에 따라 조정
  • 고려사항: 너무 작으면 병합 지연, 너무 크면 리소스 경합 및 성능 저하가 발생할 수 있습니다[9].

max_background_merges

  • 설명: 동시에 실행 가능한 최대 백그라운드 머지 작업 수를 제한합니다.
  • 고려사항: 데이터 삽입 빈도와 파티션 크기에 따라 조정하며, 디스크 I/O 병목이 발생하지 않도록 주의합니다[9].

3. 주요 파라미터 설정 시 고려사항 및 실전 팁

  • 하드웨어 자원 파악: CPU 코어 수, 메모리 용량, 디스크 I/O 성능을 정확히 파악하고, 그 한계 내에서 설정합니다.
  • 쿼리 패턴 분석: 집계, 조인, 정렬, 대량 삽입 등 자주 사용하는 쿼리 유형에 따라 파라미터 우선순위를 다르게 두어야 합니다.
  • 동시성(Concurrency): 여러 쿼리가 동시에 실행되는 환경에서는 단일 쿼리의 리소스 사용량을 제한하는 것이 서버 전체 안정성에 유리합니다.
  • 테스트와 모니터링: 실제 워크로드를 반영한 테스트를 통해 설정값을 조정하고, 시스템 모니터링을 통해 병목구간을 지속적으로 분석해야 합니다.
  • 점진적 조정: 한 번에 여러 파라미터를 크게 변경하기보다는, 한 가지씩 조정하며 성능 변화를 관찰하는 것이 좋습니다[2][3][4][8].

4. 파라미터 튜닝 적용 방법

파라미터를 세팅하는 방법은 다양합니다. 일회성 튜닝은 SETTINGS 절, 팀 공통 적용은 설정 프로필이 권장되며 그에 따라 다음 순서대로 설정을 적용하는 것이 일반적입니다.

  1. 쿼리 내 SETTINGS 절
  2. 세션 SET / 클라이언트 옵션 / HTTP 파라미터
  3. 사용자 프로필
  4. 서버 기본 설정

4.1 세션 레벨 실행

SQL 실행 중간에 직접 지정:

-- 파라미터 세팅 예시
SET partial_merge_join = 1,
    partial_merge_join_optimizations = 1,
    max_bytes_before_external_group_by = 5000000000,
    max_bytes_before_external_sort = 5000000000,
    max_threads = 8,
    max_block_size = 65536,
    max_memory_usage = 8000000000;

4.2 쿼리 단위 SETTINGS 절

한 쿼리에서만 적용:

SELECT ...
FROM ...
SETTINGS
  partial_merge_join = 1,
  partial_merge_join_optimizations = 1,
  max_threads = 8,
  max_block_size = 65536,
  max_memory_usage = 8000000000;

4.3 클라이언트 실행 시 옵션

세션 전체에 기본 적용:

clickhouse-client \
  --max_threads=8 \
  --max_block_size=65536 \
  --max_memory_usage=8000000000

4.4 HTTP 쿼리 파라미터

(프로그램/스크립트에서 간편)

POST /?max_threads=8&max_memory_usage=8000000000&partial_merge_join=1 ...

4.5 드라이버별 설정 전달

  • JDBC:
jdbc:clickhouse://host:8123/db?max_threads=8&max_memory_usage=8000000000
  • Python clickhouse-driver:
from clickhouse_driver import Client
client = Client(host='...', settings={
  'max_threads': 8,
  'max_memory_usage': 8_000_000_000,
  'partial_merge_join': 1,
  'partial_merge_join_optimizations': 1,
})

4.6 서버 측 ‘설정 프로필’(영구 적용)

  • SQL 기반 RBAC 사용:
  • CREATE SETTINGS PROFILE heavy_joins
      SETTINGS
        partial_merge_join = 1,
        partial_merge_join_optimizations = 1,
        max_threads = 8,
        max_block_size = 65536,
        max_memory_usage = 8000000000;
    
    ALTER USER some_user SETTINGS PROFILE heavy_joins;
    -- 또는 역할에 부여 후 사용자에 역할 부여
    
    

    이후 그 유저/역할로 접속하면 기본 적용됩니다.

    필요 시 SET PROFILE heavy_joins;로 세션에 적용도 가능.

4.7 서버 설정 파일(관리자용, 지속 적용)

  • users.d/*.xml(구성 프로필) 또는 메인 config.xml에서 프로필/기본값 설정
  • 변경 후 SYSTEM RELOAD CONFIG;로 재적용(무중단 반영 가능 범위 내)

5. 결론

ClickHouse 성능 튜닝은 단순히 파라미터의 수치만 변경하는 것이 아니라, 데이터 모델, 쿼리 패턴, 하드웨어 환경을 종합적으로 고려하여야 합니다. 위에서 소개한 각 파라미터의 의미와 설정 시 고려사항을 이해하고, 실제 환경에서 점진적으로 튜닝을 적용한다면 대규모 데이터 분석 환경에서도 안정적이고 빠른 성능을 경험할 수 있습니다.

지속적인 모니터링과 테스트를 통해 최적의 설정값을 찾아가는 것이 ClickHouse 성능 튜닝의 핵심입니다.