This post show that RocksDB has gotten much faster over time for the read-heavy benchmarks that I use. I recently shared results from a large server to show the speedup from the hyperclock block cache implementation for different concurrency levels with RocksDB 9.6. Here I share results from the same server and different (old and new) RocksDB releases.
Results are amazing on a large (48 cores) server with 40 client threads
- ~2X more QPS for range queries with hyperclock
- ~3X more QPS for point queries with hyperclock
I used RocksDB versions 6.0.2, 6.29.5, 7.0.4, 7.6.0, 7.7.8, 8.5.4, 8.6.7, 9.0.1, 9.1.2, 9.3.2, 9.5.2, 9.7.4 and 9.9.0. Everything was compiled with gcc 11.4.0.
The --cache_type argument selected the block cache implementation:
- lru_cache was used for versions 7.6 and earlier. Because some of the oldest releases don't support --cache_type I also used --undef_params=...,cache_type
- hyper_clock_cache was used for versions 7.7 through 8.5
- auth_hyper_clock_cache was used for versions 8.5+
Hardware
The server is an ax162-s from Hetzner with an AMD EPYC 9454P processor, 48 cores, AMD SMT disabled and 128G RAM. The OS is Ubuntu 22.04. Storage is 2 NVMe devices with SW RAID 1 and ext4.
Benchmark
Overviews on how I use db_bench are here and here.
All of my tests here use a CPU-bound workload with a database that is cached by RocksDB and the benchmark is run for 40 threads.
I focus on the read-heavy benchmark steps:
- revrangeww (reverse range while writing) - this does short reverse range scans
- fwdrangeww (forward range while writing) - this does short forward range scans
- readww (read while writing) - this does point queries
For each of these there is a fixed rate for writes done in the background and performance is reported for the reads. I prefer to measure read performance when there are concurrent writes because read-only benchmarks with an LSM suffer from non-determinism as the state (shape) of the LSM tree has a large impact on CPU overhead and throughput.
Results
All results are in this spreadsheet and the performance summary is here.
The graph below shows relative QPS which is: (QPS for my version / QPS for RocksDB 6.0.2) and the results are amazing:
- ~2X more QPS for range queries with hyperclock
- ~3X more QPS for point queries with hyperclock
The average values for vmstat metrics provide more detail on why hyperclock is so good for performance. The context switch rate drops dramatically when it is enabled because there is much less mutex contention. The user CPU utilization increases by ~1.6X because more useful work can get done when there is less mutex contention.
* cs - context switches per second per vmstat
* us - user CPU utilization per vmstat
* sy - system CPU utilization per vmstat
* id - idle CPU utilization per vmstat
* wa - wait CPU utilization per vmstat
* version - RocksDB version
cs us sy us+sy id wa version
1495325 50.3 14.0 64.3 18.5 0.1 7.6.0
2360 82.7 14.0 96.7 16.6 0.1 9.9.0