Performance
On a Hetzner Cloud ccx33 (8 dedicated vCPUs, 32 GB RAM), with telemetrygen on a separate ccx33 over a private network, Fanout v2026.10.8-alpha accepted 415,859 mixed OpenTelemetry items/s over 303.5 seconds. The composition was 57,037 spans, 179,134 log records and 179,688 metric points per second. The run measured ingest only.
Setup and measurement
Section titled “Setup and measurement”Both hosts were described as Hetzner Cloud ccx33, fsn1, ubuntu-24.04. The Fanout host reported AMD EPYC-Milan Processor, 8 logical CPUs and 32,857,198,592 bytes of memory. telemetrygen v0.157.0 sent plaintext OTLP/gRPC over the private network, using 1,000-item batches and 8 workers per process.
The publish preset ran 1, 2, 4, 8, 16, 32 and 64 processes per signal
for traces, logs, metrics and mixed ingest, with 3 repetitions per point.
Accepted throughput is the change
in Fanout’s fanout_ingest_rows_total counter over the measured scrape window.
The suite accepted 575.8 million items in total: 135,133,541 spans, 210,698,970 log records and 229,999,166 metric points.
Measured mixed ingest
Section titled “Measured mixed ingest”The sustained phase ran for 303.5 seconds at 32 processes per signal. Fanout averaged 7.24 CPU cores and reached 11.4 GiB peak RSS. The generator host averaged 7.44 of 8 CPU cores.
| Signal | Accepted items/s |
|---|---|
| Spans | 57,037 |
| Log records | 179,134 |
| Metric points | 179,688 |
| Mixed total | 415,859 |
telemetrygen keeps one trace export in flight per process, while log and metric processes keep eight. Synthetic, highly compressible telemetrygen payloads measure ingest capacity on this hardware.
Median peaks
Section titled “Median peaks”Each peak is the highest median accepted rate in that workload’s recorded sweep. Ranges cover the three repetitions at the listed process count. CPU columns are median average cores at that count; each host has 8 cores.
| Workload | Median peak items/s | Processes per signal | Range items/s | Fanout CPU cores | Generator CPU cores | Repetitions |
|---|---|---|---|---|---|---|
| Mixed | 402,062 | 32 | 357,956–433,339 | 7.07 | 7.34 | 3 |
| Traces | 248,901 | 32 | 207,920–295,566 | 6.22 | 5.19 | 3 |
| Logs | 387,579 | 64 | 353,862–393,976 | 6.85 | 4.63 | 3 |
| Metrics | 524,878 | 64 | 472,496–561,000 | 6.06 | 5.31 | 3 |
Mixed sweep
Section titled “Mixed sweep”All rates below are accepted items/s across three repetitions per mixed process count. CPU columns are median average cores per host.
| Processes per signal | Median items/s | Min items/s | Max items/s | Fanout CPU cores | Generator CPU cores |
|---|---|---|---|---|---|
| 1 | 39,041 | 38,296 | 39,149 | 4.72 | 0.80 |
| 2 | 77,784 | 75,221 | 78,573 | 4.30 | 1.77 |
| 4 | 146,792 | 146,445 | 155,962 | 4.86 | 1.87 |
| 8 | 223,985 | 216,861 | 238,993 | 6.06 | 3.03 |
| 16 | 359,086 | 335,283 | 379,219 | 6.35 | 5.78 |
| 32 | 402,062 | 357,956 | 433,339 | 7.07 | 7.34 |
| 64 | 385,274 | 384,289 | 414,315 | 6.86 | 7.35 |
Signal sweeps
Section titled “Signal sweeps”The charts share a vertical scale and an evenly spaced log2 process axis. Lines and points show the median; bands show the recorded minimum and maximum. The diamond marks the sustained phase at 32 processes per signal. The shaded region marks generator CPU of at least 7 cores.
Evidence
Section titled “Evidence”The published evidence
contains report.json and samples.jsonl, produced by
Fanout Bench on 16 October 2026 at
17:36 UTC. All quality gates passed: successful generator exits, zero dropped
rows, no restarts, authoritative accepted-row counters in every phase and
verified Parquet storage.
The harness commit was
8f5864ba488d9802f68250d85f67b6658ab13af5.
The Fanout release artifact has SHA-256:
b314920221693683b7d6ff42787a37e82bee1fbdd7ddcc8647d1905f7629ac6bReproduce
Section titled “Reproduce”From the fanout-bench repository:
scripts/hetzner.sh \ --fanout-version v2026.10.8-alpha \ --preset publish \ --repeat 3Both VMs default to ccx33. The publishing guide documents provisioning, the private network and artifact collection.
Regenerate the website’s data from the completed run:
node site/scripts/benchmark-data.mjs report.json samples.jsonl EVIDENCE_URLUpdate authored headline figures with the report; the site build checks them against the data.