What the total means
Successful primary customer logical calls across all groups divided by the union of their synchronized load intervals, including in-flight tails. Excludes retries, explicit replays, workers, errors, warmup and drain. Percentiles merge bucket counts; they are not averages of group percentiles.
Static tenant-to-group assignment. Each tenant's stores, queues and rankings stay within one independent Raft group. No cross-group transaction or global atomic snapshot in this workload.
- Measured union window
- 60.14 s
- Shared overlap
- 60.05 s
- Start skew
- 1.0 ms
- Actual successful read / mutation mix
- 70.0% / 30.0%
- Correctness
- Passed
Every group keeps its own books.
| Raft group | Partition | Goodput / s | Completed | Failed | Customer p99 | Fresh audit | Quorum recovery | Details |
|---|---|---|---|---|---|---|---|---|
| group-0 | 2 tenantstenant-0, tenant-1 | 11,247.8 | 675,682 | 0 | 252.2 ms | Passed96 / 96 delivered | 617.6 ms | HTML · JSON |
| group-1 | 2 tenantstenant-2, tenant-3 | 11,129.2 | 669,240 | 0 | 237.6 ms | Passed96 / 96 delivered | 647.9 ms | HTML · JSON |
| group-2 | 2 tenantstenant-4, tenant-5 | 11,149.1 | 670,482 | 0 | 239.9 ms | Passed96 / 96 delivered | 567.8 ms | HTML · JSON |
| group-3 | 2 tenantstenant-6, tenant-7 | 11,095.6 | 666,530 | 0 | 262.4 ms | Passed96 / 96 delivered | 635.4 ms | HTML · JSON |
| group-4 | 2 tenantstenant-8, tenant-9 | 11,147.1 | 670,001 | 0 | 247.2 ms | Passed96 / 96 delivered | 555.7 ms | HTML · JSON |
| group-5 | 2 tenantstenant-10, tenant-11 | 11,202.8 | 673,106 | 0 | 244.8 ms | Passed96 / 96 delivered | 621.9 ms | HTML · JSON |
| group-6 | 2 tenantstenant-12, tenant-13 | 11,051.6 | 664,407 | 0 | 262.4 ms | Passed96 / 96 delivered | 568.6 ms | HTML · JSON |
| group-7 | 2 tenantstenant-14, tenant-15 | 11,164.7 | 670,488 | 0 | 230.6 ms | Passed96 / 96 delivered | 745.1 ms | HTML · JSON |
Per-group p99 uses each group's customer histogram. Recovery is measured separately per injected crash; it is not a cluster-wide failover time.
The tail belongs to the customers.
| Customer population | Samples | p50 | p95 | p99 | Maximum |
|---|---|---|---|---|---|
| All customer calls | 5,359,936 | 6.6 ms | 161.2 ms | 247.2 ms | 1,740.7 ms |
| Customer reads | 3,751,020 | 3.0 ms | 32.2 ms | 69.2 ms | 1,740.7 ms |
| Customer mutations | 1,608,916 | 104.0 ms | 219.4 ms | 491.2 ms | 940.6 ms |
Nearest-rank logarithmic histogram upper bounds are approximate (within 1% over the configured normal bucket range). Empty populations stay unavailable. This report never averages p99 values or fabricates missing samples. Customer failures contribute latency observations but zero successful goodput.
Recovery and the full delivery cycle.
Leader failure under customer load
| Group | Crash | Time into load | Leader before → after | Serving quorum | Restarted replica caught up |
|---|---|---|---|---|---|
| group-0 | 1 | 30.01 s | 1 → 3 | 617.6 ms | 4,319.7 ms |
| group-1 | 1 | 30.04 s | 1 → 3 | 647.9 ms | 4,808.2 ms |
| group-2 | 1 | 30.03 s | 1 → 2 | 567.8 ms | 4,260.5 ms |
| group-3 | 1 | 30.02 s | 1 → 2 | 635.4 ms | 4,885.9 ms |
| group-4 | 1 | 30.04 s | 1 → 3 | 555.7 ms | 4,332.5 ms |
| group-5 | 1 | 30.03 s | 1 → 3 | 621.9 ms | 4,879.4 ms |
| group-6 | 1 | 30.01 s | 1 → 3 | 568.6 ms | 4,314.8 ms |
| group-7 | 1 | 30.02 s | 1 → 2 | 745.1 ms | 4,957.8 ms |
A serving quorum can resume before the killed replica rejoins. These polling observations are per group; they do not measure the time until every client succeeds. Missing milestones remain unavailable.
Orders, timers, and safety probes
- Audited orders
- 768
- Audited pizzas
- 1,914
- Exact receipt replay checks
- 160,726
- Expired-lease rejection checks
- 94
- Configured baking delay
- 250.0 ms
- Configured lease duration
- 2,000.0 ms
| Group | Deliveries | Delivery p50 | Delivery p95 | Delivery p99 | Timers | Lateness p95 | Lateness p99 | Replays | Stale leases |
|---|---|---|---|---|---|---|---|---|---|
| group-0 | 96 | 3,629.5 ms | 6,528.4 ms | 6,669.0 ms | 96 | 1,110.0 ms | 1,110.0 ms | 20,215 | 12 |
| group-1 | 96 | 3,157.5 ms | 5,350.3 ms | 5,977.0 ms | 96 | 1,238.0 ms | 1,238.0 ms | 19,959 | 8 |
| group-2 | 96 | 3,157.5 ms | 5,969.2 ms | 7,363.0 ms | 96 | 1,045.0 ms | 1,045.0 ms | 20,265 | 9 |
| group-3 | 96 | 3,702.4 ms | 6,089.2 ms | 7,619.0 ms | 96 | 1,315.4 ms | 1,317.0 ms | 20,094 | 13 |
| group-4 | 96 | 3,852.8 ms | 6,593.7 ms | 8,253.0 ms | 96 | 1,187.0 ms | 1,187.0 ms | 19,958 | 10 |
| group-5 | 96 | 3,739.5 ms | 6,028.9 ms | 8,116.0 ms | 96 | 1,226.9 ms | 1,549.0 ms | 19,946 | 11 |
| group-6 | 96 | 3,702.4 ms | 6,659.6 ms | 7,647.0 ms | 96 | 956.7 ms | 958.0 ms | 20,072 | 17 |
| group-7 | 96 | 3,419.1 ms | 6,463.8 ms | 6,694.0 ms | 96 | 1,114.0 ms | 1,114.0 ms | 20,217 | 14 |
Order-to-delivery includes baking, queueing, abandoned leases, and delivery. Timer lateness measures callback execution after its due time, excluding the configured baking delay. These per-group lifecycle percentiles are separate from customer request latency and are not averaged into a global percentile. Replay and expired-lease probes contribute to correctness checks, not customer goodput. Expected stale-lease rejections appear as HTTP errors in the child reports.
The garden shares a machine.
| Group | Server peak sums, MiB | Node peak, MiB | Sampled server cores | Node load cores | Node user CPU | Node system CPU | Node loop p99 | Rust driver peak, MiB | Rust driver cores | Disk, MiB |
|---|---|---|---|---|---|---|---|---|---|---|
| group-0 | 1,303.2 | 413.0 | 1.26 | 0.05 | 4,319.9 ms | 529.0 ms | 44.5 ms | 24.7 | 0.23 | 534.1 |
| group-1 | 1,256.8 | 384.7 | 1.26 | 0.06 | 4,429.4 ms | 584.7 ms | 45.9 ms | 24.8 | 0.23 | 531.1 |
| group-2 | 1,260.6 | 400.6 | 1.26 | 0.05 | 4,501.1 ms | 587.6 ms | 43.8 ms | 24.9 | 0.22 | 534.1 |
| group-3 | 1,263.2 | 366.2 | 1.24 | 0.05 | 4,345.1 ms | 529.7 ms | 45.3 ms | 25.0 | 0.22 | 536.8 |
| group-4 | 1,246.5 | 378.0 | 1.25 | 0.05 | 4,401.9 ms | 588.1 ms | 47.5 ms | 25.2 | 0.22 | 536.3 |
| group-5 | 1,320.7 | 375.0 | 1.26 | 0.05 | 4,339.5 ms | 592.2 ms | 46.0 ms | 25.2 | 0.23 | 534.1 |
| group-6 | 1,230.2 | 367.7 | 1.25 | 0.05 | 4,323.1 ms | 545.2 ms | 46.2 ms | 25.1 | 0.22 | 537.1 |
| group-7 | 1,329.1 | 367.4 | 1.26 | 0.05 | 4,393.0 ms | 589.1 ms | 46.2 ms | 24.6 | 0.22 | 537.1 |
Each child generator and every replica run on this host. Adding Raft groups adds writer lanes, replication work, drivers, memory, and disk contention; these results do not establish multi-host capacity or linear scaling. Node user/system CPU covers the whole run; Node load cores and optional Rust driver cores cover sampled load intervals. Both processes count toward driver cost. Sampling can miss short peaks; missing measurements are shown as unavailable.
Enough detail to repeat it.
- CPU
- Apple M5 Pro
- OS / architecture
- darwin 27.2.0 / arm64
- Logical CPUs
- 18
- Database processes
- 24
- Generator/controller processes
- 16
- Customer driver
- rust
- Node.js controller
- v26.10.0
- Driver SHA-256
- 1cf843cbf4e064d13a1d3597d9295c509325fee5c74b6eb2242ac7e98ece553d
- Customer loops per group
- 512
- Drone loops per group
- 4
- Tenants per group / stores per tenant
- 2 / 4
- Hot stores per tenant
- 1
- Hot-set mixture weight
- 80.0%
- Read endpoints
- replicas
- Customer read policy
- replica-local
- Application transport
- HTTP/2 · pooled h2c
- Requested load / warmup
- 60.0 s / 1.0 s
- Order cap per group
- 96
- Maximum drain
- 60.0 s
- Initialization
- static
- Binary SHA-256
3b47cf25cfa2a278f6b96e9ab675c70694b1ad4408e6f09a18e2555c0939c9c9- Bundle hash
264f2718f2336ea92b850ec939282695609e4ac929a73006455bf212872473b0- Engine
- quickjs
Hot-set weight is mixed with uniform store selection; it is not the final observed hot-store probability. Tenant selection is spread independently. Each tenant's stores and derived ranking remain in its assigned group. A busy tenant still shares one ordered writer lane; adding unrelated groups does not speed up that tenant's serial mutations.
Customer loops are closed-loop: each waits before issuing its next call. After the order cap, order choices become reads. Compare runs with the same workload, consistency, host, binary, and runtime settings. These are simultaneous independent-group measurements, not a globally atomic transaction or snapshot benchmark.
Runtime settings and complete workload options
{
"runtime": {
"engine": "quickjs",
"settings": {
"TOKIO_WORKER_THREADS": "2",
"FLOWER_WRITER_BATCH_MODE": "adaptive",
"FLOWER_WRITER_QUEUE_CAPACITY": "1024",
"FLOWER_QUERY_WORKERS": "16",
"FLOWER_PREPARATION_WORKERS": "16",
"FLOWER_WRITER_PREPARATION_WORKERS": "1",
"FLOWER_WRITER_BATCH_MS": "200",
"FLOWER_OTEL_ENABLED": "0",
"OTEL_SDK_DISABLED": "true"
}
},
"environment": {
"node": "v26.10.0",
"os": "darwin 27.2.0",
"arch": "arm64",
"cpu": "Apple M5 Pro",
"logicalCpus": 18,
"colocatedNodes": 24,
"replicasPerGroup": 3,
"colocatedDrivers": 16,
"colocatedControllers": 8,
"colocatedNativeDrivers": 8
},
"options": {
"offeredRate": 0,
"groups": 8,
"tenants": 2,
"duration": 60,
"warmup": 1,
"drain": 60,
"concurrency": 512,
"workers": 4,
"shops": 4,
"hotShops": 1,
"hotProbability": 0.8,
"maxOrders": 96,
"bakeMs": 250,
"leaseMs": 2000,
"duplicateRate": 0.1,
"abandonRate": 0.1,
"pollMs": 150,
"requestTimeoutMs": 2000,
"retryBudgetMs": 15000,
"nodes": 3,
"seed": "42",
"initialization": "static",
"queryRouting": "replicas",
"readConsistency": "replica-local",
"driver": "rust",
"driverBinary": "/Users/pcarrier/src/flower/target/release/flower-bench-driver",
"binary": "/Users/pcarrier/src/flower/target/release/flower",
"json": "/Users/pcarrier/src/flower/bench/results/latest.json",
"html": "/Users/pcarrier/src/flower/bench/results/latest.html",
"baseline": null,
"cpuProfile": null,
"chaos": true,
"http2": true,
"keepData": false,
"help": false
}
}Group failures and replica routing
[
{
"group": "group-0",
"failures": [],
"queryRouting": {
"mode": "replicas",
"consistency": "replica-local",
"auditConsistency": "fresh",
"nodes": [
{
"id": 1,
"url": "http://127.0.0.1:51182",
"attempts": 153721,
"completed": 152378,
"failures": 1343
},
{
"id": 2,
"url": "http://127.0.0.1:51190",
"attempts": 167854,
"completed": 167854,
"failures": 0
},
{
"id": 3,
"url": "http://127.0.0.1:51194",
"attempts": 167854,
"completed": 167854,
"failures": 0
}
]
},
"counters": {
"issuedOrders": 96,
"delivered": 96,
"replayChecks": 20215,
"claims": 108,
"emptyClaims": 858,
"reclaimed": 12,
"abandoned": 12,
"lostLeases": 0,
"staleLeaseChecks": 12
}
},
{
"group": "group-1",
"failures": [],
"queryRouting": {
"mode": "replicas",
"consistency": "replica-local",
"auditConsistency": "fresh",
"nodes": [
{
"id": 1,
"url": "http://127.0.0.1:51187",
"attempts": 152151,
"completed": 150889,
"failures": 1262
},
{
"id": 2,
"url": "http://127.0.0.1:51202",
"attempts": 166370,
"completed": 166370,
"failures": 0
},
{
"id": 3,
"url": "http://127.0.0.1:51203",
"attempts": 166370,
"completed": 166370,
"failures": 0
}
]
},
"counters": {
"issuedOrders": 96,
"delivered": 96,
"replayChecks": 19959,
"claims": 104,
"emptyClaims": 870,
"reclaimed": 8,
"abandoned": 8,
"lostLeases": 0,
"staleLeaseChecks": 8
}
},
{
"group": "group-2",
"failures": [],
"queryRouting": {
"mode": "replicas",
"consistency": "replica-local",
"auditConsistency": "fresh",
"nodes": [
{
"id": 1,
"url": "http://127.0.0.1:51184",
"attempts": 153433,
"completed": 152246,
"failures": 1187
},
{
"id": 2,
"url": "http://127.0.0.1:51198",
"attempts": 166432,
"completed": 166432,
"failures": 0
},
{
"id": 3,
"url": "http://127.0.0.1:51199",
"attempts": 166432,
"completed": 166432,
"failures": 0
}
]
},
"counters": {
"issuedOrders": 96,
"delivered": 96,
"replayChecks": 20265,
"claims": 105,
"emptyClaims": 856,
"reclaimed": 9,
"abandoned": 9,
"lostLeases": 0,
"staleLeaseChecks": 9
}
},
{
"group": "group-3",
"failures": [],
"queryRouting": {
"mode": "replicas",
"consistency": "replica-local",
"auditConsistency": "fresh",
"nodes": [
{
"id": 1,
"url": "http://127.0.0.1:51183",
"attempts": 149898,
"completed": 148144,
"failures": 1754
},
{
"id": 2,
"url": "http://127.0.0.1:51191",
"attempts": 166965,
"completed": 166965,
"failures": 0
},
{
"id": 3,
"url": "http://127.0.0.1:51195",
"attempts": 166965,
"completed": 166965,
"failures": 0
}
]
},
"counters": {
"issuedOrders": 96,
"delivered": 96,
"replayChecks": 20094,
"claims": 109,
"emptyClaims": 844,
"reclaimed": 13,
"abandoned": 13,
"lostLeases": 0,
"staleLeaseChecks": 13
}
},
{
"group": "group-4",
"failures": [],
"queryRouting": {
"mode": "replicas",
"consistency": "replica-local",
"auditConsistency": "fresh",
"nodes": [
{
"id": 1,
"url": "http://127.0.0.1:51181",
"attempts": 151586,
"completed": 150217,
"failures": 1369
},
{
"id": 2,
"url": "http://127.0.0.1:51189",
"attempts": 167240,
"completed": 167240,
"failures": 0
},
{
"id": 3,
"url": "http://127.0.0.1:51193",
"attempts": 167238,
"completed": 167238,
"failures": 0
}
]
},
"counters": {
"issuedOrders": 96,
"delivered": 96,
"replayChecks": 19958,
"claims": 106,
"emptyClaims": 838,
"reclaimed": 10,
"abandoned": 10,
"lostLeases": 0,
"staleLeaseChecks": 10
}
},
{
"group": "group-5",
"failures": [],
"queryRouting": {
"mode": "replicas",
"consistency": "replica-local",
"auditConsistency": "fresh",
"nodes": [
{
"id": 1,
"url": "http://127.0.0.1:51186",
"attempts": 151714,
"completed": 150491,
"failures": 1223
},
{
"id": 2,
"url": "http://127.0.0.1:51196",
"attempts": 167245,
"completed": 167245,
"failures": 0
},
{
"id": 3,
"url": "http://127.0.0.1:51197",
"attempts": 167244,
"completed": 167244,
"failures": 0
}
]
},
"counters": {
"issuedOrders": 96,
"delivered": 96,
"replayChecks": 19946,
"claims": 107,
"emptyClaims": 846,
"reclaimed": 11,
"abandoned": 11,
"lostLeases": 0,
"staleLeaseChecks": 11
}
},
{
"group": "group-6",
"failures": [],
"queryRouting": {
"mode": "replicas",
"consistency": "replica-local",
"auditConsistency": "fresh",
"nodes": [
{
"id": 1,
"url": "http://127.0.0.1:51180",
"attempts": 151083,
"completed": 149810,
"failures": 1273
},
{
"id": 2,
"url": "http://127.0.0.1:51188",
"attempts": 164659,
"completed": 164659,
"failures": 0
},
{
"id": 3,
"url": "http://127.0.0.1:51192",
"attempts": 164659,
"completed": 164659,
"failures": 0
}
]
},
"counters": {
"issuedOrders": 96,
"delivered": 96,
"replayChecks": 20072,
"claims": 113,
"emptyClaims": 833,
"reclaimed": 17,
"abandoned": 17,
"lostLeases": 0,
"staleLeaseChecks": 17
}
},
{
"group": "group-7",
"failures": [],
"queryRouting": {
"mode": "replicas",
"consistency": "replica-local",
"auditConsistency": "fresh",
"nodes": [
{
"id": 1,
"url": "http://127.0.0.1:51185",
"attempts": 151511,
"completed": 150184,
"failures": 1327
},
{
"id": 2,
"url": "http://127.0.0.1:51200",
"attempts": 166930,
"completed": 166930,
"failures": 0
},
{
"id": 3,
"url": "http://127.0.0.1:51201",
"attempts": 166928,
"completed": 166928,
"failures": 0
}
]
},
"counters": {
"issuedOrders": 96,
"delivered": 96,
"replayChecks": 20217,
"claims": 110,
"emptyClaims": 863,
"reclaimed": 14,
"abandoned": 14,
"lostLeases": 0,
"staleLeaseChecks": 14
}
}
]