---
title: "Performance"
summary: "Sustained mixed ingest at 507,311 items/s on a Hetzner ccx33."
description: "Measured ingest rates, hardware, methodology and benchmark evidence."
status: shipped
read_when:
  - "You want to understand the performance figure on the landing page."
  - "You need to measure an instance for your own load."
---

On a Hetzner Cloud ccx33 (8 dedicated vCPUs, 32 GB RAM), with telemetrygen
on a separate ccx33 over a private network, Pitot v2026.11.0-alpha accepted
**507,311 mixed OpenTelemetry items/s** over **306.8 seconds**.
The composition was 61,571 spans, 224,112 log records and
221,628 metric points per second. The run measured ingest only. Reads under sustained ingest did not meet the read target and are tracked in [issue #419](https://github.com/labstack/pitot/issues/419).

## Setup and measurement

Both hosts were described as **Hetzner Cloud ccx33, fsn1, ubuntu-24.04**. The Pitot host
reported AMD EPYC-Milan Processor, 8 logical CPUs and
32,857,186,304 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 Pitot's `pitot_ingest_rows_total` counter over the measured scrape window.

The suite accepted **667.3 million items** in total: 145,879,781 spans,
265,470,588 log records and 255,924,526 metric points.

## Measured mixed ingest

The sustained phase ran for **306.8 seconds** at 64 processes per signal.
Pitot averaged **7.73 CPU cores** and reached **10.6 GiB peak RSS**.
The generator host averaged **7.93 of 8 CPU cores**.
The sustained phase is classified generator-limited.

| Signal | Accepted items/s |
|---|---:|
| Spans | 61,571 |
| Log records | 224,112 |
| Metric points | 221,628 |
| Mixed total | 507,311 |

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

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 | Pitot CPU cores | Generator CPU cores | Repetitions |
|---|---:|---:|---:|---:|---:|---:|
| Mixed | 460,640 | 64 | 453,181–485,193 | 7.22 | 7.39 | 3 |
| Traces | 297,345 | 64 | 192,120–330,450 | 6.97 | 7.24 | 3 |
| Logs | 622,229 | 64 | 558,932–648,672 | 6.02 | 6.38 | 3 |
| Metrics | 488,431 | 64 | 486,759–532,625 | 6.35 | 4.71 | 3 |

## 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 | Pitot CPU cores | Generator CPU cores |
|---|---:|---:|---:|---:|---:|
| 1 | 38,820 | 38,640 | 39,227 | 5.47 | 0.82 |
| 2 | 76,587 | 76,483 | 76,741 | 6.15 | 1.71 |
| 4 | 155,156 | 149,499 | 155,707 | 5.91 | 2.16 |
| 8 | 262,749 | 261,501 | 270,231 | 7.01 | 2.93 |
| 16 | 380,026 | 323,029 | 429,748 | 7.33 | 5.00 |
| 32 | 442,361 | 432,734 | 450,588 | 7.37 | 7.14 |
| 64 | 460,640 | 453,181 | 485,193 | 7.22 | 7.39 |

## 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 64 processes per signal.
The shaded region marks generator CPU of at least 7 cores.

## Evidence

The [published evidence](https://github.com/labstack/pitot-bench/tree/main/published/2026-11-06-ccx33x2-v2026.11.0-alpha)
contains `report.json` and `samples.jsonl`, produced by
[Pitot Bench](https://github.com/labstack/pitot-bench) on 6 November 2026 at
04:15 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
[`5462cbbcde9c49521c918c45f45312493aa4bb24`](https://github.com/labstack/pitot-bench/commit/5462cbbcde9c49521c918c45f45312493aa4bb24); the harness working tree was clean.
The [Pitot release artifact](https://github.com/labstack/pitot/releases/download/v2026.11.0-alpha/pitot_v2026.11.0-alpha_linux_amd64.tar.gz) has SHA-256:

```text
1e83657b9eb0ff7e7ad406bd5162642badf087c380448deebd1f88b183656ddc
```

## Reproduce

From the [pitot-bench](https://github.com/labstack/pitot-bench) repository:

```sh
PITOT_BENCH_HCLOUD_SSH_KEY='<key>' scripts/hetzner.sh \
  --pitot-version v2026.11.0-alpha \
  --preset publish \
  --repeat 3 \
  --output results/publish-ingest-ccx33x2-v2026.11.0-alpha
```

Both VMs default to ccx33. The
[publishing guide](https://github.com/labstack/pitot-bench/blob/main/docs/publishing.md)
documents provisioning, the private network and artifact collection.

Regenerate the website's data from the completed run:

```sh
node site/scripts/benchmark-data.mjs report.json samples.jsonl EVIDENCE_URL
```

Update authored headline figures with the report; the site build checks them
against the data.