library · head to head

against the field.

Four engines at one commit: the campaign behind this site's numbers.

5 min read · 1,018 words · commit fd1b95c · filed as “Website benchmark refresh”

These runs measure 3935977707444665a083ab2e6f9a7a914ea52d1b with KibanOptions::agent_memory-equivalent settings (point index on, scan_prefix_len = 18). The earlier reports stay valid for their own revisions. Numbers here are not comparable to them across host intervals.

Method

  • Reads: 1M records, 100k calls per stage, five rotated trials, CPU 10 only. campaign.py reuses the runner in tools/agentbench/readpath/rocksdb_bench.py, with full-value verification, full-population checks before and after, and receipts.
  • Durable writes: 10k-record base, 1k calls per stage, five rotated trials, reopened and verified.
  • Engines: kiban, RocksDB 11.8.1 with the frozen winner in validation/rocksdb/raw/selection.json (Ribbon, 16 KiB blocks, total-order seek), bundled SQLite (rowid, WALWALWrite-ahead log. Every change is appended here first, so it can be replayed after a crash., 1 GiB mmap for reads, synchronous=FULL for durable writes), and the existing LMDB control.
  • Ratios are medians of same-trial ratios. Above 1 favors kiban. min and max are the trial range. A range that spans 1 is reported as even.
  • Group commit: group_commit.py, the published matrix, 100 verified runs on CPUs 0,1,2,5.
  • Long runs: tools/compare/plans/scale.json, three trials per engine, CPUs 0-11. The plan's kiban pin moved to this commit through compare-main.patch. All 18 runs are valid.
  • Sync audit: raw/sync-probe. kiban 2,102 fdatasync, RocksDB 2,107 fdatasync, LMDB 2,101 fdatasync, SQLite 2,113 fsyncfsyncForces a file and its metadata onto the disk..

Scoreboard

Median latency or throughput of kiban and the selected engine per workload, with p99 and the paired ratio between them.
workload kiban RocksDB← RocksDB faster1×kiban faster →
reads
point read1M records1.09 µsp99 1.57 µs2.75 µsp99 4.61 µs
latest ten1M records, one agent1.95 µsp99 2.62 µs8.19 µsp99 12 µs
point read, small cache32 MiB cache, mmap on1.25 µsp99 2.24 µs6.53 µsp99 12 µs
latest ten, small cache32 MiB cache, mmap on3.39 µsp99 5.25 µs8.45 µsp99 13 µs
durable writes
new recordsynced before return492 µsp99 2.0 ms500 µsp99 1.7 ms
updatesynced before return500 µsp99 1.7 ms483 µsp99 1.5 ms
16 concurrent writersgroup commit, every write verified14.1Kwrites/s · p99 3.0 ms12.8Kwrites/s · p99 2.7 ms

p50p50The median: half of all operations were faster than this. and p99p9999% of operations were faster than this. It shows how bad the slow cases get. in µs, or writes/s for the writer row. Normal layout, default cache unless noted.

RowkibanRocksDBratio [range]SQLiteratio [range]LMDBratio [range]
point read1.09 / 1.572.75 / 4.612.581 [2.389, 2.706]1.92 / 2.751.871 [1.556, 1.967]1.34 / 1.951.258 [1.083, 1.41]
latest ten1.95 / 2.628.19 / 12.034.242 [4.066, 4.852]9.47 / 13.064.852 [4.485, 5.246]2.43 / 3.581.241 [1.182, 1.344]
point read, small cache1.25 / 2.246.53 / 11.525.158 [4.533, 5.368]1.92 / 2.501.5 [1.289, 1.641]1.34 / 1.821.053 [0.911, 1.237]
latest ten, small cache3.39 / 5.258.45 / 12.802.462 [2.357, 2.593]9.47 / 13.822.741 [2.642, 2.792]2.43 / 3.900.698 [0.685, 0.75]
new record492 / 2,032500 / 1,7370.984 [0.931, 1.052]541 / 2,2281.111 [1.1, 1.138]1,049 / 2,9492.159 [2.133, 2.172]
update500 / 1,704483 / 1,5401.0 [0.833, 1.065]492 / 1,5071.0 [0.97, 1.065]1,081 / 2,9492.169 [2.098, 2.258]
16 concurrent writers14,101 / 3,00112,830 / 2,7101.095 [1.087, 1.33]1,451 / 279,9869.892 [9.718, 10.254]——

