RocksDB, 100만 행 데이터 로딩 속도 23배 향상!
RocksDB 기반 엔진에서 100만 행 데이터 로딩 속도가 180초에서 7.8초로 23배 향상됨
Transaction::Put 사용, 압축, sscanf, 문자열 복사 등 다양한 병목 지점(Bottleneck)을 발견
perf 및 flamegraph를 활용한 프로파일링(Profiling)을 통해 문제 해결
RocksDB를 스토리지 엔진으로 사용하는 개발자들에게 유용한 정보 제공
프로파일링 도구 활용: perf 및 Flamegraph
게시물에서는 perf와 Flamegraph를 사용하여 RocksDB의 성능 병목 지점을 식별했다고 언급한다. 특히, Flamegraph는 함수 호출 관계를 시각화하여 코드의 핫스팟(Hotspot)을 파악하는 데 유용하다. perf는 리눅스 시스템에서 성능 분석을 위한 강력한 도구로, CPU 사용량, 캐시 미스(Cache Miss) 등을 측정하여 성능 저하 원인을 분석한다. 이러한 도구들을 통해 개발자는 코드 수준의 최적화(Code-Level Optimization)를 수행할 수 있다.
Transaction::Put 사용의 문제점
게시물에서는 대량 데이터 로딩 시 Transaction::Put 사용으로 인한 성능 저하를 지적한다. Transaction::Put은 각 쓰기 작업마다 락(Lock)을 획득하고 정렬하는 오버헤드가 발생한다. 대량의 데이터를 로드할 때는 SstFileWriter를 사용하여 데이터를 직접 SStable 파일로 쓰는 것이 훨씬 효율적이다. SstFileWriter는 병렬 쓰기를 지원하여 I/O 성능(I/O Performance)을 극대화할 수 있다.
압축 및 필터 작업의 최적화
게시물에서는 압축 및 필터 작업이 컴팩션(Compaction) 과정에서 중복되어 발생하는 문제를 지적한다. RocksDB는 데이터를 여러 계층으로 구성하여 관리하며, 컴팩션은 이러한 계층 간의 데이터 정렬 및 병합을 수행하는 과정이다. 따라서, 컴팩션 과정에서 다시 수행될 작업을 미리 수행하는 것은 불필요한 오버헤드를 발생시킨다. 컴팩션 전략(Compaction Strategy)을 적절히 설정하여 이러한 중복 작업을 최소화하는 것이 중요하다.
sscanf, 문자열 복사, 가상 함수 호출 최적화
게시물에서는 sscanf 함수, 바이트 단위 문자열 추가, 가상 함수 호출, 원자적 상태 검사 등 다양한 코드 수준의 최적화가 이루어졌음을 강조한다. sscanf는 문자열 파싱(Parsing)에 사용되는 함수로, 성능에 민감한 코드에서는 다른 방법을 고려해야 한다. 바이트 단위 문자열 추가는 문자열 복사 오버헤드를 발생시키므로, 메모리 할당(Memory Allocation)을 최소화하는 방식으로 변경해야 한다. 가상 함수 호출은 간접 호출로 인해 성능 저하를 유발할 수 있으며, 인라인(Inline) 함수 또는 다른 디자인 패턴을 사용하여 최적화할 수 있다.