HTTP (L7) proxy benchmark · open-loop ramp · c1k-10k

request throughput 20261007-024759

Every proxy driven through the identical linear ramp (zrk, open-loop, coordinated-omission corrected) at 1000 connections. Throughput and CPU span the full ramp. The table's p50 / p99 are each proxy's latency at a common 2k req/s reference load — a shared, light, sub-knee rate where the number reflects per-request cost rather than queueing.

proxymax sustained req/sp50 @ 2kp99 @ 2kpeak memstatus
zoxy0.9.0 @935a2f34923.7339k0.45ms1.21ms173.4MiBok
haproxy3.4.616.0431k0.47ms1.66ms100.1MiBok
nginx1.3115.2835k0.49ms1.34ms69.9MiBok
pingora0.810.4232k0.50ms2.31ms63.6MiBok
envoy—7.4791k0.59ms2.46ms93.0MiBok

Successful req/s vs offered

open-loop ramp; dashed gray = perfect keep-up

05k10k15k20k25k05k10k15k20k25koffered load (req/s)req/s

Proxy CPU vs offered

container cores sampled from cAdvisor at 1Hz, on the ramp's own clock

00.250.50.7511.305k10k15k20k25koffered 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

1101001k05k10k15k20k25koffered load (req/s)ms

Load shed vs offered

offered load the proxy couldn't serve (1 − achieved/offered); the first few seconds include the generator's own ramp-up shortfall, which is not the proxy's

0%20%40%60%80%05k10k15k20k25koffered load (req/s)

Latency distribution · HdrHistogram (whole run)

zoxy

latency by percentile · saturated at 60s — tail percentiles are a floor, not a value · raw zoxy.hgrm

020k40k60k80kp0p90p99p99.9p99.99p99.99900000000001p99.9999p99.99999000000001percentilems

haproxy

latency by percentile · saturated at 60s — tail percentiles are a floor, not a value · raw haproxy.hgrm

020k40k60k80kp0p90p99p99.9p99.99p99.99900000000001p99.9999p99.99999000000001percentilems

nginx

latency by percentile · saturated at 60s — tail percentiles are a floor, not a value · raw nginx.hgrm

020k40k60k80kp0p90p99p99.9p99.99p99.99900000000001p99.9999p99.99999000000001percentilems

pingora

latency by percentile · saturated at 60s — tail percentiles are a floor, not a value · raw pingora.hgrm

020k40k60k80kp0p90p99p99.9p99.99p99.99900000000001p99.9999p99.99999000000001percentilems

envoy

latency by percentile · saturated at 60s — tail percentiles are a floor, not a value · raw envoy.hgrm

020k40k60k80kp0p90p99p99.9p99.99p99.99900000000001p99.9999p99.99999000000001percentilems