Writer sweep

writes per second, every one synced

1 writer1 of 5
kiban1,655p99 2.0 ms · 4,000 syncs
RocksDB1,788p99 1.6 ms · 4,000 syncs
SQLite1,399p99 2.1 ms · 4,044 syncs
kiban, ungrouped1,754p99 1.5 ms · 4,000 syncs

Median writes/s, p99 µs, and syncs per 4,000 writes.

Writerskiban groupRocksDBkiban ungroupedSQLite
11,655 / 1,983 / 4,0001,788 / 1,614 / 4,0001,754 / 1,464 / 4,0001,399 / 2,142 / 4,044
22,534 / 2,465 / 2,6862,704 / 2,725 / 2,4621,948 / 3,688 / 4,0001,463 / 24,996 / 4,035
44,066 / 2,936 / 1,6164,652 / 2,736 / 1,4001,897 / 9,555 / 4,0001,436 / 58,384 / 4,035
87,065 / 2,736 / 9017,841 / 2,799 / 7791,882 / 22,466 / 4,0001,438 / 130,072 / 4,032
1614,101 / 3,001 / 48012,830 / 2,710 / 4821,836 / 44,352 / 4,0001,451 / 279,986 / 4,032

Long runs

t + 0.0 s36× speed

100k hot keys within 1M, four threads. Operations completed over time; the finish line is 100M.

kiban 39359770ready
RocksDB 11.8.10ready

kiban finished 6 min 10 s ahead. The default point index costs this small-cache run half its speed: with it off, kiban reached 3.8M ops/s.

Median ops/s of three trials, with the range.

CasekibanRocksDB
read-100m1,743,364 (1,619,380–1,755,896)233,765 (223,640–285,517)
updates-10m387,251 (371,227–602,969)1,025,096 (918,013–1,038,579)
write-10m83,711 (82,640–163,261)285,817 (247,390–289,857)

Resources

Peak RSSRSSResident set size: the physical memory a process is actually using. and logical disk in MiB, 1M records, normal layout.

EngineRSSDisk
kiban450352
rocksdb356304
sqlite349315
lmdb839799

Point index cost at a small cache

read-100m is lower than the v0.1.0 report on the same plan: kiban about 1.74M vs 2.90M ops/s. Mains power, the performance profile and CPU pinning do not change it. Rebuilding tools/compare with point_index: false and running the plan three more times gives 3.71M–3.88M ops/s, p50 0.94–0.99 µs, and a 153 MB database, against 182 MB with the index.

Raw summaries are in point-index-probe/. The default-on index therefore costs this 33 MiB-cache workload more than half its throughput. The mechanism is not profiled.

Deviations and limits

  • All accepted results ran on mains power with the performance platform profile, on a shared laptop with a browser and video playback open.
  • RocksDB's screen was reused, not rerun. Its code did not change between campaigns.
  • The bulk 32 MiB RocksDB rows are excluded from the board. They reflect cache pressure on one large SST and would overstate the gap. The raw rows are retained.
  • Earlier attempts were discarded: one interrupted by suspend, one on battery where the wall timeout stopped RocksDB, and one complete run on the balanced profile.
  • The long runs have outlier trials: kiban updates-10m 602,969 and write-10m 163,261 ops/s against two trials near 380k and 83k. They are retained; medians are used.
  • Warm cache, one read worker, 200-byte text records. This says nothing about cold reads, many readers or data far larger than memory.