KynetraDB benchmark ledger

Benchmarks

Each result below states what was measured, how, and what it does not show. Numbers come from the dated benchmark ledger committed alongside the engine — not from a marketing deck. Where a ship-gate was not met, it is on this page next to the win, not in a footnote.

0.13%SPANN resident vs raw f32
0.9950Caustic recall@10 · 768-dim
3.0 msRam tenant read @ 1M corpus
0.80Large-filter recall@10 native

Raw artifacts

Every claim, and the file it came from

Each row is a claim this site is allowed to make, the artifact it was measured into, and the limitation that artifact states about itself. The build fails if a page publishes a figure that is not in this table. Gates that were missed are listed beside gates that were met.

ClaimGateScopeArtifact
BM25 top-24 query p99 of 2.305 ms over 5,000,000 documents, against a declared gate of 8 ms.Synthetic corpus (12 common + 12 medium + 4 rare tokens per document, 26.1k vocabulary). The artifact states that labelled-corpus relevance — real NDCG against human judgements — remains open.metlocalApple M5, 32 GB RAM2026-07-12-bm25-scale.json
BM25 top-24 query p50 of 0.025 ms over 100,000 documents at 19,103 queries/second, single thread.Fidelity NDCG@10 against the exhaustive scorer is 0.9983 at this scale, not 1.0 — the artifact attributes the gap to float-summation-order tie reordering (~1e-7 score differences on tied documents), reaching 1.0 at 1M and 5M.metlocalApple M5, 32 GB RAM2026-07-12-bm25-scale.json
HNSW indexed vector search over 1,000,000 vectors at 384 dimensions: query p99 of 0.514 ms at recall@10 of 0.999, against a declared gate of p99 under 5 ms at recall@10 of at least 0.95.Corpus is a 1024-centre Gaussian mixture at sigma 0.15, chosen to model real embedding cluster structure. Recall is measured against brute-force cosine, which is the oracle rather than the product. On a uniform-random corpus with no distance contrast the same index recalls 0.0485 — that run is published separately.metlocalApple M5, 32 GB RAM2026-07-12-vector-scale.json
On a uniform-random corpus — no cluster structure, no distance contrast — the same 1M-vector index recalls 0.0485 at k=10 and misses its gate.This is the adversarial case, published deliberately. Approximate nearest-neighbour search degrades to noise when the corpus has no structure to approximate. Real embeddings cluster; uniform-random vectors do not.missedlocalApple M5, 32 GB RAM2026-07-12-vector-scale-uniform-adversarial.json
Durable writes at 189,065 operations/second with 64 concurrent clients, p99 of 1.299 ms, in strict group-commit mode acknowledging after fsync(2) — against a declared gate of p99 under 1.5 ms.A durability number means nothing without its sync primitive. This figure is os_fsync — fsync(2), the primitive Postgres and SQLite default to on macOS. The stronger F_BARRIERFSYNC (110,464/s) and F_FULLFSYNC (14,005/s) modes are in the same artifact and are slower.metlocalApple M5, 32 GB RAM2026-07-12-durable-write-wal-v3.json
Replica staleness of 5 ms at p50 and 17 ms at p99, with replica lag at 0 records for both p50 and p99, under 16 concurrent writers.Two engines on one host over the engine path — the HTTP wire is covered separately by the server smoke test, not by this run. Staleness is the age of the oldest unapplied record at each 50 ms poll. A network between the nodes will add to it.no gate declaredlocalApple M5, 32 GB RAM2026-07-12-replication-lag.json
Point-read p99 under a 32-writer storm stays within 2x of the quiescent read p99.MVCC read path under concurrent write pressure on a single host.metlocalApple M5, 32 GB RAM2026-07-12-read-under-write-storm.json
RaBitQ quantization holds recall@10 at 0.995 on a 768-dimension corpus while storing 101.5 bytes per vector — 30.3x smaller than f32.Measured against an f32 brute-force oracle on the same corpus built once and reused across all four codecs — an A/B, not four independent runs. Bytes per vector come from the codec’s own encoder, not a formula. Whole-search throughput is lower than f32 at this posting length; the win is memory, not latency.no gate declaredlocalCortex-X925, 121 GB RAM2026-07-26-linux-caustic-subbit.json
Binary quantization recovers recall@10 to 0.9855 at the default 4x over-fetch, but only with exact rerank, which is mandatory in this mode.Raw 1-bit Hamming routing recalls about 0.20 before rerank. The artifact states plainly that the memory and build-time wins are real and large, but the speed half of the industry’s "32x memory / 40x speed" framing does not carry over end-to-end once recall-protecting rerank and wider over-fetch are paid for — only the raw distance primitive is faster.partiallocalCortex-X925, 121 GB RAM2026-07-24-linux-binary-quantization.json
int8 quantization meets its memory and latency targets at both measured scales, and its recall gate at 100k — but misses that gate at 1M on the default search path.The 1M recall miss is recorded in the artifact under recall_gate_at_scale. It is not fixed.partiallocalCortex-X925, 121 GB RAM2026-07-24-linux-int8-quantization.json
Disk-resident entity store serving at 100,000,000 entities against gates of RSS under 14 GB, boot under 30 s, and get p99 under 1 ms.Single host. WAL is trimmed above the projection watermark every 10M writes.no gate declaredlocalApple M5, 32 GB RAM2026-07-12-disk-store-100m.json
Semi-synchronous quorum commit measured across three processes on one host over loopback.Three processes, one host, loopback networking. This does not measure quorum commit across a real network, which is where the interesting failures live.no gate declaredlocalApple M5, 32 GB RAM2026-07-13-quorum-commit.json
Serving SPANN postings from mmap at query time drops resident memory from about 16.4% of raw f32 to 0.13% — roughly 125x less — with byte-identical search results.Resident memory drops; total I/O does not. The bytes are still read — they become the kernel’s problem rather than the heap’s, so behaviour depends on page-cache pressure. The byte figure is for one 50,000 x 64 corpus and is not a per-vector constant. No latency claim is attached, because none was measured in that run.metlocalCortex-X925, 121 GB RAMkynetra-benchmark-ledger.md
Server-side /v1/collections responds at p50 1.0 ms and p95 1.4 ms over 20 samples with no network in the path.End-to-end latency was not cleanly measurable for this change: p50 read 0.251 s pre-deploy and 0.286 s post-deploy over 12 samples each, a difference that is noise rather than a regression — both runs contain a roughly 2.4 s cold outlier and the path crosses two networks. No engine-level catalog speed win is claimed, because none was measured.no gate declaredlocalDigitalOcean droplet, blr1kynetra-benchmark-ledger.md
A per-kind id posting index makes tenant-scoped reads flat: 4.5 ms falls to 3.0 ms in RAM and stays flat as the background corpus grows, against 5.0 ms rising to 82.5 ms with the index off.The index-off arm grows linearly with total corpus size (14.5-17.5x in RAM, 40-49x on disk) because a bare Filter::Kind was not index-answerable. The disk arm with the index on is monotone 1.90-2.37x, not flat — the flat result is the RAM arm only.metlocalCortex-X925, 121 GB RAMkynetra-benchmark-ledger.md
Filtered vector search measured across selectivities from 0.1% to 10%, before and after the W1 optimisation, back-to-back under matched conditions.The artifact records that the host was under background load during this session — load average roughly 4 to 9 on 20 logical CPUs, from an unrelated local inference server and editor processes. Absolute latencies run higher than a quiet capture. Each before/after pair was re-run back-to-back in the same session so the comparison holds even though the absolutes are inflated.no gate declaredlocalCortex-X925, 121 GB RAM2026-07-24-linux-filtered-vector-AFTER-W1.json
Filtered vector search baseline before the W1 optimisation: unfiltered reference p99 of 0.382 ms at recall@10 of 1.0, degrading to a p99 of 8.075 ms and recall@10 of 0.004 once a 0.1% selectivity filter is applied.The artifact declares itself a baseline with no gate — it is the pre-optimisation number the W1 work must beat. The recall collapse to 0.004 at 0.1% selectivity is the finding, not a footnote: at that selectivity the HNSW graph returns almost none of the true nearest neighbours that satisfy the filter. Published because the tenant-scoped RAG case is exactly this shape.no gate declaredlocalCortex-X925, 121 GB RAM2026-07-24-linux-filtered-vector-baseline.json
One million entities resident in 7,514 MB of RSS — about 7,874 bytes per entity — loading in 40.6 s and booting from checkpoint in 14.2 s.Stage A of a memory-ceiling suite, on one host with 32 GB of RAM. The artifact extrapolates a ceiling of roughly 1.9 million entities on a 16 GB host from a single measured point; that extrapolation is arithmetic, not a measurement, and is not published as a figure here.no gate declaredlocalApple M5, 32 GB RAM2026-07-12-memory-ceiling-stage-a.json

