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

URL: https://scalws.com/docs/benchmarks/2026-10-27-el8-build/
Source: `docs/benchmarks/2026-10-27-el8-build.md` in the ScalWS repository

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)

| scenario | round | rc1-11 | el8 | el8 / rc1-11 |
|---|---|---:|---:|---:|
| static-small | 1 / 2 / 3 | 69 873 / 69 944 / 69 358 | 69 742 / 70 059 / 69 429 | 0.998 / 1.002 / 1.001 |
| tls-h2-static-small | 1 / 2 / 3 | 58 484 / 57 902 / 58 325 | 58 225 / 58 790 / 58 835 | 0.996 / 1.015 / 1.009 |
| proxy | 1 / 2 / 3 | 46 329 / 46 203 / 46 179 | 46 436 / 46 453 / 46 405 | 1.002 / 1.005 / 1.005 |
| php | 1 / 2 / 3 | 34 803 / 34 959 / 34 763 | 34 865 / 34 299 / 34 865 | 1.002 / 0.981 / 1.003 |
| respond | 1 / 2 / 3 | 112 150 / 111 352 / 109 872 | 110 961 / 112 542 / 111 156 | 0.989 / 1.011 / 1.012 |
| cache-hit | 1 / 2 / 3 | 84 386 / 85 020 / 84 497 | 85 654 / 85 899 / 85 305 | 1.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).

| scenario | median ratio | pooled median req/s (15 runs) rc1-11 / el8 | pooled ratio | cpu_us rc1-11 / el8 | p99 ms rc1-11 / el8 | gate |
|---|---:|---|---:|---|---|---|
| static-small | 1.001 | 69 873 / 69 490 | 0.995 | 57.24 / 57.55 | 1.18 / 1.20 | PASS |
| tls-h2-static-small | 1.009 | 58 325 / 58 596 | 1.005 | 68.43 / 68.11 | 2.31 / 2.26 | PASS |
| proxy | 1.005 | 46 182 / 46 446 | 1.006 | 86.60 / 86.11 | 2.22 / 2.15 | PASS |
| php | 1.002 | 34 811 / 34 787 | 0.999 | 92.36 / 91.83 | 2.11 / 2.12 | PASS |
| respond | 1.011 | 111 352 / 111 156 | 0.998 | 35.91 / 35.97 | 0.71 / 0.73 | PASS |
| cache-hit | 1.010 | 84 969 / 85 654 | 1.008 | 47.07 / 46.69 | 0.95 / 0.97 | PASS |

(`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`.
