Benchmark Report

Generated 2026-09-22 09:34:08 UTC. This report combines wrkx stage summaries with Docker CPU and memory samples.

Charts show raw samples. For stage results, RPS cap marks the first stage with successful throughput more than 5% below target; per-second results use a sustained latency surge. The load generator can also limit throughput.

Hover over a chart legend label or focus it with Tab to highlight that run.

Run Summary — Non-DB

Normal latency averages samples before a detected latency surge or throughput cap, whichever comes first. Overloaded latency comes from the throughput-cap sample shown in the RPS columns. Runs may include different load levels in their normal averages, so these are not equal-load comparisons. Mean p95 averages the included sample percentiles, not pooled requests. — means no qualifying measurement.

Calculation details

For stage data, each sample represents one load stage. The first stage provides the latency baseline. A surge is detected when average latency reaches the largest of 20 ms, 4× baseline average latency, or baseline average latency + 12 ms. When baseline p95 is available, the stage must also have a p95 reaching the largest of 30 ms, 2.5× baseline p95, or baseline p95 + 15 ms. These thresholds are a heuristic, not a latency guarantee.

Normal averages exclude the first qualifying surge stage and all later stages, or stop earlier at the throughput cap. If the cap occurs in the first stage, no normal measurement is available. If no cap is reached, no overloaded measurement is available. For per-second data, the existing sustained latency-surge detector determines the cutoff, and averages use per-second samples.

Rapira dispatcher/1005821500001.25 ms2.46 ms6506.22 ms10371.07 ms
Rapira worker/866101000002.31 ms8.44 ms2583.52 ms5357.57 ms
FrankenPHP worker/53305750001.95 ms4.06 ms5759.16 ms8355.84 ms
RoadRunner/40015500001.63 ms2.41 ms4047.04 ms5787.65 ms
FreeUnit/7498100005.84 ms10.95 ms5016.10 ms7254.02 ms
PHP-FPM + Nginx/7038100006.04 ms9.66 ms5917.67 ms8568.83 ms
FrankenPHP classic/6791100006.16 ms10.02 ms6408.72 ms9306.11 ms
Rapira classic/6175100009.00 ms19.74 ms5823.50 ms14295.04 ms

Run Summary — DB

Normal latency averages samples before a detected latency surge or throughput cap, whichever comes first. Overloaded latency comes from the throughput-cap sample shown in the RPS columns. Runs may include different load levels in their normal averages, so these are not equal-load comparisons. Mean p95 averages the included sample percentiles, not pooled requests. — means no qualifying measurement.

Calculation details

For stage data, each sample represents one load stage. The first stage provides the latency baseline. A surge is detected when average latency reaches the largest of 20 ms, 4× baseline average latency, or baseline average latency + 12 ms. When baseline p95 is available, the stage must also have a p95 reaching the largest of 30 ms, 2.5× baseline p95, or baseline p95 + 15 ms. These thresholds are a heuristic, not a latency guarantee.

Normal averages exclude the first qualifying surge stage and all later stages, or stop earlier at the throughput cap. If the cap occurs in the first stage, no normal measurement is available. If no cap is reached, no overloaded measurement is available. For per-second data, the existing sustained latency-surge detector determines the cutoff, and averages use per-second samples.

Rapira dispatcher DB/postgres/orders11759150003.97 ms8.79 ms4070.95 ms9887.74 ms
Rapira worker DB/postgres/orders11356150004.48 ms10.48 ms4476.60 ms10756.09 ms
FrankenPHP worker DB/postgres/orders10938150003.82 ms6.15 ms5430.47 ms7843.84 ms
RoadRunner DB/postgres/orders9511150003.78 ms6.37 ms7360.05 ms10600.45 ms
Rapira classic DB/postgres/orders4531500010.32 ms24.22 ms1495.83 ms5701.63 ms
FreeUnit DB/postgres/orders4494500011.00 ms20.21 ms1998.07 ms2928.64 ms
PHP-FPM + Nginx DB/postgres/orders4238500013.26 ms23.34 ms3025.33 ms4427.77 ms
FrankenPHP classic DB/postgres/orders4169500014.11 ms24.99 ms3308.35 ms4804.61 ms

