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

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
envoy—4.313k1.63ms32.68ms206.6MiBok
zoxy0.9.0 @935a2f3494.3091k1.40ms5.67ms252.5MiBok
haproxy3.4.64.276k1.46ms9.39ms168.9MiBok
pingora0.83.9269k1.53ms5.32ms176.8MiBok
nginx1.313.764k1.58ms8.28ms121.4MiBok

Successful req/s vs offered

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

01k2k3k4k5k01k2k3k4k5koffered load (req/s)req/s

Proxy CPU vs offered

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

00.20.40.60.8101k2k3k4k5koffered 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

11010001k2k3k4k5koffered 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%10%20%30%40%01k2k3k4k5koffered 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.9999percentilems

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