Internals: benchmark reports

Ingress controller core additions: unused-feature regression check, 2026-10-14

This file holds two rounds: the first run (HEAD 7b7b57e, kept as history) failed the gate on respond; the second round (fix 2ab0e83) is under “Round 2” at the end.

Machine, pinning and method as in 2026-10-14-xeon-routing-pools-regression.md: 2× Xeon E5-2650 v2, performance governor, turbo off. Server on CPUs 0-3 (4 workers), upstream and applications on 4-7, oha 1.16.0 on 8-15 and 24-31, 64 connections.

Commits: base = 90642de (main before the ingress controller branch), new = 7b7b57e (catch-all domain *, route https_redirect, and the rest of the branch). Both are plain release builds (cargo build --release --locked -p scalwsd --features http3, thin LTO, no PGO or BOLT), so the numbers are only comparable with each other.

Configuration: bench/configs/scalws.yaml unchanged, so neither the catch-all domain nor a route https_redirect is configured. bench/multi.sh, MODE=release (10 s warm-up, 30 s measurement, 5 runs, variant order rotating), medians. Every measurement answered 2xx only; no run was excluded.

Gate: new requests per second at least 0.98× base.

scenariobase req/snew req/snew / basecpu_us basecpu_us newcpu new / basegate
static-small74 78374 1230.99153.4853.951.009pass
respond126 492123 1100.97331.6232.481.027FAIL
proxy50 74350 5670.99778.8279.091.003pass
cache-hit93 62792 1510.98442.7243.391.016pass

Spread of the five runs (req/s, min to max, CV): static-small base 74 396-76 116 (1.0 %), new 73 069-74 838 (1.0 %); respond base 124 855-127 209 (0.7 %), new 120 906-124 099 (1.0 %); proxy base 49 828-51 100 (1.0 %), new 49 593-50 679 (0.9 %); cache-hit base 92 579-94 137 (0.6 %), new 91 058-93 332 (1.0 %).

p99 latency (ms), base / new: static-small 1.09 / 1.06; respond 0.64 / 0.66; proxy 2.00 / 1.94; cache-hit 0.90 / 0.87.

Peak resident memory (MiB), base / new: static-small 43 / 43; respond 42 / 42; proxy 48 / 49; cache-hit 48 / 49.

Repeat of respond

The respond scenario alone, same method, 5 more runs: base 126 515 (122 009-127 194, CV 1.7 %), new 123 535 (120 376-125 106, CV 1.4 %), ratio 0.976, cpu_us 31.61 / 32.37 (1.024), p99 0.60 / 0.65 ms. The drop reproduces, so it is not a one-off.

Verdict of round 1

The gate does not hold for respond (0.973 and 0.976, CPU per request +2.4 % to +2.7 %). static-small, proxy and cache-hit pass; cache-hit (0.984) is close to the limit.

The code paths that differ for a configuration without * and without route https_redirect are small: the host lookup does the same exact-match hash lookup first (the catch_all field is only read after an exact and a wildcard miss), and the plain-HTTP branch in pipeline.rs reads one extra bool (route_https_redirect) before falling back to app.https_redirect. Neither is expected to cost about 0.8 us per request, so a layout or inlining effect of the changed request function is the likely cause, but this is not confirmed: no profile was taken in this run (see the follow-up in the task report).

Results, in the bench host’s results directory: results/xeon-ingress-ab and results/xeon-ingress-ab-respond (aggregate.csv, aggregate.txt, run-N); binaries /opt/scalws-ingress-base/scalwsd and /opt/scalws-ingress-new/scalwsd.

Round 2: hot path restored (2ab0e83)

Changes, no behaviour change: AppEntry.redirect_check (https_redirect or any route https_redirect) is precomputed, so the hot path is again one flag test (if app.redirect_check && scheme == Http), and the route lookup and decision moved to a #[cold] #[inline(never)] helper wants_https_redirect. In HostRouter the exact hit is unchanged and the wildcard and catch-all tail is an out-of-line get_fallback. Tests (scalws-router, scalws-server, integration routing), fmt and clippy pass.

A/A noise (base binary against itself, respond, 5 runs): 125 585 against 124 786, ratio 0.994, run ranges 121 110-127 283 and 123 310-125 491 (min to max about 5 %). A/A cache-hit: 95 805 against 95 855, ratio 1.000. Single A/B medians therefore move by about 1 % without any code difference.

A/B, all four scenarios, 5 runs (xeon-ingress-ab2):

scenariobase req/snew req/snew / basecpu_us basecpu_us newcpu new / basegate
static-small75 01674 5220.99353.3153.661.007pass
respond126 651124 9450.98731.5732.001.014pass
proxy50 15950 3241.00379.7479.470.997pass
cache-hit94 74192 8030.980 (0.9795)42.2143.081.021borderline

cache-hit landed on the limit (0.9795 unrounded), so it was repeated alone (xeon-ingress-ab2-cache): base 95 874, new 94 960, ratio 0.991, cpu_us 41.71 / 42.11 (1.010). Across the three cache-hit A/B runs the ratio is 0.984, 0.980, 0.991; the A/A ratio is 1.000. Peak RSS equal within 2 MiB; p99 equal within noise. No perf profile was taken since the gate holds on the repeat.

Results, in the bench host’s results directory: results/xeon-ingress-{aa-respond,ab2,ab2-cache,aa-cache}.