# 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. The profile uses a separate Compose project, generated independent secrets, and a separate PostgreSQL volume. Its Traefik instance is constrained to that exact Compose project; its router, service, middleware, and Host rule are unique, so the load profile cannot join the staging router. It exercises: - dynamic public home and Safety pages; - database-backed readiness queries; - Phoenix WebSocket upgrades and protocol heartbeats; - the configured number of web and worker replicas; - cross-node Phoenix PubSub after each run. It does not authenticate users, create requests, send chat messages, update locations, render a real browser, or reproduce an unknown future production traffic mix. It also does not sample the k6 load-generator container itself. Its results only describe the recorded host, container versions, replica counts, database state, and experiment inputs. ## Create the isolated profile ```sh ./scripts/ensure-local-load-env.sh ./scripts/load-stack-up.sh ``` The generated `.env.load` is ignored, restricted to mode 600, and contains independent PostgreSQL and application secrets. Edit its `LOAD_*` inputs to define a specific experiment. Values in `.env.load.example` are reproducible measurement points, not recommendations. ## Run and compare replica counts ```sh ./scripts/load-run.sh two-web ./scripts/load-stack-up.sh 3 # Set LOAD_WEB_REPLICAS=3 in .env.load so the recorded expected topology # matches the running topology, then: ./scripts/load-run.sh three-web ``` Each run writes ignored evidence below `output/performance/