배치 처리·연산자 융합·SIMD로 Postgres 분석 성능을 300배 높인 pgrust

2 days ago 10

pgrust 0.2는 쿼리 엔진을 중심으로 성능을 개선해 이전 버전보다 10배, OLTP에서 Postgres보다 30%, ClickBench에서 300배 빠르며 ClickHouse도 앞섬 Postgres의 행 단위 Volcano 실행 모델은 각 행마다 런타임에 결정되는 next()를 호출해 함수 호출 비용이 크고 CPU 파이프라이닝 같은 최적화를 활용하기 어려움 5억 개의 float8 값을 더하는 축소 실험에서 1.3초가 걸린 행 단위 실행을 배치 처리로 480ms, 연산자 융합으로 358ms, SIMD로 135ms까지 단축함 스택 버퍼를 사용하는 배치는 할당과 호출 횟수를 줄이고, 연산자 융합은 스캔과 집계를 합쳐 복사를 없애며, SIMD는 여러 값을 동시에 처리함 모든 쿼리 조합에 최적화된 융합 코드를 미리 준비할 수 없어 JIT 컴파일이 필요하며, 부동소수점 SIMD는 덧셈 순서가 달라져 결과에 미세한 차이가 생길 수 있음 pgrust 0.2의 성능 pgrust 0.2는 성능에 집중한 릴리스로, 이전 버전보다 10배 빨라짐 작업 유형별 벤치마크 결과는 다음과 같음 OLTP 벤치마크에서는 Postgres보다 30% 빠름 ClickHouse의 분석 데이터베이스 벤치마크인 ClickBench에서는 Postgres보다 300배 빠르며 ClickHouse도 앞섬 전체 300배 향상 가운데 쿼리 엔진 변경만으로 얻은 성능 향상은 약 10배임 Postgres에 최적화 여지가 큰 이유 Postgres의 기원은 디스크 입출력이 데이터베이스 성능의 주된 병목이던 1980년대까지 거슬러 올라감 세 가지 변화로 CPU와 메모리 성능의 중요성이 커짐 많은 데이터셋이 RAM에 들어가면서 디스크 입출력 대부분이 사라짐 RAM보다 큰 데이터셋도 분석 작업에서는 데이터를 대량 스캔하므로, 병목이 디스크 처리량보다 CPU나 메모리 처리량에 놓이는 경우가 많음 NVMe는 하드디스크보다 수백 배 빨라짐 쿼리 엔진은 데이터베이스에서 CPU를 주로 사용하는 부분이므로, pgrust는 같은 쿼리를 처리할 때 Postgres보다 CPU와 메모리 대역폭을 적게 사용하도록 최적화함 5억 개 값 합산 실험 generate_series로 만든 5억 개의 float8 값을 SUM하는 Postgres 쿼리는 병렬 쿼리를 끈 c8g.4xl 환경에서 약 20초 걸림 같은 값을 Rust의 단순 for 루프로 합산하면 358ms로 약 55배 빠름 두 구현은 완전히 ...

Read Entire Article