Worker no DB

Request Rate Per Second

successful issued errored RPS cap T Target RPS

Latency (ms)

avg p95 RPS cap T Target RPS

APP CPU (% of one core, 100% = 1 core)

RPS cap T Target RPS

APP Memory (MiB)

RPS cap T Target RPS

Worker DB

Request Rate Per Second

successful issued errored RPS cap T Target RPS

Latency (ms)

avg p95 RPS cap T Target RPS

APP CPU (% of one core, 100% = 1 core)

RPS cap T Target RPS

APP Memory (MiB)

RPS cap T Target RPS

Non-worker no DB

Request Rate Per Second

successful issued errored RPS cap T Target RPS

Latency (ms)

avg p95 RPS cap T Target RPS

APP CPU (% of one core, 100% = 1 core)

RPS cap T Target RPS

APP Memory (MiB)

RPS cap T Target RPS

Non-worker DB

Request Rate Per Second

successful issued errored RPS cap T Target RPS

Latency (ms)

avg p95 RPS cap T Target RPS

APP CPU (% of one core, 100% = 1 core)

RPS cap T Target RPS

APP Memory (MiB)

RPS cap T Target RPS

FrankenPHP classic

runtime/benchmarks/20260922T073137Z-13-stage-suite/20260922T073146Z-FrankenPHP-classic-home-ramp

FrankenPHP classic DB

runtime/benchmarks/20260922T073137Z-13-stage-suite/20260922T073833Z-FrankenPHP-classic-DB-postgres-orders-ramp

FrankenPHP worker

runtime/benchmarks/20260922T073137Z-13-stage-suite/20260922T074529Z-FrankenPHP-worker-home-ramp

FrankenPHP worker DB

runtime/benchmarks/20260922T073137Z-13-stage-suite/20260922T075216Z-FrankenPHP-worker-DB-postgres-orders-ramp

FreeUnit

runtime/benchmarks/20260922T073137Z-13-stage-suite/20260922T082900Z-FreeUnit-home-ramp

FreeUnit DB

runtime/benchmarks/20260922T073137Z-13-stage-suite/20260922T083547Z-FreeUnit-DB-postgres-orders-ramp

PHP-FPM + Nginx

runtime/benchmarks/20260922T073137Z-13-stage-suite/20260922T081431Z-PHP-FPM-+-Nginx-home-ramp

PHP-FPM + Nginx DB

runtime/benchmarks/20260922T073137Z-13-stage-suite/20260922T082118Z-PHP-FPM-+-Nginx-DB-postgres-orders-ramp

Rapira classic

runtime/benchmarks/20260922T073137Z-13-stage-suite/20260922T085722Z-Rapira-classic-home-ramp

Rapira classic DB

runtime/benchmarks/20260922T073137Z-13-stage-suite/20260922T091245Z-Rapira-classic-DB-postgres-orders-ramp

Rapira dispatcher

runtime/benchmarks/20260922T073137Z-13-stage-suite/20260922T092021Z-Rapira-dispatcher-home-ramp

Rapira dispatcher DB

runtime/benchmarks/20260922T073137Z-13-stage-suite/20260922T092707Z-Rapira-dispatcher-DB-postgres-orders-ramp

Rapira worker

runtime/benchmarks/20260922T073137Z-13-stage-suite/20260922T084340Z-Rapira-worker-home-ramp

Rapira worker DB

runtime/benchmarks/20260922T073137Z-13-stage-suite/20260922T085027Z-Rapira-worker-DB-postgres-orders-ramp

RoadRunner

runtime/benchmarks/20260922T073137Z-13-stage-suite/20260922T080004Z-RoadRunner-home-ramp

RoadRunner DB

runtime/benchmarks/20260922T073137Z-13-stage-suite/20260922T080651Z-RoadRunner-DB-postgres-orders-ramp