System requirements: how much machine for how much load
This page tells you how much CPU, memory and disk to set aside before you install Spitfire on your own servers: on one machine with Docker, on Kubernetes and when the load is spread over other machines. The figures are given by the number of virtual users (VUs) and requests per second you expect.
Software
- One machine: Linux (amd64 or arm64) or macOS with Docker Engine or Docker Desktop and Docker Compose v2. On Windows 10/11 and Windows Server, Docker Desktop (Linux containers) and PowerShell.
- Kubernetes:
kubectland the right to install into a namespace; a StorageClass for the persistent disk (unless Postgres lives outside). There is a Helm chart too. - Remote runner server: Docker; or systemd on Linux without Docker, a Windows service on Windows without Docker.
- Database: the Postgres 16 that comes with the installation, or your own Postgres.
- Ports: 8470 for the web UI and API; 8471 (TLS) for runners on other machines. No inbound port on the runner machines.
First, work out your own load
VUs and requests per second relate like this: requests/s ≈ VUs ÷ (response time + think time). 1,000 VUs against a system that answers in 200 ms with 1 second of think time make about 830 requests per second; without think time, 5,000. What loads a runner is mostly requests per second (CPU), while the VU count decides the memory. In the tables below, go by whichever of the two fills up first.
One machine (Docker)
The install command starts Postgres, the controller and the runners on the same machine (--runners N, 2 by default). The machine size is the three together:
| Profile | Load | Machine | Disk |
|---|---|---|---|
| Trial | Up to 500 VUs, ~2,000 requests/s | 2 vCPU, 4 GB RAM | 20 GB |
| Small team | Up to 2,000 VUs, ~10,000 requests/s | 4 vCPU, 8 GB RAM | 40 GB SSD |
| Medium | Up to 5,000 VUs, ~25,000 requests/s | 8 vCPU, 16 GB RAM | 80 GB SSD |
| Large | Up to 10,000 VUs, ~50,000 requests/s | 16 vCPU, 32 GB RAM | 100 GB SSD |
Choose half as many runners as vCPUs (--runners 4 on 8 vCPUs). Above 10,000 VUs add runners on other machines rather than growing one machine; the network card is often the limit.
Kubernetes
On Kubernetes the controller and Postgres take a small, fixed share; the part that grows is the runner pods. The Helm chart's default runner pod uses at most 2 vCPU / 1 GiB and carries about 10,000 requests/s or 3,000 VUs. Pick the pod count by the larger of requests/s ÷ 10,000 and VUs ÷ 3,000:
| Target load | Runner pods | Nodes (suggested) | Postgres disk |
|---|---|---|---|
| 1,000 VUs, ~5,000 requests/s | 1 | 1 node: 4 vCPU, 8 GB | 10 GB |
| 5,000 VUs, ~25,000 requests/s | 3 | 2 nodes: 4 vCPU, 8 GB | 20 GB |
| 20,000 VUs, ~100,000 requests/s | 10 | 3 nodes: 8 vCPU, 16 GB | 50 GB |
| 50,000 VUs, ~250,000 requests/s | 25 | 7 nodes: 8 vCPU, 16 GB | 100 GB |
- The node count is the sum of the runner pods' CPU limits plus ~2 vCPU for the controller and Postgres. Give the runners their own node pool; load generated on the same nodes as the application you measure skews the result.
- With on-demand runners (
--on-demand-runners N) the runner pods take room only during a run; with a cluster autoscaler the nodes come up only then too. - For more VUs per pod, give it more memory (Helm:
runner.resources.limits.memory; for on-demand runnersSPITFIRE_ONDEMAND_MEMORYandSPITFIRE_ONDEMAND_VUS_PER_RUNNER).
Per component
If you put the controller, the database and the runners on separate machines:
| Component | Minimum | Recommended | Note |
|---|---|---|---|
| Controller (web UI, API) | 1 vCPU, 1 GB | 2 vCPU, 2 GB | Grows with concurrent runs, not with requests/s |
| Postgres | 1 vCPU, 1 GB, 10 GB disk | 2 vCPU, 4 GB, 50 GB SSD | Per-second results live here |
| Runner (HTTP, gRPC, Kafka…) | 1 vCPU, 1 GB | 2 vCPU, 2 GB | Each vCPU ~5,000 requests/s, each GB ~3,000 VUs |
| Browser runner (Web Vitals) | 4 vCPU, 8 GB | 4 vCPU, 8 GB | About 10 browser VUs |
- Disk: Postgres keeps per-second results for 7 days by default; summaries stay. 50 GB is comfortable for a team running a few hours of tests a day; if you lengthen retention, grow the disk too. SSD recommended.
- File descriptors: every VU holds at least one socket. The installation gives runner containers 65,536; on runners without Docker raise
ulimit -nto at least that too. - Browser steps (Web Vitals) open a real Chromium: ~350 MB of memory and ~20% of a core per browser VU. They run on separate runners with the
-browserimage.
Where these figures come from
In Spitfire 0.56.1, a runner limited to one core loading a target that returns small responses over HTTP keep-alive produced 34,000-40,000 requests per second; each waiting VU with its open connection held ~70 KB of memory (711 MB at 10,000 VUs). That was measured on a fast laptop core against a target on the same machine. The planning figures are deliberately far below it (5,000 requests/s per vCPU, 3,000 VUs per GB): they leave room for HTTPS, JSON responses of a few KB, checks and extraction, an ordinary cloud vCPU and network latency.
The best figure for your own test is your own measurement: run it at a tenth of the expected load and watch the CPU column on the Runners page. When a runner gets close to its CPU limit, Spitfire warns that "results may be skewed"; add runners then. Installation details are in the installation guide, distributed load on Kubernetes in the Kubernetes guide.
Frequently asked
What is the minimum to install Spitfire?
How many VUs and requests per second does one runner carry?
Do I need a separate Kubernetes cluster?
How much network bandwidth do I need?
Spitfire installs on Docker or Kubernetes with one command; every testing feature and protocol is open in the free edition.