Skip to content

test(0293): M3 load-test evidence, 500 req/s row, the box ceiling - #326

Merged
stkrolikiewicz merged 11 commits into
developfrom
test/0293_load-test-ramp-to-1000-rps-from-inside-eu-central-1
Sep 18, 2026
Merged

stkrolikiewicz merged 11 commits into
developfrom
test/0293_load-test-ramp-to-1000-rps-from-inside-eu-central-1

Conversation

@stkrolikiewicz

Copy link
Copy Markdown
Collaborator

Summary

  • Report (docs/prices-api-load-test-100rps.md): the 2026-09-17 regime-3 re-run after the ClickHouse quota fix, and the 2026-09-18 evidence run — Tranche 3 AC 5 met on the scenario it names (AC scenario p95 49.0 ms at 100 req/s, 98.3 % cache hits, usage plan named), with the miss-only row beside it (p95 129.9 ms from Poland, 45–90 ms at the gateway).
  • 500 and 1000 req/s rows: 500 req/s of pure cache misses held for five minutes with zero failed requests; the ramp to 1000 found the shared ClickHouse box's ceiling between 500 and ~900 req/s (no exceptions — queueing; all 14,865 failures are Lambda throttles at a temporary concurrency cap). Collateral on the explorer's indexer and its production-ingestion-backlog-age page is recorded, as is the post-run alarm check that missed it.
  • Load-test script: mid-run 404s counted as aged_out instead of failed requests, gen_pool.mjs to rebuild the wide pool in the run's own command chain, VARIANTS cache-key multiplier via min_volume_usd, and a ramped warm-up for rates above 100 req/s; README updated.
  • Raw artefacts: k6 summary exports for every run and control, plus 30-second observer logs (ClickHouse, explorer ingestion, box load, gateway errors) for the diagnostic, evidence, 500 and 1000 runs.
  • Lore: task 0293 carries the decisions, results and acceptance criteria; 0047 gets its first measured data point on the shared box.

Regime 3 held after the quota fix: 29,968 requests, 0 errors, gateway
p95 74 ms. k6 on the laptop saw p95 464 ms; the difference is the
client's network, so the in-region run in 0293 supplies the reportable
number. Four open items closed with pointers.
…ence

500 and 1000 req/s are informational; the only M3 bar is AC 5, p95
< 100 ms at 100 req/s, reported as p95. The cache argument is stated
against production's real hit rate (~4 % over 2026-09-04 → 09-16).
Regime 3 from the laptop, bracketed by two cache controls: k6 p95 127 ms
against 464 the day before, gateway ~80 — the earlier tail was the client
network. Not an evidence run (stale pool, backfill running). A ~4 % slow
mode of ~+60 ms sits between Lambda and ClickHouse; the database is not it.
…pool in-chain

/price serves only assets with a 1m candle in the last 24 h, so an asset
can leave the pool after setup() probed it. On 2026-09-18 that was 67 of
30,001 requests: http_req_failed crossed 0.1 % and k6 exited 99 with zero
server errors. A 404 is now counted in aged_out (own bar, rate<0.01) and
excluded from the body checks; http_req_failed means 5xx/429/transport.

gen_pool.mjs replaces the README one-liner so the wide regime rebuilds
its pool in the same command chain — a 20 h old pool had lost 38 %.
… claim

It starts 2026-09-21 (est. 22–28 days). The every-other-minute slow
queries are therefore not the backfill, and the days before Monday are
the last window to measure the box without it.
…de pool

2026-09-18 10:40–10:57 UTC, laptop, plan i12bsj at 150 req/s. AC scenario
(17 assets) p95 49.0 ms; wide pool (3,463 assets, regenerated in-chain)
p95 129.9 ms, aged_out 0.06 %; controls before/after p95 64.9 / 51.3 ms.
All four runs exit 0, zero failed requests.
…ove 100 req/s

VARIANTS multiplies the cache keys through min_volume_usd, which the
handler applies in memory after the same ClickHouse query — the pool
alone (~3,400 assets) cannot defeat a 10 s TTL at 500 or 1000 req/s.
The warm-up climbs from 100 to RATE so the shared box meets the load
gradually. Flat and identical to before at RATE=100, VARIANTS=1.
…d requests

2026-09-18 11:49–11:55 UTC: 149,880 requests at 500.00/s, 0 failed,
aged_out 0.03 %, 14,056 cache keys (4 variants), ~2.6 % hits at the head
of main. Gateway p95 87–95 ms, ClickHouse median 6 ms, box load1 ~11
(peak 19.7) of 24 cores, explorer ingestion unaffected.
iterationInTest restarts at 0 in main and replayed variant 0, which the
warm-up's last pass had cached seconds earlier — 3,833 gateway hits at
the head of the 500 req/s run.
… all four runs

The ramp to 1000 req/s found the ceiling: ClickHouse collapsed ~30 s after
the ramp reached ~900–1000 req/s (load1 247 on 24 cores, no exceptions),
aborted after 1.5 min. All 14,865 failed requests are Lambda throttles at
the temporary 700 reserved-concurrency cap on the API handler. Observer
logs: diagnostic, evidence, 500 and 1000 runs — ClickHouse, explorer
ingestion, box load and gateway errors every 30 s.
…eiling

AC scenario p95 49.0 ms at 100 req/s (98.3 % hits, plan named) — Tranche 3
AC 5 met on the scenario it names; miss-only p95 129.9 ms from Poland, 45–90
at the gateway. 500 req/s of misses held with zero failures. The ramp to
1000 found the shared ClickHouse box's ceiling between 500 and ~900 req/s;
collateral on the explorer's indexer recorded, including the alarm the first
post-run check missed. 0047 gets its first measured data point.
@stkrolikiewicz
stkrolikiewicz merged commit 41e6feb into develop Sep 18, 2026
4 checks passed
stkrolikiewicz added a commit that referenced this pull request Sep 18, 2026
PR #326 merged. 7 of 8 criteria met; the in-region client was dropped by
decision. AC scenario p95 49.0 ms at 100 req/s; 500 req/s of misses held;
the shared ClickHouse box saturates between 500 and ~900 req/s.
@stkrolikiewicz
stkrolikiewicz deleted the test/0293_load-test-ramp-to-1000-rps-from-inside-eu-central-1 branch September 18, 2026 13:39
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant