HTTP (L7) proxy benchmark · open-loop ramp

request throughput 20260813-190516

Every proxy driven through the identical linear ramp (200→100000 req/s across 1,000 connections, zrk, open-loop, coordinated-omission corrected) as an HTTP/1.1 reverse proxy. Throughput & CPU span the full ramp. The table's p50 / p99 are each proxy's latency at a common 2,000 req/s reference load — a shared, light, sub-knee rate where the number is per-request cost, not queueing. The full latency-vs-load story is the p99 pane and the distributions below, each line stopping where that proxy stops keeping up.

proxymax sustained req/sp50 @ 2k · msp99 @ 2k · mspeak mem · MiB
zoxy 0.2.142.1k0.41.9
nginx 1.3118.2k0.51.1
haproxy 3.4.317.1k0.42.8
pingora 0.812.8k0.56.157.1
envoy 1.338.1k0.63.378.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

010k20k30k40k50k010k20k30k40k50koffered load (req/s)req/s

Proxy CPU vs offered

container cores (cAdvisor), mapped onto the offered axis

00.250.50.7511.3010k20k30k40k50koffered load (req/s)cores

p99 latency vs offered (while keeping up)

per-window tail (log scale); each line stops where that proxy stops keeping up

1101001k010k20k30k40k50koffered load (req/s)ms

Load shed vs offered

offered load the proxy couldn't serve (1 − achieved/offered); under overload most proxies fall behind rather than reject

0%20%40%60%80%100%010k20k30k40k50koffered load (req/s)

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

0.02.04.06.08.00%90%99%99.9%percentilems

haproxy

latency by percentile — at 2,000 req/s reference load · raw haproxy.hgrm = whole run

0.02.04.06.08.00%90%99%99.9%percentilems

nginx

latency by percentile — at 2,000 req/s reference load · raw nginx.hgrm = whole run

0.01.02.03.04.05.00%90%99%99.9%percentilems

pingora

latency by percentile — at 2,000 req/s reference load · raw pingora.hgrm = whole run

0.05.01015200%90%99%99.9%percentilems

envoy

latency by percentile — at 2,000 req/s reference load · raw envoy.hgrm = whole run

0.02.04.06.08.00%90%99%99.9%percentilems

run 20260813-190516 · generated