ToplingDB vs RocksDB bench results

dcompact bench → — offloads most CPU and memory cost.

Updated (UTC): 2026-09-15 07:18:26+00:00

Latest: plain

run_id=34935695406 | result table | 2026-09-15 07:18:23+00:00

raw logs: ToplingDB zipkeyonly | ToplingDB zipkeyvalue | RocksDB v8.10 | RocksDB master (db114777) | DB INFO LOGs + bench yamls (Actions artifact)

ToplingDB bench yaml: zipkeyonly db_bench-fillrandom.yaml | zipkeyonly db_bench-fillseq.yaml | zipkeyonly db_bench-fillseq-cspp.yaml | zipkeyvalue db_bench-fillrandom.yaml | zipkeyvalue db_bench-fillseq.yaml | zipkeyvalue db_bench-fillseq-cspp.yaml

Runner hardware/software

OSUbuntu 24.04.5 LTS
Kernel6.17.0-1022-azure
CPUAMD EPYC 7763 64-Core Processor
Logical CPUs4
Memory15.6GiB
/dev/shm11.7GiB
RocksDB block cache7.8GiB

num=50000000 | key_size=8 | value_size=50

On-disk DB size (1.9GiB) ≤ block cache (7.8GiB) — the dataset fits in cache, so this bench is a CPU and memory comparison.

/dev/shm usage (disk space; after db_bench)

Allocated disk usage (IEC blocks). zipkeyonly does not compress values (speed-optimized). RocksDB uses per-level compression (L0 none, L1-L5 Snappy, L6 Zstd), corresponding to the ToplingDB zipkeyvalue variant's level_writers (lightweight upper levels, heavyweight L6). Space ratio = engine / v8.10. color sign: ToplingDB is Better/Worse.

workloadToplingDB zipkeyonlyToplingDB zipkeyvalueRocksDB v8.10RocksDB master (db114777)zipkeyonly / v8.10 (space)zipkeyvalue / v8.10 (space)
fillrandom suite2.3GiB1.0GiB1.9GiB1.9GiB1.24x0.56x
fillseq suite3.2GiB1.4GiB1.6GiB1.6GiB1.97x0.87x
fillseq suite (CSPP)3.2GiB1.5GiBn/an/a——

Peak RSS (RAM; during db_bench)

RSS is Resident Set Size. RocksDB block cache = half physical memory (7.8GiB). Ratio = engine / v8.10. color sign: ToplingDB is Better/Worse. RocksDB omit cells are =readseq (same scan; no omit). scan-omit-value: restart process, reuse fill* data, scan without access value, benefited by lazy load value (ToplingDB feature).

workloadToplingDB zipkeyonlyToplingDB zipkeyvalueRocksDB v8.10RocksDB master (db114777)zipkeyonly / v8.10 (RSS)zipkeyvalue / v8.10 (RSS)
fillrandom suite peak2.2GiB2.2GiB2.1GiB2.1GiB1.05x1.06x
fillrandom suite readrandom133.4MiB388.7MiB2.1GiB2.1GiB0.06x0.18x
fillrandom scan-omit-value129.3MiB143.0MiB2.1GiB (=readseq)2.1GiB (=readseq)0.06x0.07x
fillseq suite peak1.9GiB1.9GiB3.2GiB3.3GiB0.59x0.59x
fillseq suite readrandom141.8MiB726.5MiB3.2GiB3.3GiB0.04x0.22x
fillseq scan-omit-value125.4MiB147.1MiB3.2GiB (=readseq)3.3GiB (=readseq)0.04x0.04x
fillseq suite (CSPP) peak2.4GiB2.5GiBn/an/a——
fillseq suite (CSPP) readrandom129.9MiB739.0MiBn/an/a——
fillseq scan-omit-value (CSPP)125.2MiB149.2MiBn/an/a——

RAM usage over time

Sampled once per second from /proc/statm plus open-file page cache. The bar below each plot shows stage name + duration (consecutive repeats merge, e.g. readseq×3); colored bands mark the same intervals. Stage names may overflow into a neighbor cell; a label under the bar is used only when names would overlap.

