Internals: benchmark reports

Release-mode comparison on the VM (run 7): 2026-10-12

The run-7 binaries on the development VM of the 2026-10-06 runs, with the same method, so the release-mode numbers of both hosts can be read side by side.

Host: VMware VM, AMD EPYC 7642, 8 vCPU, 31 GiB, Ubuntu 24.04, kernel 6.8. Server on CPUs 0-1 (two workers or event loops), applications on 2-3, oha on 4-7; 64 connections; one NOFILE limit of 65535 for every process; kTLS and the open-file cache off on both servers. The VM also served its usual low-traffic websites during the run (other CPUs, no pinning); every server saw the same conditions, runs rotated the server order. MODE=release: 10 s warm-up, 30 s measurement, 5 runs, medians. scalws: the PGO + BOLT build of run 7 (ADR-0047, commit a7dc639); final with both experimental settings, final-hyper with defaults. Versions: nginx 1.24.0 (Ubuntu 24.04 package) and 1.31.6 (built from the signed source tarball on this host); PHP-FPM 8.3, Node 18, uvicorn 0.37 with two workers. Every measurement of every server answered 2xx only. No run was excluded.

scenarioscalws finalfinal-hypernginx 1.24nginx 1.31final / nginx 1.31final / nginx 1.24
static-small70 55568 71768 17068 2531.031.03
static-1m8 1368 2908 3818 5610.950.97
respond109 391104 219110 143116 9920.940.99
proxy57 00952 45751 66853 6831.061.10
cache-hit99 28991 38462 57663 0911.571.59
tls-h2-static-small63 49763 03457 31261 2331.041.11
tls-static-1m1 8081 7451 2181 2061.501.48
php29 27627 53024 81025 1781.161.18
node27 87926 46427 76828 4350.981.00
python11 94712 17411 99311 8021.011.00

p99 latency of every server (ms, median of 5 runs, p99_ms):

scenarioscalws finalfinal-hypernginx 1.24nginx 1.31
static-small1.611.801.651.60
static-1m13.5013.8513.4313.21
respond1.031.071.010.95
proxy2.082.552.181.98
cache-hit1.091.201.741.76
tls-h2-static-small1.942.161.881.79
tls-static-1m81.3872.3887.4879.76
php3.424.044.644.26
node4.725.224.765.05
python12.3810.2710.3910.83

Server CPU per request of every server (µs, median of 5 runs, cpu_us_per_req):

scenarioscalws finalfinal-hypernginx 1.24nginx 1.31
static-small28.3029.0529.2129.27
static-1m245.38240.92238.29233.04
respond18.2519.1518.1217.06
proxy35.0337.9638.5837.19
cache-hit20.1121.8431.9331.67
tls-h2-static-small31.4031.6134.7732.54
tls-static-1m1103.381143.081638.851654.31
php49.5157.7072.4971.42
node44.0948.2547.9645.58
python74.7081.9279.7774.70

Peak resident memory of the server processes (MiB, median of 5 runs, peak_rss_mib):

scenarioscalws finalfinal-hypernginx 1.24nginx 1.31
static-small32354647
static-1m34354647
respond32354647
proxy34414849
cache-hit33354747
tls-h2-static-small39395455
tls-static-1m40475455
php34374748
node34364848
python35374849

Run-to-run spread (coefficient of variation of requests/s, %), scalws final / nginx 1.31: static-small 3.6 / 1.6; static-1m 1.8 / 2.6; respond 1.6 / 3.8; proxy 4.2 / 7.2; cache-hit 5.0 / 4.0; tls-h2-static-small 4.0 / 2.5; tls-static-1m 10.2 / 1.5; php 9.1 / 5.8; node 4.7 / 7.4; python 3.7 / 2.2.

Reading it

  • ScalWS is ahead of nginx 1.31 on the small static file (1.03×), the reverse proxy (1.06×), cache hits (1.57×), TLS + HTTP/2 (1.04×), HTTPS 1 MiB (1.50×) and PHP (1.16×); level on Python (1.01×) and Node.js (0.98×, inside the spread of both); behind on the fixed response (0.94×) and the 1 MiB file over plain HTTP (0.95×).
  • The fixed-response gap is the one bare metal shows as well (0.97× there); on two VM CPUs nginx 1.31’s lead is larger.
  • The VM’s run-to-run spread is wider than bare metal’s (coefficient of variation up to 10 % for the HTTPS 1 MiB scenario): read ratios within about 5 % as level.
  • Compared with the 2026-10-06 baseline on the same VM (scalws 1.0.0-rc.1 before the Adaptive Runtime, against nginx 1.24): fixed response 0.85× → 0.99×, reverse proxy 0.93× → 1.10×, Node.js 0.79× → 1.00× against nginx 1.24.

Results: results/vm-r7 on the VM (aggregate.csv, aggregate.txt, run-1 … run-5).