# Hetzner CAX21

Falkenstein DC Park 1

Benchmark complete

Finished Oct 15, 2026

Geekbench 7 single-core

963

Faster than 33% of 4 vCPU plans

Geekbench 7 multi-core

3,424

Faster than 44% of 4 vCPU plans

Disk 4K IOPS

58,137

fio random read and write, 50/50

Monthly price at test time

$12.49

274 multi-core points per dollar

Same price today

## Server

[Hetzner](https://rackcensus.com/vps-providers/hetzner-benchmarks)[CAX21](https://rackcensus.com/plans/8y9brv-hetzner-cax21-benchmarks?location=fsn1)

-

Provider

Hetzner

-

Plan

CAX21

-

Location

Falkenstein DC Park 1

-

vCPU

4

-

RAM

8 GB

-

Storage

80 GB NVMe

-

Network

Unknown

-

OS image

ubuntu-24.04

-

Trigger

Scheduled

-

Queued at

Oct 15, 2026, 11:54:00 UTC

[Visit Hetzner](https://rackcensus.com/go/hetzner)

## CPU

| Version | Single-core | Multi-core | Result link |
| --- | --- | --- | --- |
| Geekbench 7 | 963 | 3,424 | [Geekbench Browser](https://browser.geekbench.com/v7/cpu/638042) |

Scores from different Geekbench versions aren't comparable with each other. Charts only use Geekbench 7.

## Memory, TLS and scheduler

### Memory bandwidth (STREAM)

| Test | Result | Runs | Spread |
| --- | --- | --- | --- |
| Copy higher is better | 73.4 GB/s | 3 | 2.06% |
| Scale higher is better | 73.2 GB/s | 3 | 0.941% |
| Add higher is better | 69.2 GB/s | 3 | 1.36% |
| Triad higher is better | 69.8 GB/s | 3 | 2.54% |

Average of 3 runs. Spread is the standard deviation as a share of the average.

### TLS and crypto (OpenSSL)

| Test | Result | Runs | Spread |
| --- | --- | --- | --- |
| RSA 4096 signs higher is better | 194/s | 3 | 0.555% |
| RSA 4096 verifies higher is better | 15,893/s | 3 | 0.162% |
| SHA-256 higher is better | 2.9 GB/s | 3 | 0.904% |
| AES-256-GCM higher is better | 9.39 GB/s | 3 | 0.0515% |
| ChaCha20-Poly1305 higher is better | 3.45 GB/s | 3 | 0.0639% |

Average of 3 runs. Spread is the standard deviation as a share of the average.

### Scheduler latency (schbench)

| Test | Result | Runs | Spread |
| --- | --- | --- | --- |
| Request latency, median lower is better | 15 ms | 3 | 0.123% |
| Requests per second, 90th percentile higher is better | 263/s | 3 | 0.219% |
| Request latency, 99.9th percentile lower is better | 24.4 ms | 3 | 11.1% |
| Requests per second, average higher is better | 262/s | 3 | 0.046% |

Average of 3 runs. Spread is the standard deviation as a share of the average.

## Disk

| Block size | Read | Write | Total |
| --- | --- | --- | --- |
| 4K | 113.6 MB/s (29,078 IOPS) | 113.5 MB/s (29,059 IOPS) | 227.1 MB/s (58,137 IOPS) |
| 64K | 946.5 MB/s (15,144 IOPS) | 974.7 MB/s (15,594 IOPS) | 1.88 GB/s (30,738 IOPS) |
| 512K | 1.08 GB/s (2,221 IOPS) | 1.18 GB/s (2,411 IOPS) | 2.26 GB/s (4,632 IOPS) |
| 1M | 1.29 GB/s (1,318 IOPS) | 1.44 GB/s (1,471 IOPS) | 2.72 GB/s (2,789 IOPS) |

fio random read and write, 50/50, run by YABS against the boot disk.

## Network

### IPv4 transfer speed

Loading...

| Target | Protocol | Send | Receive |
| --- | --- | --- | --- |
| Clouvider, London, UK (10G) | IPv4 | 4.77 Gbps | 4.51 Gbps |
| Eranium, Amsterdam, NL (100G) | IPv4 | 5.99 Gbps | 5.43 Gbps |
| Leaseweb, Singapore, SG (10G) | IPv4 | 1.07 Gbps | 1.35 Gbps |
| Clouvider, Los Angeles, CA, US (10G) | IPv4 | 830 Mbps | 1.23 Gbps |
| Leaseweb, NYC, NY, US (10G) | IPv4 | 1.79 Gbps | 2.61 Gbps |

Public iperf3 servers vary in capacity and availability. Compare a target only with itself over time.

## Datastores

### PostgreSQL

#### fsync speed (pg\_test\_fsync)

| Method | Operations per second | Time per operation |
| --- | --- | --- |
| One 8 kB write |
| --- |
| open\_datasync | 3,362 | 0.297 ms |
| fdatasync | 3,139 | 0.319 ms |
| fsync | 1,210 | 0.827 ms |
| fsync\_writethrough | Not supported here | n/a |
| open\_sync | 1,204 | 0.831 ms |
| Two 8 kB writes |
| --- |
| open\_datasync | 1,569 | 0.637 ms |
| fdatasync | 2,807 | 0.356 ms |
| fsync | 1,155 | 0.866 ms |
| fsync\_writethrough | Not supported here | n/a |
| open\_sync | 623 | 1.61 ms |
| open\_sync at different write sizes |
| --- |
| 1 \* 16kB open\_sync write | 1,189 | 0.841 ms |
| 2 \* 8kB open\_sync writes | 635 | 1.57 ms |
| 4 \* 4kB open\_sync writes | 304 | 3.29 ms |
| 8 \* 2kB open\_sync writes | 165 | 6.05 ms |
| 16 \* 1kB open\_sync writes | 78.3 | 12.8 ms |
| fsync on a non-write descriptor |
| --- |
| write, fsync, close | 1,124 | 0.89 ms |
| write, close, fsync | 1,138 | 0.879 ms |
| Non-synced 8 kB writes |
| --- |
| write | 1,016,768 | 0.001 ms |

pg\_test\_fsync against the Docker volume Postgres keeps its data on. fdatasync is Linux's default wal\_sync\_method.

#### pgbench at scale 10

| Workload | Clients | Transactions/s | Median | p95 | p99 | p99.9 | Failed |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Read/write (TPC-B like) | 1 | 1,075 | 0.854 ms | 1.35 ms | 1.88 ms | 3.45 ms | 0 |
| Read/write (TPC-B like) | 8 | 4,240 | 1.62 ms | 3.42 ms | 5.02 ms | 8.12 ms | 0 |
| Read/write (TPC-B like) | 32 | 4,438 | 5.44 ms | 18.2 ms | 30.5 ms | 46.7 ms | 0 |
| Read only | 1 | 18,718 | 0.046 ms | 0.083 ms | 0.122 ms | 0.22 ms | 0 |
| Read only | 8 | 63,214 | 0.115 ms | 0.221 ms | 0.282 ms | 0.486 ms | 0 |
| Read only | 32 | 63,397 | 0.461 ms | 0.772 ms | 0.976 ms | 1.56 ms | 0 |

Scale 10 (1,000,000 accounts), loaded in 1.45 s. 60 s per run, prepared statements. Latency comes from sampled transaction logs, and p99.9 is left out when fewer than 1,000 were sampled.

#### pgbench at scale 100

| Workload | Clients | Transactions/s | Median | p95 | p99 | p99.9 | Failed |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Read/write (TPC-B like) | 1 | 949 | 0.96 ms | 1.52 ms | 2.31 ms | 4.08 ms | 0 |
| Read/write (TPC-B like) | 8 | 4,247 | 1.67 ms | 2.97 ms | 7.2 ms | 11.8 ms | 0 |
| Read/write (TPC-B like) | 32 | 5,257 | 5.56 ms | 10 ms | 16.2 ms | 29.7 ms | 0 |
| Read only | 1 | 13,920 | 0.063 ms | 0.118 ms | 0.167 ms | 0.307 ms | 0 |
| Read only | 8 | 48,756 | 0.149 ms | 0.291 ms | 0.376 ms | 0.988 ms | 0 |
| Read only | 32 | 49,312 | 0.6 ms | 1 ms | 1.28 ms | 2.89 ms | 0 |

Scale 100 (10,000,000 accounts), loaded in 13.8 s. 60 s per run, prepared statements. Latency comes from sampled transaction logs, and p99.9 is left out when fewer than 1,000 were sampled.

### MySQL

#### sysbench OLTP

| Workload | Threads | Transactions/s | Queries/s | Median | p95 | p99 | Errors |
| --- | --- | --- | --- | --- | --- | --- | --- |
| Read/write | 1 | 188 | 3,761 | 5 ms | 7.17 ms | 11.7 ms | 0 |
| Read/write | 8 | 895 | 17,894 | 8.43 ms | 13.7 ms | 20.4 ms | 0 |
| Read/write | 32 | 1,108 | 22,169 | 27.7 ms | 47.5 ms | 57.9 ms | 0 |
| Read only | 1 | 621 | 9,938 | 1.5 ms | 2.31 ms | 3.02 ms | 0 |
| Read only | 8 | 2,389 | 38,218 | 3.25 ms | 4.82 ms | 6.1 ms | 0 |
| Read only | 32 | 2,138 | 34,211 | 15 ms | 20.4 ms | 23.9 ms | 0 |

10 tables of 100,000 rows, loaded in 6.1 s. 60 s per run, one connection per thread.

### Redis

#### memtier

| Mix | Operations/s | Hits/s | Median | p99 | p99.9 |
| --- | --- | --- | --- | --- | --- |
| 1:10 set:get | 81,964 | 74,512 | 0.751 ms | 1.5 ms | 2.62 ms |
| 1:1 set:get | 80,177 | 40,088 | 0.767 ms | 1.52 ms | 2.64 ms |

1,000,000 keys of 32 bytes. 64 connections over 4 threads, 60 s per ratio.

## Web frameworks

| Framework | Fortunes req/s | Single query req/s | JSON req/s | Fortunes p99 at 256 connections |
| --- | --- | --- | --- | --- |
| Next.js nextjs | 873 | 2,924 | 4,348 | 406 ms |
| Express express-postgresjs | 11,865 | 14,578 | 35,463 | 45.5 ms |
| Fastify fastify-postgres | 11,464 | 15,256 | 40,335 | 46 ms |
| NestJS nestjs | 5,205 | 6,087 | 18,795 | 78.4 ms |
| Nuxt nuxt | 9,600 | 12,905 | 32,374 | 64.2 ms |
| FastAPI fastapi | 4,759 | 5,873 | 32,017 | 196 ms |
| Django django-postgresql | 2,645 | 2,922 | 6,849 | 264 ms |
| Rails rails | 3,398 | 4,435 | 16,823 | 123 ms |
| Laravel laravel | 953 | 991 | 1,874 | 296 ms |
| Symfony symfony | 1,230 | 1,376 | 3,708 | 230 ms |

Peak requests per second across the 64 and 256 connection levels, measured with wrk. Each test has to pass the TechEmpower response checks first, or it's marked invalid.

## Web apps

### WooCommerce

#### Page mix

| Step | Requests/s | Median | p95 | p99 | Error rate |
| --- | --- | --- | --- | --- | --- |
| 8 virtual users |
| --- |
| Home page | 3.27 | 490 ms | 619 ms | 643 ms | 0% |
| Shop page | 3.27 | 664 ms | 796 ms | 840 ms | 0% |
| Category page | 3.27 | 425 ms | 682 ms | 744 ms | 0% |
| Product page | 3.27 | 459 ms | 563 ms | 608 ms | 0% |
| Product search | 3.27 | 391 ms | 526 ms | 586 ms | 0% |
| 32 virtual users |
| --- |
| Home page | 3.14 | 1.92 s | 2.21 s | 2.3 s | 0% |
| Shop page | 3.14 | 2.48 s | 2.89 s | 2.97 s | 0% |
| Category page | 3.14 | 1.94 s | 2.59 s | 2.76 s | 0% |
| Product page | 3.14 | 1.84 s | 2.1 s | 2.31 s | 0% |
| Product search | 3.14 | 1.69 s | 1.92 s | 1.96 s | 0% |

#### Cart and checkout

| Step | Requests/s | Median | p95 | p99 | Error rate |
| --- | --- | --- | --- | --- | --- |
| 8 virtual users |
| --- |
| Add to cart | 6.37 | 507 ms | 663 ms | 703 ms | 0% |
| Cart | 6.37 | 414 ms | 546 ms | 576 ms | 0% |
| Checkout | 6.37 | 330 ms | 431 ms | 463 ms | 0% |
| 32 virtual users |
| --- |
| Add to cart | 5.99 | 1.97 s | 2.36 s | 2.43 s | 0% |
| Cart | 5.99 | 1.86 s | 2.1 s | 2.19 s | 0% |
| Checkout | 5.99 | 1.46 s | 1.69 s | 1.77 s | 0% |

k6 with a fixed number of virtual users, 61 to 68 s per level. The error rate counts responses that weren't a 200.

### Discourse

#### Signed in

| Step | Requests/s | Median | p95 | p99 | Error rate |
| --- | --- | --- | --- | --- | --- |
| 1 virtual user |
| --- |
| Topic page | 1.4 | 317 ms | 424 ms | 741 ms | 0% |
| Topic JSON | 0.71 | 159 ms | 181 ms | 191 ms | 0% |
| Home page | 0.71 | 285 ms | 382 ms | 477 ms | 0% |
| Categories page | 0.347 | 328 ms | 352 ms | 442 ms | 0% |
| User activity page | 0.347 | 199 ms | 292 ms | 452 ms | 0% |
| 4 virtual users |
| --- |
| Topic page | 5.82 | 306 ms | 356 ms | 660 ms | 0% |
| Topic JSON | 2.88 | 159 ms | 195 ms | 245 ms | 0% |
| Home page | 2.88 | 272 ms | 421 ms | 750 ms | 0% |
| Categories page | 1.47 | 319 ms | 358 ms | 581 ms | 0% |
| User activity page | 1.44 | 186 ms | 223 ms | 375 ms | 0% |
| 16 virtual users |
| --- |
| Topic page | 5.37 | 1.24 s | 1.64 s | 2.17 s | 0% |
| Topic JSON | 2.7 | 925 ms | 1.16 s | 1.51 s | 0% |
| Home page | 2.68 | 1.16 s | 1.39 s | 2 s | 0% |
| Categories page | 1.37 | 1.24 s | 1.54 s | 2.37 s | 0% |
| User activity page | 1.33 | 966 ms | 1.22 s | 1.41 s | 0% |

#### Anonymous

| Step | Requests/s | Median | p95 | p99 | Error rate |
| --- | --- | --- | --- | --- | --- |
| 16 virtual users |
| --- |
| Topic page | 115 | 34.7 ms | 66.6 ms | 97.1 ms | 0% |
| Topic JSON | 57.8 | 33.2 ms | 64.4 ms | 100 ms | 0% |
| Home page | 57.8 | 35.2 ms | 67 ms | 100 ms | 0% |
| Categories page | 28.9 | 34.4 ms | 65.9 ms | 95.3 ms | 0% |
| User activity page | 28.9 | 198 ms | 259 ms | 455 ms | 0% |

k6 with a fixed number of virtual users, 60 to 61 s per level, after a 21 s warmup. The error rate counts responses that weren't a 200. Discourse ran with 8 app workers and 2048 MB of Postgres shared buffers, what its installer picks for a 8 GB box. Its installer adds no swap on a box this big. The container peaked at 2,848 MB.

### Ghost

#### Readers

| Step | Requests/s | Median | p95 | p99 | Error rate |
| --- | --- | --- | --- | --- | --- |
| 1 virtual user |
| --- |
| Home page | 6.26 | 46 ms | 50.4 ms | 54.6 ms | 0% |
| Post page | 15.6 | 25 ms | 29 ms | 36.7 ms | 0% |
| Tag page | 3.13 | 30.9 ms | 35.2 ms | 40.9 ms | 0% |
| Author page | 3.13 | 31.1 ms | 34.8 ms | 38.1 ms | 0% |
| RSS feed | 3.13 | 33.9 ms | 43.2 ms | 49.5 ms | 0% |
| 4 virtual users |
| --- |
| Home page | 7.97 | 132 ms | 158 ms | 169 ms | 0% |
| Post page | 19.9 | 93.7 ms | 125 ms | 142 ms | 0% |
| Tag page | 3.98 | 85.2 ms | 111 ms | 122 ms | 0% |
| Author page | 4 | 87.1 ms | 112 ms | 121 ms | 0% |
| RSS feed | 3.98 | 90.4 ms | 122 ms | 129 ms | 0% |
| 16 virtual users |
| --- |
| Home page | 8.03 | 506 ms | 570 ms | 600 ms | 0% |
| Post page | 20 | 425 ms | 485 ms | 512 ms | 0% |
| Tag page | 3.98 | 282 ms | 336 ms | 364 ms | 0% |
| Author page | 3.98 | 280 ms | 331 ms | 348 ms | 0% |
| RSS feed | 4.02 | 282 ms | 338 ms | 361 ms | 0% |

#### Staff in Ghost Admin

| Step | Requests/s | Median | p95 | p99 | Error rate |
| --- | --- | --- | --- | --- | --- |
| 1 virtual user |
| --- |
| Post list | 3.15 | 43.5 ms | 50.6 ms | 63.2 ms | 0% |
| Post editor | 9.48 | 18.1 ms | 21.7 ms | 24.3 ms | 0% |
| Saving a draft | 9.48 | 49.4 ms | 57.5 ms | 65.9 ms | 0% |
| Member list | 3.15 | 57.8 ms | 67.2 ms | 74.2 ms | 0% |
| 4 virtual users |
| --- |
| Post list | 4.5 | 57.8 ms | 65.3 ms | 71.9 ms | 0% |
| Post editor | 13.5 | 28.9 ms | 35.5 ms | 39.4 ms | 0% |
| Saving a draft | 13.6 | 214 ms | 271 ms | 286 ms | 0% |
| Member list | 4.51 | 67.7 ms | 77 ms | 83 ms | 0% |

k6 with a fixed number of virtual users, 60 s per level, after a 20 s warmup. The error rate counts responses that weren't a 200. Ghost ran the way its ghost-docker setup runs it: one Node process, and MySQL with its stock 128 MB buffer pool. Memory peaked with Ghost at 515 MB and MySQL at 627 MB.

### Wagtail

#### Visitors

| Step | Requests/s | Median | p95 | p99 | Error rate |
| --- | --- | --- | --- | --- | --- |
| 1 virtual user |
| --- |
| Home page | 1.11 | 121 ms | 132 ms | 137 ms | 0% |
| Blog index | 1.1 | 412 ms | 455 ms | 464 ms | 0% |
| Blog post | 3.31 | 38.4 ms | 60.1 ms | 63.4 ms | 0% |
| Bread page | 3.31 | 42.2 ms | 47.4 ms | 49.8 ms | 0% |
| Location page | 1.11 | 39.6 ms | 46.4 ms | 47.4 ms | 0% |
| Site search | 1.1 | 67.2 ms | 122 ms | 132 ms | 0% |
| 4 virtual users |
| --- |
| Home page | 1.87 | 292 ms | 495 ms | 645 ms | 0% |
| Blog index | 1.9 | 1.11 s | 1.55 s | 1.69 s | 0% |
| Blog post | 5.61 | 75.8 ms | 147 ms | 207 ms | 0% |
| Bread page | 5.66 | 87.2 ms | 154 ms | 171 ms | 0% |
| Location page | 1.92 | 78.5 ms | 151 ms | 177 ms | 0% |
| Site search | 1.85 | 110 ms | 292 ms | 343 ms | 0% |
| 16 virtual users |
| --- |
| Home page | 2.34 | 768 ms | 993 ms | 1.07 s | 0% |
| Blog index | 2.46 | 2.11 s | 2.41 s | 2.6 s | 0% |
| Blog post | 7.03 | 432 ms | 669 ms | 776 ms | 0% |
| Bread page | 7.13 | 438 ms | 678 ms | 824 ms | 0% |
| Location page | 2.39 | 419 ms | 697 ms | 804 ms | 0% |
| Site search | 2.34 | 514 ms | 739 ms | 863 ms | 0% |

#### Editors in the Wagtail admin

| Step | Requests/s | Median | p95 | p99 | Error rate |
| --- | --- | --- | --- | --- | --- |
| 1 virtual user |
| --- |
| Admin dashboard | 0.562 | 116 ms | 132 ms | 154 ms | 0% |
| Page explorer | 1.14 | 404 ms | 437 ms | 597 ms | 0% |
| Page editor | 1.7 | 196 ms | 244 ms | 406 ms | 0% |
| Image library | 0.562 | 81.3 ms | 90.9 ms | 767 ms | 0% |
| Admin page search | 0.562 | 46.8 ms | 99.4 ms | 173 ms | 0% |
| 4 virtual users |
| --- |
| Admin dashboard | 0.724 | 387 ms | 731 ms | 799 ms | 0% |
| Page explorer | 1.43 | 1.34 s | 3.11 s | 3.59 s | 0% |
| Page editor | 2.16 | 585 ms | 1.09 s | 1.31 s | 0% |
| Image library | 0.724 | 277 ms | 644 ms | 700 ms | 0% |
| Admin page search | 0.724 | 132 ms | 440 ms | 517 ms | 0% |

k6 with a fixed number of virtual users, 60 to 61 s per level, after a 21 s warmup. The error rate counts responses that weren't a 200. Wagtail ran the way bakerydemo ships it: uWSGI with 2 workers of 4 threads each, whatever the box, and Postgres and Redis on stock settings. Memory peaked with Wagtail at 293 MB, Postgres at 153 MB, and Redis at 25 MB.

## Advertised vs. measured

| Spec | Advertised | Measured |
| --- | --- | --- |
| vCPU | 4 | 4 |
| CPU | Shared vCPU | 0% of busy CPU time stolen |
| RAM | 8 GB | 7.5 GiB |
| Storage | 80 GB NVMe | 75 GiB |
| Architecture | arm64 | arm64 |
| Virtualization | KVM | KVM |

Guests usually report slightly less RAM and disk than advertised because of kernel reservations and filesystem overhead.

## Detected hardware

**CPU model:** Neoverse-N1

**CPU cores:** 4

**CPU frequency:** Unknown

**AES-NI:** Yes

**VM-x/AMD-V:** No

**RAM reported:** 7.5 GiB

**Swap reported:** 0 MiB

**Disk reported:** 75 GiB

**Virtualization reported:** KVM

**CPU steal:** 0% of busy CPU time stolen

**Distro:** Ubuntu 24.04.4 LTS

**Kernel:** 6.8.0-138-generic

**Architecture:** arm64

**IPv4 reachable:** Yes

**IPv6 reachable:** Yes

## Advertised at test time

**Plan:** CAX21

**Product line:** cost\_optimized

**Location:** Falkenstein DC Park 1

**vCPU:** 4 shared vCPU

**Architecture:** arm64

**RAM:** 8 GB

**Storage:** 80 GB NVMe

**Virtualization:** KVM

**Network:** Unknown

**Transfer:** 21.99 TB

**Port 25:** On request

**Monthly price at test time:** $12.49

**Hourly price at test time:** $0.020

**YABS version:** v2026-09-20

**Ran at:** Oct 15, 2026, 11:54:44 UTC

**Parser version:** 5

## Run timeline

**Queued:** Oct 15, 2026, 11:54:00 UTC

**Server created:** Oct 15, 2026, 11:54:37 UTC

**First update from the server:** Oct 15, 2026, 11:54:37 UTC

**Completed:** Oct 15, 2026, 13:30:22 UTC

**Server deleted:** Oct 15, 2026, 13:30:22 UTC

**Cost of this run:** $0.032

Tests 43 of 43 done Live output 791 lines

Setup 4 cores, 7.5 GiB RAM 4 of 4Done

Disk (fio) 238 MB/s at 4k, 2.92 GB/s at 1m 5 of 5Done

Network, IPv4 (iperf3) Median 1.79 Gbit/s send, 2.61 Gbit/s receive, 1 retried 5 of 5Done

Geekbench 7, single-core Score 963 1 of 1Done

Geekbench 7, multi-core Score 3,424 1 of 1Done

Phoronix (memory, TLS, scheduler) 3 of 3Done

Datastores 5 of 5Done

Web frameworks 10 of 10Done

Web apps 8 of 8Done

Finish Results saved 1 of 1Done

Watch party 0 watching

This party closed at 14:30 UTC. It's read only now.

## Watch party

Loading the party
