ToplingDB vs RocksDB bench results
dcompact bench →
— offloads most CPU and memory cost.
Updated (UTC): 2026-08-18 15:53:25+00:00
Latest: plain
run_id=32148249444 |
result table |
2026-08-18 15:53:23+00:00
raw logs: ToplingDB zipkeyonly | ToplingDB zipkeyvalue | RocksDB v8.10 | RocksDB master (323d915d) | DB INFO LOGs + bench yamls (Actions artifact)
ToplingDB bench yaml: zipkeyonly db_bench-fillrandom.yaml | zipkeyonly db_bench-fillseq.yaml | zipkeyvalue db_bench-fillrandom.yaml | zipkeyvalue db_bench-fillseq.yaml
Runner hardware/software
| OS | Ubuntu 24.04.4 LTS |
| Kernel | 6.17.0-1022-azure |
| CPU | AMD EPYC 7763 64-Core Processor |
| Logical CPUs | 4 |
| Memory | 15.6GiB |
| /dev/shm | 7.8GiB |
| RocksDB block cache | 7.8GiB |
num=100000000 | key_size=8 | value_size=50
On-disk DB size (3.7GiB) ≤ 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.
| workload | ToplingDB zipkeyonly | ToplingDB zipkeyvalue | RocksDB v8.10 | RocksDB master (323d915d) | zipkeyonly / v8.10 (space) | zipkeyvalue / v8.10 (space) |
| fillrandom suite | 3.0GiB | 664.4MiB | 3.7GiB | 3.7GiB | 0.82x | 0.17x |
| fillseq suite | 4.7GiB | 1.2GiB | 3.2GiB | 3.2GiB | 1.46x | 0.38x |
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).
| workload | ToplingDB zipkeyonly | ToplingDB zipkeyvalue | RocksDB v8.10 | RocksDB master (323d915d) | zipkeyonly / v8.10 (RSS) | zipkeyvalue / v8.10 (RSS) |
| fillrandom suite peak | 2.5GiB | 2.4GiB | 4.1GiB | 4.2GiB | 0.62x | 0.59x |
| fillrandom suite readrandompeak RSS during the readrandom stage of the fillrandom suite | 151.2MiBNot include (value's) shared RSS — mmap slice as source → direct → user slice as target ^^^^^^^^^^ ^^^^^^ not zipped not touched not bring to shared RSS | 652.1MiBInclude (value's) shared RSS — mmap slice as source → decompress → user slice as target ^^^^^^^^^^ ^^^^^^^^^^ zipped read source bring mmap to shared RSS | 4.1GiBmainly block cache;
file page cache is not counted in shared/RSS, so actual RAM is larger, as the chart below shows | 4.2GiBmainly block cache;
file page cache is not counted in shared/RSS, so actual RAM is larger, as the chart below shows | 0.04x | 0.16x |
| fillrandom scan-omit-valuerestart process with reuse db data of fillrandom, scan without access value, benefited by lazy load value (ToplingDB feature) | 141.9MiB | 174.0MiB | 4.1GiB (=readseq) | 4.2GiB (=readseq) | 0.03x | 0.04x |
| fillseq suite peak | 1.9GiB | 1.9GiB | 6.4GiB | 6.5GiB | 0.29x | 0.29x |
| fillseq suite readrandompeak RSS during the readrandom stage of the fillseq suite | 137.8MiBNot include (value's) shared RSS — mmap slice as source → direct → user slice as target ^^^^^^^^^^ ^^^^^^ not zipped not touched not bring to shared RSS | 1.2GiBInclude (value's) shared RSS — mmap slice as source → decompress → user slice as target ^^^^^^^^^^ ^^^^^^^^^^ zipped read source bring mmap to shared RSS | 6.4GiBmainly block cache;
file page cache is not counted in shared/RSS, so actual RAM is larger, as the chart below shows | 6.5GiBmainly block cache;
file page cache is not counted in shared/RSS, so actual RAM is larger, as the chart below shows | 0.02x | 0.19x |
| fillseq scan-omit-valuerestart process with reuse db data of fillseq, scan without access value, benefited by lazy load value (ToplingDB feature) | 132.5MiB | 193.4MiB | 6.4GiB (=readseq) | 6.5GiB (=readseq) | 0.02x | 0.03x |
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.
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.
| benchmark | ToplingDB zipkeyonly ops/sec | ToplingDB zipkeyvalue ops/sec | RocksDB v8.10 ops/sec | RocksDB master (323d915d) ops/sec | zipkeyonly / zipkeyvalue | zipkeyonly / v8.10 | zipkeyonly / master (323d915d) | zipkeyvalue / v8.10 | zipkeyvalue / master (323d915d) |
| fillrandom | 958993 | 934932 | 575467 | 606441 | 1.03x | 1.67x | 1.58x | 1.62x | 1.54x |
| compact | 1/32.3s | 1/80.2s | 1/61.4s | 1/73.0s | 2.49x | 1.90x | 2.26x | 0.77x | 0.91x |
| readseq | 24732695 | 16576375 | 10394918 | 7673937 | 1.49x | 2.38x | 3.22x | 1.59x | 2.16x |
| readrandom | 3849959 | 1368559 | 302292 | 314096 | 2.81x | 12.74x | 12.26x | 4.53x | 4.36x |
Comparison: db_bench fillseq suite (perf)
Same as fillrandom. 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.
| benchmark | ToplingDB zipkeyonly ops/sec | ToplingDB zipkeyvalue ops/sec | RocksDB v8.10 ops/sec | RocksDB master (323d915d) ops/sec | zipkeyonly / zipkeyvalue | zipkeyonly / v8.10 | zipkeyonly / master (323d915d) | zipkeyvalue / v8.10 | zipkeyvalue / master (323d915d) |
| fillseq | 2268937 | 2249780 | 2598438 | 2400493 | 1.01x | 0.87x | 0.95x | 0.87x | 0.94x |
| compact | 1/42.0s | 1/134.3s | 1/38.3s | 1/40.1s | 3.20x | 0.91x | 0.96x | 0.29x | 0.30x |
| readseq | 31402261 | 21173637 | 10487156 | 7507466 | 1.48x | 2.99x | 4.18x | 2.02x | 2.82x |
| readrandom | 6638665 | 1120729 | 275302 | 303165 | 5.92x | 24.11x | 21.90x | 4.07x | 3.70x |
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
| benchmark | ToplingDB zipkeyonly ops/sec | ToplingDB zipkeyvalue ops/sec | RocksDB v8.10 ops/sec | zipkeyonly / v8.10 | zipkeyvalue / v8.10 |
| readseq | 38757256 | 39053941 | 10394918 | 3.73x | 3.76x |
| nextwithkey | 39945434 | 40145825 | 10394918 (=readseq) | 3.84x | 3.86x |
scan-omit-value on data from fillseq
| benchmark | ToplingDB zipkeyonly ops/sec | ToplingDB zipkeyvalue ops/sec | RocksDB v8.10 ops/sec | zipkeyonly / v8.10 | zipkeyvalue / v8.10 |
| readseq | 51403098 | 51449327 | 10487156 | 4.90x | 4.91x |
| nextwithkey | 52203264 | 52560041 | 10487156 (=readseq) | 4.98x | 5.01x |
memtablerep_bench: CSPPMemTable advantage
Focus: CSPP (ToplingDB) vs skiplist. Baseline = RocksDB v8.10 skiplist. color sign: ToplingDB is Better/Worse.
| benchmark | metric | CSPP (ToplingDB) | skiplist (ToplingDB) | skiplist (RocksDB v8.10) | CSPP / v8.10 |
| fillrandom | Elapsed time | 37184657 us | 305683098 us | 330611206 us | 0.11x |
| fillrandom | Write throughput | 43.5999 MiB/s | 5.30368 MiB/s | 4.90379 MiB/s | 8.89x |
| fillrandom | write us/op | 0.371847 | 3.05683 | 3.30611 | 0.11x |
| readrandom | Elapsed time | 52622742 us | 394789862 us | 383584378 us | 0.14x |
| readrandom | Read throughput | 30.8089 MiB/s | 4.10661 MiB/s | 4.22657 MiB/s | 7.29x |
| readrandom | read us/op | 0.526227 | 3.9479 | 3.83584 | 0.14x |
History
- 2026-08-18 15:53:23+00:00 — plain run_id=32148249444 — result table
- 2026-08-16 17:28:08+00:00 — plain run_id=31957895530 — result table
- 2026-08-16 04:43:40+00:00 — plain run_id=31921183844 — result table
- 2026-08-16 03:27:00+00:00 — plain run_id=31918647193 — result table
- 2026-08-16 02:07:06+00:00 — plain run_id=31914258669 — result table
- 2026-08-16 00:41:41+00:00 — plain run_id=31914256719 — result table
- 2026-08-15 18:00:11+00:00 — plain run_id=31896896755 — result table
- 2026-08-15 14:01:09+00:00 — plain run_id=31884049900 — result table
- 2026-08-15 13:08:09+00:00 — dcompact run_id=31880805602 — result table
- 2026-08-15 11:25:39+00:00 — plain run_id=31873946138 — result table
- 2026-08-15 10:07:47+00:00 — dcompact run_id=31873910431 — result table
- 2026-08-15 06:19:56+00:00 — plain run_id=31866312589 — result table
- 2026-08-14 15:45:19+00:00 — dcompact run_id=31800981467 — result table
- 2026-08-14 14:00:45+00:00 — plain run_id=31800922314 — result table
- 2026-08-14 12:01:06+00:00 — dcompact run_id=31787128815 — result table
- 2026-08-14 10:14:47+00:00 — plain run_id=31787125871 — result table
- 2026-08-09 17:28:01+00:00 — dcompact run_id=31324418704 — result table
- 2026-08-09 10:21:07+00:00 — dcompact run_id=31303589765 — result table
- 2026-08-09 09:29:35+00:00 — dcompact run_id=31298143542 — result table
- 2026-08-09 07:40:13+00:00 — plain run_id=31298142068 — result table
- 2026-08-08 13:03:29+00:00 — plain run_id=31252003395 — result table
- 2026-08-08 11:48:09+00:00 — dcompact run_id=31251963803 — result table
- 2026-08-08 09:12:52+00:00 — plain run_id=31247301157 — result table
- 2026-08-08 03:43:31+00:00 — plain run_id=31234948599 — result table
- 2026-08-07 23:42:24+00:00 — plain run_id=31220758079 — result table
- 2026-08-07 22:21:52+00:00 — plain run_id=31218150702 — result table
- 2026-08-07 17:54:24+00:00 — plain run_id=31199586368 — result table
- 2026-08-07 16:10:39+00:00 — plain run_id=31191036555 — result table