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 | / | 100582 | 150000 | 1.25 ms | 2.46 ms | 6506.22 ms | 10371.07 ms |
| Rapira worker | / | 86610 | 100000 | 2.31 ms | 8.44 ms | 2583.52 ms | 5357.57 ms |
| FrankenPHP worker | / | 53305 | 75000 | 1.95 ms | 4.06 ms | 5759.16 ms | 8355.84 ms |
| RoadRunner | / | 40015 | 50000 | 1.63 ms | 2.41 ms | 4047.04 ms | 5787.65 ms |
| FreeUnit | / | 7498 | 10000 | 5.84 ms | 10.95 ms | 5016.10 ms | 7254.02 ms |
| PHP-FPM + Nginx | / | 7038 | 10000 | 6.04 ms | 9.66 ms | 5917.67 ms | 8568.83 ms |
| FrankenPHP classic | / | 6791 | 10000 | 6.16 ms | 10.02 ms | 6408.72 ms | 9306.11 ms |
| Rapira classic | / | 6175 | 10000 | 9.00 ms | 19.74 ms | 5823.50 ms | 14295.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/orders | 11759 | 15000 | 3.97 ms | 8.79 ms | 4070.95 ms | 9887.74 ms |
| Rapira worker DB | /postgres/orders | 11356 | 15000 | 4.48 ms | 10.48 ms | 4476.60 ms | 10756.09 ms |
| FrankenPHP worker DB | /postgres/orders | 10938 | 15000 | 3.82 ms | 6.15 ms | 5430.47 ms | 7843.84 ms |
| RoadRunner DB | /postgres/orders | 9511 | 15000 | 3.78 ms | 6.37 ms | 7360.05 ms | 10600.45 ms |
| Rapira classic DB | /postgres/orders | 4531 | 5000 | 10.32 ms | 24.22 ms | 1495.83 ms | 5701.63 ms |
| FreeUnit DB | /postgres/orders | 4494 | 5000 | 11.00 ms | 20.21 ms | 1998.07 ms | 2928.64 ms |
| PHP-FPM + Nginx DB | /postgres/orders | 4238 | 5000 | 13.26 ms | 23.34 ms | 3025.33 ms | 4427.77 ms |
| FrankenPHP classic DB | /postgres/orders | 4169 | 5000 | 14.11 ms | 24.99 ms | 3308.35 ms | 4804.61 ms |