HTTP (L7) proxy benchmark · open-loop ramp
request throughput 20260813-190516
| proxy | max sustained req/s | p50 @ 2k · ms | p99 @ 2k · ms | peak mem · MiB |
|---|---|---|---|---|
| zoxy 0.2.1 | 42.1k | 0.4 | 1.9 | — |
| nginx 1.31 | 18.2k | 0.5 | 1.1 | — |
| haproxy 3.4.3 | 17.1k | 0.4 | 2.8 | — |
| pingora 0.8 | 12.8k | 0.5 | 6.1 | 57.1 |
| envoy 1.33 | 8.1k | 0.6 | 3.3 | 78.6 |
"peak mem" is cAdvisor's sampled container RSS for the run — kernel, allocator, and page-cache overhead included, the same yardstick for every proxy above. zoxy's own memory figure elsewhere on this site (the homepage) is a different number by design: the exact total zoxy's own startup banner reports, its fixed pools summed at parse time rather than a sampled peak — the two measure different things, not a change in behavior.
Successful req/s vs offered
open-loop ramp; dashed gray = perfect keep-up
Proxy CPU vs offered
container cores (cAdvisor), mapped onto the offered axis
p99 latency vs offered (while keeping up)
per-window tail (log scale); each line stops where that proxy stops keeping up
Load shed vs offered
offered load the proxy couldn't serve (1 − achieved/offered); under overload most proxies fall behind rather than reject
Latency distribution · HdrHistogram (at 2,000 req/s reference load)
zoxy
latency by percentile — at 2,000 req/s reference load · raw zoxy.hgrm = whole run
haproxy
latency by percentile — at 2,000 req/s reference load · raw haproxy.hgrm = whole run
nginx
latency by percentile — at 2,000 req/s reference load · raw nginx.hgrm = whole run
pingora
latency by percentile — at 2,000 req/s reference load · raw pingora.hgrm = whole run
envoy
latency by percentile — at 2,000 req/s reference load · raw envoy.hgrm = whole run