startup 2.0 fillrandom 30 flush 0.0 compact 25 readseq×3 5.9 readrandom 11 0 500 1000 1500 2000 2500 3000 3500 4000 MiB 0 5 10 15 20 25 30 35 40 45 50 55 60 65 70 75 80 Time (sec) ToplingDB zipkeyonly — fillrandom suite RAM rss shared anony pagecache anony+pc
startup 2.0 fillseq 14 flush 0.0 compact 21 readseq×3 4.9 readrandom 7.5 0 500 1000 1500 2000 2500 3000 3500 4000 MiB 0 5 10 15 20 25 30 35 40 45 50 55 60 Time (sec) ToplingDB zipkeyonly — fillseq suite RAM rss shared anony pagecache anony+pc
startup 2.0 fillseq 15 flush 0.1 compact 21 readseq×3 5.0 readrandom 7.3 0 500 1000 1500 2000 2500 3000 3500 4000 MiB 0 5 10 15 20 25 30 35 40 45 50 55 60 Time (sec) ToplingDB zipkeyonly — fillseq-cspp suite RAM rss shared anony pagecache anony+pc
startup 2.0 fillrandom 30 flush 0.0 compact 35 readseq×3 8.9 readrandom 29 0 500 1000 1500 2000 2500 3000 3500 4000 4500 5000 MiB 0 50 100 150 200 Time (sec) ToplingDB zipkeyvalue — fillrandom suite RAM rss shared anony pagecache anony+pc
startup 2.0 fillseq 14 flush 0.0 compact 64 readseq×3 7.2 readrandom 35 0 500 1000 1500 2000 2500 3000 3500 4000 MiB 0 50 100 150 200 Time (sec) ToplingDB zipkeyvalue — fillseq suite RAM rss shared anony pagecache anony+pc
startup 2.0 fillseq 15 flush 0.0 compact 65 readseq×3 7.3 readrandom 38 0 500 1000 1500 2000 2500 3000 3500 4000 MiB 0 50 100 150 200 Time (sec) ToplingDB zipkeyvalue — fillseq-cspp suite RAM rss shared anony pagecache anony+pc
fillrandom 75 flush 0.3 compact 22 readseq×3 10 readrandom 143 0 500 1000 1500 2000 2500 3000 3500 4000 4500 5000 MiB 0 50 100 150 200 250 300 Time (sec) RocksDB v8.10 — fillrandom suite RAM rss shared anony pagecache anony+pc
fillseq 20 compact 19 readseq×3 17 readrandom 156 flush 0.2 0 500 1000 1500 2000 2500 3000 3500 4000 4500 5000 MiB 0 50 100 150 200 250 300 Time (sec) RocksDB v8.10 — fillseq suite RAM rss shared anony pagecache anony+pc
fillrandom 67 flush 0.3 compact 36 readseq×3 14 readrandom 132 0 500 1000 1500 2000 2500 3000 3500 4000 4500 5000 MiB 0 50 100 150 200 250 300 Time (sec) RocksDB master (db114777) — fillrandom suite RAM rss shared anony pagecache anony+pc
fillseq 21 flush 0.2 compact 21 readseq×3 23 readrandom 139 0 500 1000 1500 2000 2500 3000 3500 4000 4500 5000 5500 6000 MiB 0 50 100 150 200 250 300 Time (sec) RocksDB master (db114777) — fillseq suite RAM rss shared anony pagecache anony+pc

Comparison: db_bench fillrandom suite (perf)

Benchmarks: fillrandom, flush, compact, readseq×3, readrandom. RocksDB uses per-level compression (L0 none, L1-L5 Snappy, L6 Zstd), corresponding to the ToplingDB zipkeyvalue variant's level_writers (lightweight upper levels, heavyweight L6). compact row shows operations/time. color sign: ToplingDB is Better/Worse.

benchmarkToplingDB zipkeyonly ops/secToplingDB zipkeyvalue ops/secRocksDB v8.10 ops/secRocksDB master (db114777) ops/seczipkeyonly / zipkeyvaluezipkeyonly / v8.10zipkeyonly / master (db114777)zipkeyvalue / v8.10zipkeyvalue / master (db114777)
fillrandom165616116600026643547461691.00x2.49x2.22x2.50x2.22x
compact1/24.6s1/34.6s1/21.6s1/36.2s1.41x0.88x1.47x0.62x1.04x
readseq25401586169363781077164774801321.50x2.36x3.40x1.57x2.26x
readrandom472075517355723487053788782.72x13.54x12.46x4.98x4.58x

Comparison: db_bench fillseq suite (perf)

Same as fillrandom, except ToplingDB fillseq uses OffsetSkipList (fillrandom still uses CSPP). RocksDB fillseq benefits from shortcuts: trivial_move on non-overlapping SSTs; refit level skips zstd on L6: faster, larger size. Seqno-zeroing compact still runs.

