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

request throughput 20260802-081742

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.0.9 @b29f3b5ed52.2591k0.41ms2.32ms75.1MiBok
nginx1.2721.3109k0.46ms3.62ms57.2MiBok
haproxy3.0.2619.6562k0.44ms1.27ms74.2MiBok
pingora0.812.379k0.46ms1.87ms53.1MiBok
envoy8.0277k0.57ms3.81ms72.1MiBok

Successful req/s vs offered

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

020k40k60k020k40k60koffered 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.3020k40k60koffered 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

1101001k10k020k40k60koffered 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%100%020k40k60koffered load (req/s)

Latency distribution · HdrHistogram (whole run)

zoxy

latency by percentile · raw zoxy.hgrm

010k20k30k40k50kp0p90p99p99.9p99.99p99.99900000000001p99.9999p99.99999000000001p99.99999899999999percentilems

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