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
| OS | Ubuntu 24.04.5 LTS |
| Kernel | 6.17.0-1022-azure |
| CPU | AMD EPYC 7763 64-Core Processor |
| Logical CPUs | 4 |
| Memory | 15.6GiB |
| /dev/shm | 11.7GiB |
| RocksDB block cache | 7.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.
| workload | ToplingDB zipkeyonly | ToplingDB zipkeyvalue | RocksDB v8.10 | RocksDB master (db114777) | zipkeyonly / v8.10 (space) | zipkeyvalue / v8.10 (space) |
| fillrandom suite | 2.3GiB | 1.0GiB | 1.9GiB | 1.9GiB | 1.24x | 0.56x |
| fillseq suite | 3.2GiB | 1.4GiB | 1.6GiB | 1.6GiB | 1.97x | 0.87x |
| fillseq suite (CSPP) | 3.2GiB | 1.5GiB | n/a | n/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).
| workload | ToplingDB zipkeyonly | ToplingDB zipkeyvalue | RocksDB v8.10 | RocksDB master (db114777) | zipkeyonly / v8.10 (RSS) | zipkeyvalue / v8.10 (RSS) |
| fillrandom suite peak | 2.2GiB | 2.2GiB | 2.1GiB | 2.1GiB | 1.05x | 1.06x |
| fillrandom suite readrandompeak RSS during the readrandom stage of the fillrandom suite | 133.4MiBNot include (value's) shared RSS — mmap slice as source → direct → user slice as target ^^^^^^^^^^ ^^^^^^ not zipped not touched not bring to shared RSS | 388.7MiBInclude (value's) shared RSS — mmap slice as source → decompress → user slice as target ^^^^^^^^^^ ^^^^^^^^^^ zipped read source bring mmap to shared RSS | 2.1GiBmainly block cache;
file page cache is not counted in shared/RSS, so actual RAM is larger, as the chart below shows | 2.1GiBmainly block cache;
file page cache is not counted in shared/RSS, so actual RAM is larger, as the chart below shows | 0.06x | 0.18x |
| fillrandom scan-omit-valuerestart process with reuse db data of fillrandom, scan without access value, benefited by lazy load value (ToplingDB feature) | 129.3MiB | 143.0MiB | 2.1GiB (=readseq) | 2.1GiB (=readseq) | 0.06x | 0.07x |
| fillseq suite peak | 1.9GiB | 1.9GiB | 3.2GiB | 3.3GiB | 0.59x | 0.59x |
| fillseq suite readrandompeak RSS during the readrandom stage of the fillseq suite | 141.8MiBNot include (value's) shared RSS — mmap slice as source → direct → user slice as target ^^^^^^^^^^ ^^^^^^ not zipped not touched not bring to shared RSS | 726.5MiBInclude (value's) shared RSS — mmap slice as source → decompress → user slice as target ^^^^^^^^^^ ^^^^^^^^^^ zipped read source bring mmap to shared RSS | 3.2GiBmainly block cache;
file page cache is not counted in shared/RSS, so actual RAM is larger, as the chart below shows | 3.3GiBmainly block cache;
file page cache is not counted in shared/RSS, so actual RAM is larger, as the chart below shows | 0.04x | 0.22x |
| fillseq scan-omit-valuerestart process with reuse db data of fillseq, scan without access value, benefited by lazy load value (ToplingDB feature) | 125.4MiB | 147.1MiB | 3.2GiB (=readseq) | 3.3GiB (=readseq) | 0.04x | 0.04x |
| fillseq suite (CSPP) peak | 2.4GiB | 2.5GiB | n/a | n/a | — | — |
| fillseq suite (CSPP) readrandompeak RSS during the readrandom stage of the fillseq suite (CSPP) | 129.9MiBNot include (value's) shared RSS — mmap slice as source → direct → user slice as target ^^^^^^^^^^ ^^^^^^ not zipped not touched not bring to shared RSS | 739.0MiBInclude (value's) shared RSS — mmap slice as source → decompress → user slice as target ^^^^^^^^^^ ^^^^^^^^^^ zipped read source bring mmap to shared RSS | n/amainly block cache;
file page cache is not counted in shared/RSS, so actual RAM is larger, as the chart below shows | n/amainly block cache;
file page cache is not counted in shared/RSS, so actual RAM is larger, as the chart below shows | — | — |
| fillseq scan-omit-value (CSPP)restart process with reuse db data of fillseq (CSPP), scan without access value, benefited by lazy load value (ToplingDB feature) | 125.2MiB | 149.2MiB | n/a | n/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.
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 (db114777) ops/sec | zipkeyonly / zipkeyvalue | zipkeyonly / v8.10 | zipkeyonly / master (db114777) | zipkeyvalue / v8.10 | zipkeyvalue / master (db114777) |
| fillrandom | 1656161 | 1660002 | 664354 | 746169 | 1.00x | 2.49x | 2.22x | 2.50x | 2.22x |
| compact | 1/24.6s | 1/34.6s | 1/21.6s | 1/36.2s | 1.41x | 0.88x | 1.47x | 0.62x | 1.04x |
| readseq | 25401586 | 16936378 | 10771647 | 7480132 | 1.50x | 2.36x | 3.40x | 1.57x | 2.26x |
| readrandom | 4720755 | 1735572 | 348705 | 378878 | 2.72x | 13.54x | 12.46x | 4.98x | 4.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.
| benchmark | ToplingDB zipkeyonly ops/sec | ToplingDB zipkeyvalue ops/sec | RocksDB v8.10 ops/sec | RocksDB master (db114777) ops/sec | zipkeyonly / zipkeyvalue | zipkeyonly / v8.10 | zipkeyonly / master (db114777) | zipkeyvalue / v8.10 | zipkeyvalue / master (db114777) |
| fillseq | 3569162 | 3653355 | 2562836 | 2384858 | 0.98x | 1.39x | 1.50x | 1.43x | 1.53x |
| compact | 1/20.8s | 1/64.2s | 1/19.0s | 1/21.3s | 3.09x | 0.91x | 1.03x | 0.30x | 0.33x |
| readseq | 30650777 | 20919696 | 10767656 | 7463595 | 1.47x | 2.85x | 4.11x | 1.94x | 2.80x |
| readrandom | 6679984 | 1416203 | 319537 | 360922 | 4.72x | 20.91x | 18.51x | 4.43x | 3.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.
| benchmark | ToplingDB zipkeyonly ops/sec | ToplingDB zipkeyvalue ops/sec | RocksDB v8.10 ops/sec | RocksDB master (db114777) ops/sec | zipkeyonly / zipkeyvalue | zipkeyonly / v8.10 | zipkeyonly / master (db114777) | zipkeyvalue / v8.10 | zipkeyvalue / master (db114777) |
| fillseq | 3283634 | 3336748 | 2562836 | 2384858 | 0.98x | 1.28x | 1.38x | 1.30x | 1.40x |
| compact | 1/20.9s | 1/65.4s | 1/19.0s | 1/21.3s | 3.13x | 0.91x | 1.02x | 0.29x | 0.33x |
| readseq | 29762436 | 20631326 | 10767656 | 7463595 | 1.44x | 2.76x | 3.99x | 1.92x | 2.76x |
| readrandom | 6817154 | 1317202 | 319537 | 360922 | 5.18x | 21.33x | 18.89x | 4.12x | 3.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
| benchmark | ToplingDB zipkeyonly ops/sec | ToplingDB zipkeyvalue ops/sec | RocksDB v8.10 ops/sec | zipkeyonly / v8.10 | zipkeyvalue / v8.10 |
| readseq | 38617105 | 38758608 | 10771647 | 3.59x | 3.60x |
| nextwithkey | 39781868 | 40069046 | 10771647 (=readseq) | 3.69x | 3.72x |
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 | 50763895 | 50832586 | 10767656 | 4.71x | 4.72x |
| nextwithkey | 50830571 | 52117481 | 10767656 (=readseq) | 4.72x | 4.84x |
scan-omit-value on data from fillseq (CSPP)
| benchmark | ToplingDB zipkeyonly ops/sec | ToplingDB zipkeyvalue ops/sec | RocksDB v8.10 ops/sec | zipkeyonly / v8.10 | zipkeyvalue / v8.10 |
| readseq | 50987994 | 51024885 | 10767656 | 4.74x | 4.74x |
| nextwithkey | 51673658 | 51867166 | 10767656 (=readseq) | 4.80x | 4.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.
| benchmark | metric | OffsetSkipList (ToplingDB) | CSPP (ToplingDB) | skiplist (ToplingDB) | skiplist (RocksDB v8.10) | OffsetSkipList / v8.10 | CSPP / v8.10 |
| fillrandom | Elapsed time | 255690963 us | 34713838 us | 286876829 us | 312004833 us | 0.82x | 0.11x |
| fillrandom | Write throughput | 6.34065 MiB/s | 46.7032 MiB/s | 5.65137 MiB/s | 5.19622 MiB/s | 1.22x | 8.99x |
| fillrandom | write us/op | 2.55691 | 0.347138 | 2.86877 | 3.12005 | 0.82x | 0.11x |
| readrandom | Elapsed time | 312504318 us | 44104344 us | 347456694 us | 339235319 us | 0.92x | 0.13x |
| readrandom | Read throughput | 5.18792 MiB/s | 36.7593 MiB/s | 4.66604 MiB/s | 4.77912 MiB/s | 1.09x | 7.69x |
| readrandom | read us/op | 3.12504 | 0.441043 | 3.47457 | 3.39235 | 0.92x | 0.13x |
History
- 2026-09-15 07:18:23+00:00 — plain run_id=34935695406 — result table
- 2026-09-14 06:56:05+00:00 — plain run_id=34809394323 — result table
- 2026-09-13 18:28:04+00:00 — plain run_id=34770497158 — result table
- 2026-09-13 00:02:25+00:00 — plain run_id=34722719277 — result table
- 2026-09-12 19:11:46+00:00 — plain run_id=34708681171 — result table
- 2026-09-12 15:43:43+00:00 — plain run_id=34698861539 — result table
- 2026-08-31 15:48:30+00:00 — plain run_id=33404363930 — result table
- 2026-08-30 11:14:25+00:00 — plain run_id=33306036311 — result table
- 2026-08-23 16:20:05+00:00 — plain run_id=32643128750 — result table
- 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