Skip to content

Benchmark Fanout v2026.10 on throwaway Hetzner VMs with separate generators - #1

Merged
vishr merged 4 commits into
mainfrom
feat/split-generators
Oct 15, 2026
Merged

vishr merged 4 commits into
mainfrom
feat/split-generators

Conversation

@vishr

@vishr vishr commented Oct 15, 2026

Copy link
Copy Markdown
Member

Summary

  • Port the harness to Fanout v2026.10.1-alpha: single FANOUT_ADDR, private /metrics with a per-run token, the current setup and ingest-token flow, and release tags with a maturity suffix.
  • Replace the read load with the operations the UI issues: a System overview refresh, an exemplar drill-down, and trace detail in the trace's own window.
  • Add scripts/hetzner.sh and just hetzner: throwaway Hetzner Cloud VMs that are always deleted, including when the script is stopped or a create is interrupted.
  • Run the generators on a separate VM so the Fanout VM only ingests. Fanout listens on a private network; each telemetrygen process is launched on the generator VM over SSH with a run-scoped key, keepalives and deadlines. Reports record both hosts and redact every address.

Verification

  • just test, go vet, bash -n and ShellCheck pass.
  • Two same-host smoke runs on ccx33 and one split smoke run (Fanout on ccx33, generators on ccx43) passed every quality gate; all VMs and networks were deleted afterwards.
  • A simulated stalled create followed by TERM reached cleanup within the bounded wait and deleted the resource by name.

vishr added 4 commits October 14, 2026 17:12
Port the harness to the current Fanout release and make a short-lived
Hetzner Cloud VM the standard publication host.

- Start Fanout with its environment-only configuration: one FANOUT_ADDR
  listener, chat disabled, and a per-run FANOUT_METRICS_TOKEN for the private
  /metrics endpoint. Setup must return the ingest token.
- Accept release versions with a maturity suffix, such as
  v2026.10.1-alpha.
- Replace the removed observability reads with the operations the UI issues:
  a System overview refresh (batched panel queries plus annotations), an
  exemplar drill-down, and trace detail within the discovered trace's own
  window. Latency covers the whole operation, any failed request or panel
  fails it, and the sustained read gate fails when an operation kind never
  succeeds.
- scripts/hetzner.sh creates one ccx33 VM, runs one or more `--`-separated
  benchmark groups on it, and always deletes it. Hetzner bills every started
  hour, so a publication run shares one VM between its ingest-only and
  read-under-write groups.
- Reports record the host description and redact the SSH address from the
  reproduction command.
Bash defers a trap until the foreground child exits, so TERM on the script
left the benchmark running and the VM billing until it finished. Run each
group as a background child and wait for it; INT or TERM now forwards the
signal, waits for the child, skips the remaining groups, and the existing
cleanup deletes the VM.
Provisioned runs placed telemetrygen on the Fanout VM, so the generators
took a large share of its CPUs and the result was a same-host ceiling.
scripts/hetzner.sh now creates a private network with a Fanout-only VM
(ccx33) and a generator VM (ccx43). The managed runner on the Fanout host
binds Fanout to its private address and launches every telemetrygen process
on the generator host over SSH, with a run-scoped key, keepalives, a client
deadline and a remote timeout. A per-run sshd drop-in lifts MaxStartups for
the largest phase's simultaneous launches. Reports record both hosts and
the generator placement, and redact every address in the reproduction
command. Cleanup removes the key, the drop-in, both VMs and the network,
including after an interrupted create. Plain --host runs stay same-host.
ShellCheck before 0.11 reports functions invoked only by traps as
unreachable (SC2317); 0.11 uses SC2329. Disable both on those functions.
@vishr
vishr merged commit 8f6a2a8 into main Oct 15, 2026
2 checks passed
@vishr
vishr deleted the feat/split-generators branch October 15, 2026 04:40
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant