Skip to main content

Broker performance results

This result applies to the workload and host below. It is neither a universal broker ranking nor a supported-limit claim. The full raw artifact directory is produced by the qualification harness.

Provenance and contract

The run used Krabka commit 106ae27b121c8317ba86c10e462fa8c9baaad3b1 plus a source patch whose SHA-256 is e3b0c44298fc1c149afbf4c8996fb92427ae41e4649b934ca495991b7852b855. The Krabka image id was sha256:d46923ca9c40895650975aea38c535758cb5958ad6bcc3cc21a79aa4d0c1f624; the pinned apache/kafka:4.0.0 image id was sha256:3f7b939115cd4872e9cee9369d80bd69712fde55f9902f46d793f64848dedc75.

The host had 16 logical CPUs (AMD EPYC 4344P), 65.9 GB RAM and 361.9 GB available disk. Each of three broker/controller pods had a 2 CPU, 2 GiB and 100 GiB claim. Both sides used 12 partitions, RF 3, min ISR 2, acks=all, idempotence, LZ4, a 65,536-byte batch and 5 ms linger with 1,024-byte records.

Reproduce the complete run with:

PERF_ARTIFACT_DIR=$PWD/performance-artifacts \
  packaging/performance/qualify.sh full

Kafka comparison

Every row is a raw run result. Saturation sent 100,000 records; steady state sent 300,000 at a requested 5,000 records/s. Every run consumed exactly what it sent with zero producer errors and zero duplicate sequences.

Broker Shape Run records/s MiB/s p50 ms p95 ms p99 ms
Kafka saturation 1 171,307.957 167.293 252.705 338.327 378.705
Kafka saturation 2 344,926.749 336.843 10.567 20.193 26.417
Kafka saturation 3 300,566.675 293.522 38.088 60.924 80.089
Krabka saturation 1 185,568.285 181.219 169.953 252.837 315.207
Krabka saturation 2 172,020.136 167.988 179.715 265.506 293.146
Krabka saturation 3 169,372.170 165.403 183.986 299.008 311.533
Kafka steady 1 4,999.505 4.882 3.244 5.790 6.465
Kafka steady 2 4,999.438 4.882 3.317 6.400 212.183
Kafka steady 3 4,999.441 4.882 3.110 5.623 5.968
Krabka steady 1 4,999.266 4.882 4.582 7.193 7.739
Krabka steady 2 4,999.391 4.882 4.674 7.203 7.864
Krabka steady 3 4,999.409 4.882 4.719 7.121 7.790

The saturation medians were 300,567 records/s and 80.089 ms p99 for Kafka, and 172,020 records/s and 311.533 ms p99 for Krabka, a 1.75x throughput gap. The first saturation run was 171,308 records/s for Kafka and 185,568 records/s for Krabka, so the gap is concentrated in Kafka’s warm runs. At the fixed rate, both held 4,999 records/s; median p99 was 6.465 ms for Kafka and 7.790 ms for Krabka.

Across the three steady runs, the three broker processes consumed 1,234–3,273 CPU ticks per Kafka run and 3,705–4,091 per Krabka run. Peak per-process RSS was 945 MiB for Kafka and 92 MiB for Krabka. Aggregate volume growth was 26.3 MB on both brokers. Kafka received 43.2–43.6 MB and transmitted 43.6–44.0 MB; Krabka received 47.8–48.2 MB and transmitted 48.3–48.7 MB. The raw before/after snapshots also retain per-process file descriptors and every individual run.

Partition envelope

Each tier used RF 3 and 600,000 acknowledged records at 1,000 records/s while deleting the active controller and moving 1,000 partitions to a fourth broker. Both tiers passed their predeclared 30-minute deadline.

User partitions User replicas User replicas per broker after move Failover Restart ready Reassignment ready p50 / p95 / p99 Result
1,000 3,000 667 / 667 / 666 / 1,000 22 s 24 s 0 s 22.680 / 296.989 / 10,084.009 ms pass
10,000 30,000 9,667 / 9,667 / 9,666 / 1,000 23 s 26 s 2 s 430.922 / 3,487.868 / 12,756.453 ms pass

Both tiers consumed 600,000 of 600,000 records with zero errors and duplicates. All four brokers ended with metadata lag 0. At 10,000 partitions, the largest broker metrics body was 2,376,748 bytes with 27,249 series and the slowest scrape took 1.121 seconds. Peak per-process RSS was 890,356 KiB, peak file descriptor count was 30,178, and peak volume use was 64,039,262 bytes. scale/verdict.txt therefore records highest_passing_tier=10000; this is the highest tested tier, not the product’s maximum.