THE BENCHMARK NOTEBOOK

BonVoyage benchmarks.
With the context attached.

Useful measurements show where a gateway does well, where it does not, and exactly what was tested. This page leads with evidence bound to public v1.0.4; older campaigns remain available in a separate historical archive.

CAMPAIGN 03 / V1.0.4 / NOVEMBER 1-4, 2026

At 600K, the difference was tail stability.

The post-release replay bound the public v1.0.4 package to its exact binary, matched the TLS, payload, connection intent, upstreams, transformations, client lanes and 24-CPU application allowance, and rotated run order. At the supplemental 600,000 offered-RPS point, both systems returned every measured request successfully. BonVoyage stayed inside the 500 ms p99 gate in all three repetitions; NGINX stayed inside it in one of three.

How the comparison was constructed.

Four separate shared AWS c7a.8xlarge roles isolated traffic generation, the active gateway, deterministic upstreams, and evidence collection. Only one gateway ran on the target at a time. Application work used logical CPUs 8-31, while housekeeping and IRQ work remained on 0-7. The product order rotated between repetitions.

Traffic

Eight client lanes, 30-second warmup and 60-second measured window per run. HTTP/1.1 with a 256-byte upstream response.

Gateway allowance

BonVoyage with 24 reactor shards; NGINX 1.30.4 with 24 workers; each receives the same 24-CPU allowance.

Origins

Two fixed round-robin origins with matched keepalive and timeout intent.

Semantics

Exact request and response set, append and remove outcomes checked before and after every load run. Caching, compression, access logs, request buffering and response buffering disabled.

How to read the CPU number.

Both products received the same 24-CPU allowance: 24 BonVoyage reactor shards or 24 NGINX workers. App CPU is accumulated application CPU-seconds divided by wall time. It reports average compute consumed, not how many workers ran, how many CPUs participated, or how much useful work each CPU completed.

At 480K, both products met the traffic and tail gates, so NGINX consuming less measured application CPU is a valid advantage for that exact operating point. At 600K, NGINX still consumed less application CPU, but two of its three repetitions missed the p99 gate. The lower number therefore cannot establish greater efficiency at that point. This campaign did not profile NGINX scheduler wait, locks, internal queues or per-worker saturation, so it does not claim a root cause for the tail widening.

Why a run was accepted or rejected

Success count alone was not enough. Every accepted run had to satisfy all of these gates:

  • Correct status, body, headers, authentication and protocol semantics.
  • Zero unexpected client errors, timeouts or semantic failures.
  • p95 and p99 each at or below 500 ms; p99.9 is diagnostic only.
  • Reconciled request counts and bounded application, host, IRQ, support-role, RSS and descriptor collection.
  • No relevant process restart, leak signal, failed recovery or cleanup failure.
  • Scheduled repetition successful-RPS variation no greater than 5 percent, without selecting a preferred run.

This is why the two rejected NGINX 600K repetitions are not described as traffic failures: every request succeeded, but p99 crossed the 500 ms acceptance boundary.

Why these load points were used.

Fixed offered rates show how latency and resources change as pressure rises without selecting a convenient peak after the fact. The frozen campaign used 20%, 40%, 60% and 80% of a 600,000-RPS shared-VM envelope. C03 executed 20%, 40% and 80%; its unused 60% point is reported rather than silently filled in. The separate 100% run was added only as a tail diagnostic.

v1.0.4 C03 load schedule and outcomes
More columns
C03 fixed-rate test register
PointOffered loadClassWhy it was runOutcome
20%120,000 RPSFrozen curveEstablish the low-load semantic and repeatability reference.Accepted: BonVoyage 3/3 and NGINX 3/3.
40%240,000 RPSFrozen curveObserve the middle of the operating curve before tail pressure.Accepted: BonVoyage 3/3 and NGINX 3/3.
60%360,000 RPSFrozen curvePlanned intermediate bracket.Closed unexecuted after 40%, 80% and the supplemental diagnostic bracketed the relevant behavior.
80%480,000 RPSFrozen curveTest a high fixed rate while retaining stable primary tails.Accepted: BonVoyage 3/3 and NGINX 3/3.
100%600,000 RPSSupplemental diagnosticExamine tail stability at the frozen envelope, without calling it capacity.BonVoyage accepted 3/3; NGINX accepted 1/3 because repetitions 1 and 3 exceeded the p99 gate.
v1.0.4 600K header-transformation diagnostic
More columns
Supplemental 100% diagnostic · Three-run medians · 216,000,000 measured requests
GatewaySuccessful RPSTail-gate passesp50p95p99App CPU (avg core-eq)RSSDescriptors
BonVoyage599,899.23/30.786 ms2.180 ms189.934 ms22.66643.2 MiB3,930
NGINX599,787.91/30.731 ms256.919 ms745.333 ms16.92959.0 MiB5,242
Bounded reading. All 216 million measured requests returned HTTP 200 with zero client errors or timeouts. BonVoyage passed the p95/p99 tail gate in 3/3 repetitions; NGINX passed 1/3. NGINX retained lower p50 and consumed less measured application CPU, but that lower CPU value did not establish greater efficiency because two repetitions missed the p99 gate. BonVoyage used 32.9% less RSS and 25.0% fewer descriptors. This point is a supplemental diagnostic outside the frozen 20/40/60/80% curve. It is not a capacity result or a universal ranking.

At 480K, both systems were stable and the trade-off was different.

The frozen 80% point is important context for the high-load result. NGINX retained slightly lower primary latency and consumed less measured application CPU. BonVoyage retained materially lower resident memory and fewer descriptors. A fair report needs both observations.

v1.0.4 480K header-transformation operating point
More columns
Frozen 80% operating point · Three-run medians · 172,800,000 measured requests
GatewaySuccessful RPSTail-gate passesp50p95p99App CPU (avg core-eq)RSSDescriptors
BonVoyage479,929.53/30.657 ms1.367 ms31.709 ms22.12601.2 MiB3,943
NGINX479,930.23/30.589 ms1.335 ms29.711 ms13.97956.4 MiB5,225

The retained runs, replayed through the observability cockpit.

Each view was generated from checksum-verified per-run summaries labeled shared-vm-directional. They make repetition and gate outcomes easier to inspect without replacing the tables or retained evidence authority.

Grafana dashboard showing six accepted BonVoyage and NGINX measurements at the 480K header-transformation point.
480K operating point. Six of six measurements passed. NGINX retained slightly lower primary latency and measured application CPU; BonVoyage retained lower RSS and descriptor use.
Grafana dashboard showing four accepted measurements and the retained BonVoyage and NGINX tail results at the 600K diagnostic point.
600K supplemental diagnostic. Four of six measurements passed: BonVoyage 3/3 and NGINX 1/3. The two rejected NGINX tail repetitions remain visible.

These are local Grafana visualizations of retained AWS result summaries, not live AWS telemetry or raw time-series samples from the original load windows.

What did the actual combined policy chain cost?

D03 measured BonVoyage against its payload-matched control at 24,000 offered RPS. The control established the cost of the same transport and payload without the composed policy path. The policy profile then exercised twelve components together, including RS256 JWT, source-IP admission, CORS, content guards, local admission controls, header transformations, rewrites, retry budget and passive endpoint health. It did not estimate the result by adding separate policy tests.

Expected result: positive traffic had to reach the upstream with the exact transformations, while missing JWT, denied source, invalid content type and preflight cases had to return their exact bounded outcomes. Why it was accepted: All three control and all three combined-policy measurements reconciled, every warmup and measured request succeeded, all six positive and negative semantic cases passed, primary tails stayed inside the gate, and no gateway restart occurred.

v1.0.4 D03 combined-policy feature cost
More columns
Three-run medians · 8,640,000 measured requests
ProfileSuccessful RPSp50p95p99App CPU (avg core-eq)Host CPURSSDescriptors
Payload-matched control23,999.250.238 ms0.300 ms0.335 ms7.45623.32%552.75 MiB203
Combined policy23,999.210.285 ms0.362 ms0.412 ms8.11924.30%555.19 MiB211
Measured increment. The composed chain added 20.70% at p95, 23.12% at p99, 8.89% application CPU and 0.44% RSS at this fixed rate. All six measurements passed; all 34,560,000 warmup and measurement requests succeeded with zero gateway restarts. This is BonVoyage-only incremental feature cost at one fixed moderate rate. It is not a comparator, maximum-capacity or saturation result.

What outcome can an operator take from this?

Bounded tails under pressure

At the tested 600K diagnostic, BonVoyage kept p99 within the stated service gate in every repetition. The useful outcome is repeatable tail control, not a peak-RPS slogan.

More room inside a memory budget

At 480K and 600K, BonVoyage used materially less resident memory and fewer descriptors in this topology. Teams can evaluate whether that density matters on their own edge or platform nodes.

Policy cost before production

The composed-policy replay makes the latency, CPU and memory increment visible before an operator adopts the path. It replaces an assumption with a bounded measurement.

A decision that can be challenged

Exact artifact identities, setup, gates, accepted runs and rejected attempts make the result reproducible and falsifiable. An engineering team can rerun the contract against its own API and SLO.

Evidence class: Shared-EC2 directional evidence. Shared EC2 does not prove dedicated-host, NUMA or physical-NIC behavior. The 600K point is a supplemental diagnostic outside the frozen 20/40/60/80% curve. p99.9 remains diagnostic; p95 and p99 control the tail gate. The public package is a sanitized derived summary, not the raw evidence authority.

HISTORICAL EVIDENCE / SEPTEMBER 18, 2026

The earlier campaigns remain available, but separate.

The September tables belong to older BonVoyage builds and different test questions. They remain public for transparency and historical comparison, but they are no longer mixed into the v1.0.4 performance story.

Open the historical benchmark archive

What we are not claiming.

Not universally faster.

NGINX led several throughput and moderate-load latency profiles and consumed less measured application CPU at several points. A qualified stability result on one workload is not superiority across gateways.

Not an internal NGINX diagnosis.

Lower CPU alongside a missed tail gate is not proof of efficiency, but it also does not identify scheduler stalls, lock contention or queue saturation. Those explanations require separate profiling.

Not your infrastructure savings.

Operating cost depends on policies, payloads, hardware, utilization, migration effort, and your SLOs. Evaluate your actual service.

Historical claims stay historical.

The September campaigns remain bound to their September 18 builds. Only the November replay section is bound to public v1.0.4.

Not maximum capacity.

The replay uses fixed offered rates on shared virtual machines. It records operating and failure boundaries, not a dedicated-host ceiling or production sizing promise.

Build a fair comparison for your workload

START WITH ONE SERVICE

Your traffic is the real test.

Bring your workload, your policies, and your latency budget.