# Performance measurement No production capacity, minimum resource requirement, SLO, alert threshold, pool size, or autoscaling threshold is known yet. The repository therefore contains a reproducible measurement profile, not a capacity claim or blocking resource preflight. ## Authentication limiter micro-measurement Observed locally on 2026-07-28 with Elixir 1.20.2 / OTP 29.0.3, PostgreSQL 18.4, Docker 29.6.2, and the current uncommitted authentication-limiter candidate on an AMD Ryzen 9 7950X3D workstation. PostgreSQL used an isolated tmpfs data directory and the application connected over a Docker bridge. Each operation incremented an email bucket and an IP bucket together. A telemetry-backed integration test confirmed that the operation executes one PostgreSQL `INSERT ... ON CONFLICT` statement, not two independent counter queries. | Observation | Result | | --- | ---: | | Sequential operations | 1,000 | | Sequential p50 / p95 / p99 | 155 / 237 / 273 µs | | Concurrent operations / concurrency | 1,000 / 50 | | Concurrent elapsed time | 107.4 ms | | Concurrent observed throughput | 9,308 operations/s | This isolates the limiter on a fast local tmpfs database. It does not include SMTP delivery, account lookup, production storage latency, internet latency, or production contention, and therefore is not a production capacity claim. It verifies the one-statement implementation shape. It provides no evidence that Redis is currently required or unnecessary on the production host. ## Two different load profiles The repository deliberately separates two experiments: 1. `scripts/load-cycle.sh` is the full write-capable profile. It creates a unique Compose project, database, credentials, images, and fixtures. It exercises login, database writes, private chat, tracking, WebSockets, multiple web/worker replicas, SQL statements, and connection pools. Use this profile to find application and query bottlenecks without touching real users. 2. `scripts/production-readonly-load.sh` is pinned to `https://whoneedhelp.com`. Its compiled allowlist contains only public GET pages, readiness, and Phoenix WebSocket heartbeats. It cannot exercise the authenticated write path and therefore cannot determine write capacity or whether Redis is warranted. The production runner has separate `plan` and `run` modes. Every VU, duration, think-time, and socket value is mandatory; the script supplies no hidden load defaults. `plan` verifies the remote checkout identity, exact commit, Compose project, running application containers, and current host resources without starting k6. `run` additionally requires the exact confirmation string emitted by that verified plan. If the production commit or any experiment input changes, the confirmation no longer matches. Example plan only: ```sh WNH_PRODUCTION_LOAD_HTTP_VUS= \ WNH_PRODUCTION_LOAD_WS_VUS= \ WNH_PRODUCTION_LOAD_DURATION= \ WNH_PRODUCTION_LOAD_HTTP_THINK_SECONDS= \ WNH_PRODUCTION_LOAD_WS_HOLD_MS= \ WNH_PRODUCTION_LOAD_WS_CONNECT_TIMEOUT_MS= \ ./scripts/production-readonly-load.sh plan ``` Do not copy a previous run's values as production limits. Choose and record a specific experiment, inspect the printed target and scope, then use the printed confirmation only when that production probe has been explicitly approved. When run, evidence is written only on the operator workstation below `output/performance/