← All comparisons

PERFORMANCE · ARCHITECTURE · COST

Lavik vs Garnet

A stronger read result. A real write-latency tradeoff.

Lavik vs Microsoft Garnet: NVMe SSD GET throughput, honest SET latency tradeoffs, Tsavorite storage differences, and an editable node-cost model.

By the Lavik project · Sources checked: 2026-10-13 · Garnet 2.1.5 · Libaio Storage Tier

SEPTEMBER 18, 2026 · BETA.1

Performance, with the measurements attached

2.13×Lavik / peer GET QPS
3.599 msLavik p99 at that GET point
4.223 msPeer p99 at that GET point

1B keys × 1 KiB values; AMD EPYC 9V74, approximately 126 GiB RAM, six NVMe devices, 16-logical-CPU affinity, pipeline=1. Each point measured once for 60 seconds. Peer controls come from an earlier sweep on the same hosts; beta.1 SPDK points are newly measured. Each operation selects each system's highest-QPS point; connection counts can differ. Method and full report ↗

Peak QPS per operation and latency at that point
WorkloadSystemQPSp99 (ms)p99.9 (ms)Connections
GETLavik 0.1.0-beta.1 SPDK952,5603.5995.535640
GETGarnet 2.1.5 · Libaio Storage Tier446,3664.2239.151320
SETLavik 0.1.0-beta.1 SPDK764,93910.87916.6391280
SETGarnet 2.1.5 · Libaio Storage Tier751,0575.53512.7351280

What this result does—and does not—establish

Garnet's peak SET p99 is 5.535 ms versus Lavik's 10.879 ms. At a p99 ceiling of 2 ms, the best observed SET points are about 584,665 QPS for Garnet and 422,450 for Lavik. Garnet's post-test full key-count scan was not completed; the report discloses that limitation. Its pre-test count passed.

These are Lavik-published benchmarks, not an independent reproduction. Short single-server windows do not establish equal crash durability, long-term steady state, cluster capacity or an application SLA. Match your workload, data distribution and latency budget before using the cost model.

Inspect the full connection and thread sweep
All measured points available to the cost calculator
SystemWorkloadThreads*ConnectionsQPSp99 (ms)
LavikGET1680396,6450.319
LavikGET16160598,4620.503
LavikGET16320792,1190.959
LavikGET16640952,5603.599
LavikGET161280903,0559.279
LavikGET162560801,68034.815
LavikSET1680422,4500.711
LavikSET16160530,6723.759
LavikSET16320621,3736.111
LavikSET16640717,5787.839
LavikSET161280764,93910.879
LavikSET162560727,98418.431
GarnetGET1680218,6772.543
GarnetGET16160393,8283.071
GarnetGET16320446,3664.223
GarnetGET16640404,2765.471
GarnetGET161280398,5037.583
GarnetGET162560352,53315.039
GarnetSET1680424,0721.415
GarnetSET16160584,6651.431
GarnetSET16320701,6872.719
GarnetSET16640737,5264.031
GarnetSET161280751,0575.535
GarnetSET162560720,7409.087

*Thread roles differ: Lavik workers, Redis/Valkey I/O threads, Dragonfly proactors, and Garnet minimum thread-pool threads. CSV ↗

How the storage design affects your application

Garnet uses the Tsavorite hybrid log, with a memory-resident portion and a larger-than-memory storage tier. Lavik uses memory key indexes and its own durable record/collection storage, with SPDK or io_uring I/O. Both offer Redis-style data structures; Garnet should not be described as a string-only database.

The billion-key results make Lavik particularly interesting for read-heavy services: feature retrieval, large caches and profile lookups. A high-rate write service needs a different decision. Garnet's write tail can be lower even when Lavik records slightly more peak SET throughput.

Garnet features and Tsavorite storage ↗ · Lavik beta.1 storage and recovery ↗

FAMILIAR PROTOCOL. NVMe SSD EXECUTION.

The architecture changes. Your application protocol stays familiar.

Lavik is an Apache 2.0 open-source, Redis-compatible key-value store. Memory holds the key index; NVMe SSD holds value data. Worker-local state, coroutines and asynchronous I/O let workers advance other requests while storage completes. SPDK provides a direct NVMe storage path. The September SPDK experiment still uses kernel TCP, not DPDK networking.

01Redis client / RESP
02Worker + DRAM key index
03Asynchronous I/O
04NVMe SSD values

The storage engine covers string, hash, list, set and sorted-set payloads, including grouped collection storage. Key indexes, routing metadata and buffers still consume RAM. String GET/SET benchmarks do not establish the same QPS for other data structures. beta.1 architecture ↗ · Storage and collections ↗ · Apache 2.0 ↗

Same SSD prices can still mean different node counts

ILLUSTRATIVE MODEL · EDIT THE ASSUMPTIONS

Same dataset. Same target QPS. How many nodes?

Defaults assume 1 TiB of values, 1 TiB usable value capacity per primary, 1 million QPS, 70% of observed throughput, two complete copies, and $1,000 per node per month. Both node prices are editable.

Planning estimate assuming linear scaling
SystemSelected QPS / p99Primaries / total nodesAssumed monthly cost
Lavik SPDK952,560 / 3.599 ms2 / 4$4,000
Garnet446,366 / 4.223 ms4 / 8$8,000

Primaries = max(⌈data / usable capacity⌉, ⌈target QPS / (observed QPS × utilization)⌉)

Total nodes = primaries × copies; monthly cost = total nodes × node price. Replicas contribute no extra serving QPS here. Assumes balanced sharding, linearly reusable per-node performance, usable capacity after space/metadata reserves, and sufficient RAM for indexes and buffers; changing per-node data size can change throughput. Replication overhead, post-failure headroom, networking and backups are not modeled. The p99 filter selects observed points; it does not establish a cluster or application SLA, especially P99.99.

When to choose Lavik

Start with Lavik for broad-access, read-dominated workloads whose data exceeds RAM. Use the measured GET advantage to evaluate capacity per server, then include updates, expirations and sustained maintenance in your replay.

When keeping your current system makes sense

Keep Garnet on the shortlist for a write-heavy workload with a tight p99 limit, or if your application depends on its .NET extensibility. The cost calculator can select SET and a 2 ms ceiling so this tradeoff is visible rather than hidden by peak GET numbers.

From evaluation to migration

  1. Inventory commands, data types, scripts and client options against the versioned compatibility coverage. Command reference · Client compatibility
  2. Replay your data distribution, expiry rate and read/write mix on representative NVMe SSD hardware. Compare target p99/p99.9 rather than only peak QPS.
  3. Validate replication, recovery and capacity headroom during failures, then make a small, reversible traffic cutover. Migration and cluster guides

Frequently asked questions

Is Lavik always faster than Garnet?

No. Lavik has the higher peak GET and SET throughput in the September billion-key report, but Garnet has lower p99 at its peak SET point and more qualifying SET throughput under a 2 ms p99 ceiling. Compare the workload and latency target together.

Does Lavik require a new application protocol?

No. Lavik accepts Redis/Valkey-compatible commands, with RESP2 by default and negotiable RESP3. Verify exact behavior against the beta.1 command reference, client compatibility and migration guides; protocol compatibility does not mean every command, module or failover behavior is identical.

How should I use a single-server benchmark for cost planning?

Select an observed point matching your read/write mix and latency budget, then account for both capacity-driven and QPS-driven node counts. Include index memory, replication, headroom and failures in your replay. The page's cost model is an explicit planning illustration, not a measured cluster result or cloud quote.

Sources and versions

Benchmarks are pinned to an upstream commit; product documentation was checked on the date shown. Historical August builds and September beta.1 results retain their own scope and are not combined across experiments.

APACHE 2.0 · REDIS COMPATIBLE · NVMe SSD

Put your workload behind the comparison.