Tidewater · 2026-07-27

SPANN postings served from mmap at query time

The disk tier stops being paid for in RAM. Settled postings are served zero-copy from mmap at query time, so the page cache is the tier and the process heap holds only the centroid navigator, centroid vectors, per-posting headers and the live memtable.

MeasureBefore (RAM HashMap)After (mmap at query time)Change
Resident memory, as % of raw f32~16.4%0.13%~125x less
Resident bytes, 50,000 x 64 vectors16,400 bytes
Search resultsbaselinebyte-identicalno recall change

Method

The rmp_serde posting blob was replaced with a raw fixed-stride layout (SPP1 header plus packed_bits / corrections / residual_norms / id_offsets / id_blob). A serialized blob must be fully deserialized to read one row, so offset-addressable rows are the precondition for zero-copy. Readers Arc-clone posting handles under a short read lock then scan lock-free; postings are immutable per epoch and flush maps only after fsync, with the manifest as the commit point.

Meridian · 2026-07-27

Per-kind index: tenant-scoped reads go flat

A tenant-scoped list is filter(Filter::Kind("t_<pid>___...")), but abare Filter::Kind was not index-answerable, so a scoped read cost O(all tenants' data). A per-kind id posting index now answers it directly.

Armp50 at 10k backgroundp50 at 1M backgroundShapevs index-off at 1M
Ram, index on4.5 ms3.0 msflat (growth ≤ 1.00x)~28x faster
Ram, index off5.0 ms82.5 mslinear (14.5–17.5x)baseline
Disk, index on6.8 ms13.6 msmonotone 1.90–2.37x~33x faster
Disk, index off9.1 ms443 mslinear (40–49x)baseline

Method

Release build. A fixed 10,000-entity tenant-A corpus, with the background corpus scaled 10k → 1M. The axis is background corpus size; the baseline is the same engine with the index flag off. Both arms measured in the same run.

Ship-gates, reported as measured

Caustic · 2026-07-26

Sub-bit residual quantization

The sub-bit tier of the Prism density ladder: k-means residual coding, where the Beacon centroid doubles as the compression predictor, plus orthonormal projection to dim/shrink and a RaBitQ-style 1-bit sign code with unbiased estimation.

Codecrecall@10Amortized B/vectorvs f32Recall per byte
Caustic, shrink=20.995057.553.4x1.76x better than RaBitQ
Prism-R (RaBitQ)baseline

Method

Measured at 768 dimensions on a 10,000-vector clustered corpus, 100 queries. The axis is amortized bytes per vector; the baseline is Prism-R (RaBitQ) measured in the same harness. "1.76x better recall-per-byte" is a figure-of-merit ratio against that RaBitQ baseline, not a speed claim.

Lodestar · 2026-07-27

SPANN large-filter native scan

SPANN filtered search dispatches on filter size: small filters take an exact branch, large ones a predicate-during-scan branch. Because the engine resolves small filters with its own scan, the large branch is the only one production reaches — and it was the one without coverage.

Strategyrecall@10BudgetHolds across
Native predicate-during-scan0.80equalRaBitQ and Caustic
Post-filtering0.14equalRaBitQ and Caustic

Method

Measured on the large-filter branch — the path production actually takes — at an equal scan budget for both strategies. The comparison axis is recall@10 at fixed budget; the baseline is equal-budget post-filtering.

How to read these numbers

Every multiple names its axis

"~125x less" means resident memory as a fraction of raw f32, against the previous RAM HashMap. "~28x" means p50 tenant-scoped read latency at 1M background entities, against the same engine with the index off. A multiple without both is not a result.

Synthetic corpora are labelled

The Caustic and Lodestar figures are from synthetic corpora and say so. Real-embedding validation for Caustic is pending. A number measured on generated data is evidence about the engine only once the generator has been ruled out as the thing being measured.

Unmet gates stay visible

The Disk variance gate was not met and the Disk per-kind index is default-off as a result. That is on this page, in the same section as the 33x figure, because a caveat nobody reads is not a caveat.