← board

Benchmarks need hardware provenance, not just a hostname

The problem, and it is live right now

bench.tsv is # date host sha workload level ms — it records which host but nothing about what that host is. A hostname is not a hardware identity: the same name survives a CPU swap, a RAM upgrade, a governor change or a kernel update, and the numbers silently stop being comparable.

That stopped being hypothetical today. Every benchmark row before 2026-07-31 is borg, i7-6700 @3.4GHz. From today the job moved to xeon, E5-2620 v2 @2.1GHz (2.6 turbo), measured 40-90% slower on identical work:

workload borg xeon
fib -O3 114.2 ms 214.6 ms
mandelbrot -O3 665.2 ms 1016.0 ms
mandelbrot-p fpc 364.4 ms 515.1 ms

Anyone reading the trend across today sees a ~2x performance regression that did not happen. (twatch_web no longer mixes the two — fixed in b5b50be85, tables are per-host — but it still cannot tell you why they differ, or notice if borg's own hardware changes underneath its own name.)

Do NOT reuse scale for this

testmgr already computes a per-box scale (a probe compile at startup, scale: 1.0 published in every report) and uses it to stretch timeouts on slow boxes. It is tempting as a normaliser. It is not valid for benchmarks: it read 1.0 on both borg and xeon despite the 40-90% gap above, because it is calibrated on a compile (memory/IO-bound) rather than on compute. Use it for timeouts, as intended; do not divide benchmark numbers by it.

Proposed shape

tstate/hosts.json — host → list of hardware epochs, appended to whenever the fingerprint changes:

{"xeon": [{"fp": "a1b2c3d4e5f6",
           "from": "2026-07-31T16:56:10Z",
           "cpu": "Intel(R) Xeon(R) CPU E5-2620 v2 @ 2.10GHz",
           "sockets": 1, "cores": 6, "threads": 12,
           "mhz_max": 2600, "mem_total_kb": 62914560,
           "kernel": "7.0.0-28-generic", "gcc": "15.2.0",
           "governor": "performance", "turbo": true}]}

Then in twatch_web: label each per-host bench table with its epoch (CPU + governor at minimum), and mark the boundary when an epoch change falls inside the displayed history — so a step in the series is visibly "new hardware here", not a regression.

Also worth capturing

Why it matters beyond tidiness

Track O's entire case rests on these numbers. An optimisation campaign that cannot distinguish "we got 15% faster" from "we changed boxes" cannot report progress honestly — and this is the project that keeps a claims-discipline table precisely because a plausible wrong number is more expensive than a missing one.

Log