benchmarkToplingDB zipkeyonly ops/secToplingDB zipkeyvalue ops/secRocksDB v8.10 ops/secRocksDB master (db114777) ops/seczipkeyonly / zipkeyvaluezipkeyonly / v8.10zipkeyonly / master (db114777)zipkeyvalue / v8.10zipkeyvalue / master (db114777)
fillseq35691623653355256283623848580.98x1.39x1.50x1.43x1.53x
compact1/20.8s1/64.2s1/19.0s1/21.3s3.09x0.91x1.03x0.30x0.33x
readseq30650777209196961076765674635951.47x2.85x4.11x1.94x2.80x
readrandom667998414162033195373609224.72x20.91x18.51x4.43x3.92x

Comparison: db_bench fillseq suite (CSPP) (perf)

Same as fillrandom, except ToplingDB fillseq uses CSPP. RocksDB fillseq benefits from shortcuts: trivial_move on non-overlapping SSTs; refit level skips zstd on L6: faster, larger size. Seqno-zeroing compact still runs.

benchmarkToplingDB zipkeyonly ops/secToplingDB zipkeyvalue ops/secRocksDB v8.10 ops/secRocksDB master (db114777) ops/seczipkeyonly / zipkeyvaluezipkeyonly / v8.10zipkeyonly / master (db114777)zipkeyvalue / v8.10zipkeyvalue / master (db114777)
fillseq32836343336748256283623848580.98x1.28x1.38x1.30x1.40x
compact1/20.9s1/65.4s1/19.0s1/21.3s3.13x0.91x1.02x0.29x0.33x
readseq29762436206313261076765674635951.44x2.76x3.99x1.92x2.76x
readrandom681715413172023195373609225.18x21.33x18.89x4.12x3.65x

Lazy load demo (scan; RocksDB v8.10 baseline)

zipkey* needs an extra omit pass: scan_omit_key/value enables lazy value load (no real value load). RocksDB has no lazy load, so the baseline is readseq×3 already present in the main fill* suite (no extra pass). RocksDB nextwithkey cells are =readseq. master omitted here (v8.10 is the stronger RocksDB baseline). color sign: ToplingDB is Better/Worse.

scan-omit-value on data from fillrandom

benchmarkToplingDB zipkeyonly ops/secToplingDB zipkeyvalue ops/secRocksDB v8.10 ops/seczipkeyonly / v8.10zipkeyvalue / v8.10
readseq3861710538758608107716473.59x3.60x
nextwithkey397818684006904610771647 (=readseq)3.69x3.72x

scan-omit-value on data from fillseq

benchmarkToplingDB zipkeyonly ops/secToplingDB zipkeyvalue ops/secRocksDB v8.10 ops/seczipkeyonly / v8.10zipkeyvalue / v8.10
readseq5076389550832586107676564.71x4.72x
nextwithkey508305715211748110767656 (=readseq)4.72x4.84x

scan-omit-value on data from fillseq (CSPP)

benchmarkToplingDB zipkeyonly ops/secToplingDB zipkeyvalue ops/secRocksDB v8.10 ops/seczipkeyonly / v8.10zipkeyvalue / v8.10
readseq5098799451024885107676564.74x4.74x
nextwithkey516736585186716610767656 (=readseq)4.80x4.82x

memtablerep_bench: OffsetSkipList and CSPP vs skiplist

Focus: OffsetSkipList / CSPP (ToplingDB) vs skiplist. Baseline = RocksDB v8.10 skiplist. color sign: ToplingDB is Better/Worse.

benchmarkmetricOffsetSkipList (ToplingDB)CSPP (ToplingDB)skiplist (ToplingDB)skiplist (RocksDB v8.10)OffsetSkipList / v8.10CSPP / v8.10
fillrandomElapsed time255690963 us34713838 us286876829 us312004833 us0.82x0.11x
fillrandomWrite throughput6.34065 MiB/s46.7032 MiB/s5.65137 MiB/s5.19622 MiB/s1.22x8.99x
fillrandomwrite us/op2.556910.3471382.868773.120050.82x0.11x
readrandomElapsed time312504318 us44104344 us347456694 us339235319 us0.92x0.13x
readrandomRead throughput5.18792 MiB/s36.7593 MiB/s4.66604 MiB/s4.77912 MiB/s1.09x7.69x
readrandomread us/op3.125040.4410433.474573.392350.92x0.13x

History