Hardware used for this run

OS and kernelLinux 6.17.0-1022-azure
CPU modelAMD EPYC 9V45 96-Core Processor
Host logical cores4
Effective cores4
Affinity cores4
Allowed affinity0-3
Pinned CPU0
CPU quota
Host RAMMemTotal: 16373448 kB
Available RAMMemAvailable: 15240160 kB
Memory limit
Test DB filesystemtype=ext4 total_kib=151263856 available_kib=86859916
Rustrustc 1.101.0-nightly (8006091eb 2026-10-17)
SQLite3.53.2
Engine revision4176f6bc67c9ca444257183358ff83b8c943325d
Dirty sourcefalse

Scanner driver: scheduler

Workload and progress

One CPU; file-backed SQLite with real migrations, WAL and synchronous=NORMAL. Plain custody and the production scanner run against a deterministic scripted daemon while independent SQLite and HTTP status readers plus an admin writer issue background work. A separate connection holds a SQLite write lock for a fixed interval each tick. The capacity sweep uses immediate RPC responses; the fault points below add scheduled RPC delay and failures, and a longer blocked writer followed by a drain period. A blocked writer is a contention proxy, not a real disk fault. Capacity below is observational for this workload and machine.

Observed capacity bracket: at least 128 tenants sustainable; no overload observed. Workload: open orders per tenant as recorded in run.json plus one tenant with 300 open orders, one transaction per block, one new block per tick, 2 database readers, 2 HTTP status readers, 1 admin writer, a 25 ms SQLite write lock per tick, 5 second tick budget, at most three blocks of oldest lag. Only this machine and schedule were tested.

Measured tick time by tenant count (ms)
3264128
Lagging tenants after drain
3264128
Whole-process peak resident memory (bytes; Linux)
3264128
TenantsStatusMeasured timeTick p50/p95/p99Timer delayDB reads/writesHTTP readsMax DB read/write latencyMax queue wait read/writeMax query read/writeMax HTTP latencyWAL pending pagesLag after drainRaw data
32sustainable165 ms41/42/42 ms1756 µs72/11381169/34337 µsn/a/33605 µsn/a/33594 µs2588 µs00JSON
64sustainable186 ms46/47/47 ms1930 µs82/1944898/33861 µsn/a/32906 µsn/a/33610 µs1323 µs00JSON
128sustainable233 ms58/59/59 ms2052 µs103/29542267/33816 µsn/a/32795 µsn/a/33562 µs1527 µs00JSON

Progress timelines

Blue: network high-water; orange: slowest tenant cursor. The gap is work still to catch up.

32 tenants

64 tenants

128 tenants

Fault recovery

FaultResultFault detailFinal slowest cursorRaw data
transient daemon RPC failures under SQLite contentionrecovered3 injected RPC failures8JSON
blocked SQLite writer, then recoveryrecovered1500 ms per tick for two ticks8JSON
single custody scan slot under concurrent tenant scansrecovered128 scans; max slot wait 102507 µs8JSON

The custody fault uses one scan slot with a scripted 5 ms service delay while retaining real plain-custody matching. Actual slow disk commands and process-kill recovery are not measured by this fixture. The RPC fault point uses deterministic transient failures and a drain period; the capacity sweep has no RPC delay.

Run metadata · Hardware JSON