ClickHouse 성능 병목 현상, Cloudflare의 3가지 패치로 해결!

by DD
2주 전
조회수 18

Cloudflare는 ClickHouse 테이블 파티셔닝 키 변경 후, 빌링 시스템의 쿼리 성능 저하(Query Performance Degradation) 문제를 겪음

쿼리 계획 단계(Query Planning Phase)에서 락 경합(Lock Contention)이 주요 원인임을 파악하고, 공유 락(Shared Lock) 적용, 벡터 복사 제거, 이진 검색(Binary Search) 도입을 통해 해결

3가지 패치를 통해 쿼리 지연 시간(Latency)을 50% 감소시키고, 데이터 파트 증가에 따른 성능 저하 문제(Performance Degradation)를 해결함

파티셔닝 키 변경의 기술적 배경

Cloudflare는 데이터 격리 아키텍처(Data Isolation Architecture)를 위해 ClickHouse 테이블의 파티셔닝 키를 변경했다. 기존 (day)에서 (namespace, day)로 변경하여 네임스페이스(Namespace)별 데이터 보존 정책을 구현하고자 했다.

Table-per-Namespace 방식은 테이블 관리에 대한 오버헤드(Overhead) 발생

새로운 파티셔닝 키는 기존 보존 시스템을 재사용 가능

결과적으로, 이 결정은 데이터 파트(Data Part) 증가를 야기했고, 이는 예상치 못한 성능 병목 현상(Bottleneck)으로 이어졌다.

성능 저하의 원인 분석

빌링 시스템의 성능 저하 원인을 찾기 위해 Cloudflare는 ClickHouse의 trace_log를 활용하여 플레임 그래프(Flame Graph)를 생성했다. 초기에는 CPU 사용량에 집중했으나, 실제 문제는 쿼리 계획 단계(Query Planning Phase)에서 발생했다.

CPU 기반 플레임 그래프: filterPartsByPartition 함수에서 45%의 CPU 시간 소비

Real 플레임 그래프: MergeTreeData 뮤텍스(Mutex) 획득을 위한 락 경합(Lock Contention)으로 인해 쿼리 지연 시간(Latency) 증가

수백 개의 동시 쿼리가 단일 뮤텍스(Mutex)를 공유하면서 병목 현상이 발생했다.

3가지 ClickHouse 패치 상세 분석

Cloudflare는 락 경합(Lock Contention) 문제를 해결하기 위해 3가지 패치를 적용했다. 첫 번째는 공유 락(Shared Lock)을 사용하여 쿼리 계획 단계(Query Planning Phase)의 동시성을 높였다.

공유 락(Shared Lock) 적용: 쿼리 플래너(Query Planner)가 MergeTreeData 뮤텍스(Mutex)를 공유 락으로 획득

벡터 복사 제거: 파트 리스트(Part List) 복사 비용을 줄이기 위해 Shared Copy 방식 도입

이진 검색(Binary Search) 도입: 파티션 키(Partition Key)를 기반으로 이진 검색(Binary Search)을 수행하여 필터링 성능 향상

이러한 패치를 통해 쿼리 지연 시간(Latency)을 50% 감소시키고, 데이터 파트 증가에 따른 성능 저하 문제를 해결했다.

패치 적용 후 성능 개선 효과

각 패치 적용 후 성능 개선 효과는 명확하게 나타났다. 공유 락(Shared Lock) 적용으로 락 경합(Lock Contention) 문제가 즉시 해결되었고, 벡터 복사 제거를 통해 추가적인 성능 향상을 달성했다.

공유 락(Shared Lock) 적용: 쿼리 지연 시간(Latency) 즉시 감소

벡터 복사 제거: 추가적인 성능 향상

이진 검색(Binary Search) 도입: 쿼리 지연 시간(Latency) 50% 감소 및 데이터 파트 증가에 따른 성능 저하 문제 해결

이러한 개선을 통해 Cloudflare는 빌링 시스템의 안정성을 확보하고, 데이터 파트 증가에 따른 성능 저하 문제를 해결했다.

향후 과제 및 아키텍처적 고려 사항

이번 최적화는 ClickHouse의 성능 문제를 해결했지만, 근본적인 파티셔닝 방식의 적합성에 대한 의문을 제기한다. 데이터 파트(Data Part)가 증가함에 따라 ZooKeeper의 성능에도 영향을 미칠 수 있다.

파티셔닝 방식의 장단점: 현재는 패치로 문제를 해결했지만, 장기적인 관점에서 다른 아키텍처 고려 필요

ZooKeeper 성능 문제: 데이터 파트 증가에 따른 메타데이터 관리 문제 발생 가능성

결과적으로, Cloudflare는 지속적인 성능 개선과 함께 데이터 격리 아키텍처(Data Isolation Architecture)의 장기적인 전략을 재검토해야 한다.

Our billing pipeline was suddenly slow. The culprit was a hidden bottleneck in ClickHouse