min_chunk_bytes_for_parallel_parsing
- 유형: 부호 없는 정수
- 기본값: 1 MiB
min_compress_block_size
min_compress_block_size 이상이면 다음 마크를 기록할 때 블록을 압축합니다. 기본값은 65,536입니다.
압축되지 않은 데이터가 max_compress_block_size보다 작은 경우, 실제 블록 크기는 이 값보다 작아지지 않으며 한 마크에 해당하는 데이터 양보다도 작아지지 않습니다.
예시를 살펴보겠습니다. 테이블 생성 시 index_granularity를 8192로 설정했다고 가정합니다.
UInt32 유형의 컬럼(값당 4바이트)을 기록한다고 가정해 보겠습니다. 8192개 행을 기록하면 총 데이터 크기는 32KB가 됩니다. min_compress_block_size = 65,536이므로 압축 블록은 마크 2개마다 하나씩 생성됩니다.
String 유형의 URL 컬럼(값당 평균 크기 60바이트)을 기록한다고 가정해 보겠습니다. 8192개 행을 기록하면 평균적으로 500KB에 약간 못 미치는 데이터가 됩니다. 이는 65,536보다 크므로 압축 블록은 각 마크마다 하나씩 생성됩니다. 이 경우 디스크에서 단일 마크 범위의 데이터를 읽을 때는 추가 데이터가 압축 해제되지 않습니다.
이 설정은 전문가 수준의 설정이므로 ClickHouse를 막 사용하기 시작한 경우에는 변경하지 않는 것이 좋습니다.
min_filtered_ratio_for_lazy_final
min_hit_rate_to_use_consecutive_keys_optimization
min_os_cpu_wait_time_ratio_to_throw
min_outstreams_per_resize_after_split
Resize 또는 StrictResize 프로세서의 최소 출력 스트림 수를 지정합니다. 결과 스트림 수가 이 값보다 적으면 분할 작업은 수행되지 않습니다.
Resize Node란 무엇입니까
Resize 노드는 쿼리 파이프라인에서 파이프라인을 통해 흐르는 데이터 스트림 수를 조정하는 프로세서입니다. 여러 스레드나 프로세서에 작업 부하를 고르게 분산하기 위해 스트림 수를 늘리거나 줄일 수 있습니다. 예를 들어, 쿼리에 더 높은 병렬성이 필요하면 Resize 노드는 단일 스트림을 여러 스트림으로 분할할 수 있습니다. 반대로 여러 스트림을 더 적은 수의 스트림으로 머지하여 데이터 처리를 통합할 수도 있습니다.
Resize 노드는 데이터 블록의 구조를 유지하면서 데이터가 각 스트림에 고르게 분산되도록 합니다. 이는 리소스 활용도를 최적화하고 쿼리 성능을 향상하는 데 도움이 됩니다.
Resize 노드를 분할해야 하는 이유
Resize 노드의 ExecutingGraph::Node::status_mutex에서 경합이 심하게 발생하며, 특히 코어 수가 많은 환경에서 더욱 두드러집니다. 이러한 경합은 다음과 같은 문제를 초래합니다.
- ExecutingGraph::updateNode의 지연 시간이 증가하여 쿼리 성능에 직접적인 영향을 줍니다.
- 스핀 잠금 경합(native_queued_spin_lock_slowpath)으로 인해 과도한 CPU 사이클이 낭비되어 효율이 저하됩니다.
- CPU 활용률이 낮아져 병렬성과 처리량이 제한됩니다.
Resize 노드가 분할되는 방식
- 분할이 가능한지 확인하기 위해 출력 스트림 수를 검사합니다. 즉, 각 분할 프로세서의 출력 스트림 수가
min_outstreams_per_resize_after_split임계값 이상이어야 합니다. Resize노드는 더 작은Resize노드들로 나뉘며, 각 노드는 동일한 수의 포트를 갖고 입력 및 출력 스트림의 부분 집합을 처리합니다.- 각 그룹이 독립적으로 처리되므로 잠금 경합이 줄어듭니다.
임의의 입력/출력을 갖는 Resize 노드 분할
Resize 노드 수로 나누어떨어지지 않으면, 일부 입력은 NullSource에 연결되고 일부 출력은 NullSink에 연결됩니다. 이렇게 하면 전체 데이터 흐름에 영향을 주지 않고 분할할 수 있습니다.
설정의 목적
min_outstreams_per_resize_after_split 설정은 Resize 노드 분할이 실질적인 의미를 갖도록 하고, 너무 적은 수의 스트림이 생성되어 병렬 처리가 비효율적으로 이루어지는 상황을 방지합니다. 출력 스트림의 최소 개수를 강제함으로써 이 설정은 병렬성과 오버헤드 간의 균형을 유지하는 데 도움이 되며, 스트림 분할 및 병합이 포함된 시나리오에서 쿼리 실행을 최적화합니다.
설정 비활성화
Resize 노드의 split을 비활성화하려면 이 설정을 0으로 설정합니다. 그러면 파이프라인 생성 중 Resize 노드가 분할되지 않아 더 작은 노드로 나뉘지 않고 원래 구조를 유지합니다.