Internals: benchmark reports

Release build on AlmaLinux 8 against the Ubuntu 24.04 build, 2026-10-27

Gate for the EL8 release build (scripts/release-build.sh, docker/el8-build.Dockerfile): the EL8 build must be as fast as the 1.0.0~rc.1-11 package or faster in every scenario.

Machine, pinning and method as in 2026-10-12-xeon-release-run7.md and the regression checks of 2026-10-14/15: 2× Xeon E5-2650 v2, performance governor, turbo off. Server on CPUs 0-3 (socket 0, 4 workers), upstream and applications on 4-7, oha 1.16.0 on 8-15 and 24-31 (socket 1), 64 connections. bench/multi.sh, MODE=release (10 s warm-up, 30 s measurement, 5 runs per round, variant order rotating), run three times (rounds 1-3, 2026-10-27 22:46 to 2026-10-28 00:54 local). Every measurement answered 2xx only; no run was excluded.

Binaries (scalwsd, same source tree, byte-identical crates, cmd, Cargo.lock):

  • rc1-11: from the published scalws_1.0.0~rc.1-11_amd64.deb (ubuntu:24.04 container, glibc 2.39, Ubuntu gcc 13.3 for the C code).
  • el8: from scripts/release-build.sh with SCALWS_RELEASE=12pre1 (almalinux:8.10, glibc 2.28, gcc-toolset-13 gcc 13.3.1 for the C code); newest symbol version GLIBC_2.28.

Both: rustc 1.99.1, rust-lld 23.1.1, the workspace release profile (thin LTO, codegen-units = 1), mimalloc (default feature), no PGO or BOLT, no http3 feature, no extra target features (no AVX2). Since neither package has http3, both were started through a wrapper that drops the http3: true line from bench/configs/scalws.yaml (a wrapper script, exec, so the server pid is measured).

Requests per second (median of each 5-run round)

scenarioroundrc1-11el8el8 / rc1-11
static-small1 / 2 / 369 873 / 69 944 / 69 35869 742 / 70 059 / 69 4290.998 / 1.002 / 1.001
tls-h2-static-small1 / 2 / 358 484 / 57 902 / 58 32558 225 / 58 790 / 58 8350.996 / 1.015 / 1.009
proxy1 / 2 / 346 329 / 46 203 / 46 17946 436 / 46 453 / 46 4051.002 / 1.005 / 1.005
php1 / 2 / 334 803 / 34 959 / 34 76334 865 / 34 299 / 34 8651.002 / 0.981 / 1.003
respond1 / 2 / 3112 150 / 111 352 / 109 872110 961 / 112 542 / 111 1560.989 / 1.011 / 1.012
cache-hit1 / 2 / 384 386 / 85 020 / 84 49785 654 / 85 899 / 85 3051.015 / 1.010 / 1.010

Result

Gate value: the median of the three per-round ratios (each round measures both builds in the same window, so machine drift between rounds cancels).

scenariomedian ratiopooled median req/s (15 runs) rc1-11 / el8pooled ratiocpu_us rc1-11 / el8p99 ms rc1-11 / el8gate
static-small1.00169 873 / 69 4900.99557.24 / 57.551.18 / 1.20PASS
tls-h2-static-small1.00958 325 / 58 5961.00568.43 / 68.112.31 / 2.26PASS
proxy1.00546 182 / 46 4461.00686.60 / 86.112.22 / 2.15PASS
php1.00234 811 / 34 7870.99992.36 / 91.832.11 / 2.12PASS
respond1.011111 352 / 111 1560.99835.91 / 35.970.71 / 0.73PASS
cache-hit1.01084 969 / 85 6541.00847.07 / 46.690.95 / 0.97PASS

(cpu_us is server CPU per request, p99 the p99 latency; both medians of the 15 runs.)

Spread: the CV of a 5-run round is 0.2 % to 3.2 % (php up to 3.2 %, tls-h2-static-small up to 2.9 %, the rest at most 1.6 %). The three pooled ratios below 1.000 (static-small 0.995, respond 0.998, php 0.999) are smaller than that spread, and each of these scenarios has rounds in both directions (static-small 0.998 / 1.002 / 1.001, respond 0.989 / 1.011 / 1.012, php 1.002 / 0.981 / 1.003). No scenario is slower beyond noise, so nothing was changed in the build; the candidates the gate would have pointed at (C toolchain, allocator, linker and LTO settings) are already the same in both builds as listed above.

The EL8 build therefore replaces the Ubuntu build for both packages: the .deb and the .rpm are made from the same binaries.

Results, in the bench host’s results directory: results/xeon-el8-build-1, -2, -3 (aggregate.csv, aggregate.txt, run-N); binaries /opt/scalws-rc1-11/scalwsd.real and /opt/scalws-el8-12pre1/scalwsd.real.