Skip to main content

Stress Test Results

Long-running stress tests comparing sustained performance between Dekaf and Confluent.Kafka under real-world load.

Last Updated: 2026-08-05 02:11 UTC

info

The paired Dekaf vs Confluent comparison runs weekly (Sunday 2 AM UTC) and updates this page. Manual dispatches stay Dekaf-only unless full_run explicitly requests the same paired publish path. Tests measure sustained performance over 15+ minutes with real Kafka instances.

At a glance

Each row is a like-for-like comparison: both clients run the same sustained workload sequentially on the same VM, and repeated samples are aggregated with a geometric mean across both run orders.

ScenarioDekafConfluentThroughputCPU per message
Produce — fire-and-forget1,589,592 msg/s1,364,593 msg/s1.2× faster1.4× less
Produce — fire-and-forget (3 brokers)1,202,782 msg/s896,773 msg/s1.3× faster1.6× less
Produce — acks=all1,588,223 msg/s1,401,374 msg/s1.1× faster1.4× less
Produce — acks=all (3 brokers)852,910 msg/s769,005 msg/s1.1× faster1.3× less
Produce — fire-and-forget, idempotent1,617,459 msg/s1,450,111 msg/s1.1× faster1.4× less
Produce — fire-and-forget, idempotent (3 brokers)1,117,158 msg/s858,416 msg/s1.3× faster1.6× less
Produce + consume round-trip2,652,540 msg/s1,731,781 msg/s1.5× faster2.0× less
Produce — transactional (exactly-once) (3 brokers)1,244 msg/s174 msg/s7.1× faster1.1× less
Consume — messages1,771,526 msg/s1,365,730 msg/s1.3× faster1.4× less
Consume — batches1,195,583 msg/s
Consume — raw bytes3,647,900 msg/s
Consume — raw byte batches4,178,857 msg/s

"On par" means within ±5% — differences that small are run-to-run noise. "CPU per message" compares the client CPU cost of delivering one message; "less" means Dekaf needs less CPU. Rows showing "—" have no Confluent counterpart in this run (for example, batch and raw consume APIs that librdkafka does not expose). The full per-run data is below.

Full results

Each section holds the measured per-run data behind the summary: repeated same-VM samples in both client orders, CPU per message and per request, and throughput drift across the run.

Producer (Fire-and-Forget) (15 minutes, 1000B messages)

Order-Balanced Aggregate

ClientSamplesGeomean comparison msg/sSample rangeMedian CPU μs/msgComparison Ratio
Dekaf21,589,5921,567,598–1,611,8950.941.16x
Confluent21,364,5931,334,107–1,395,7771.341.00x

The aggregate uses the geometric mean across balanced same-VM samples run in both dekaf-first and confluent-first order. Raw ordered samples remain below.

ClientCPU μs/msgCPU μs/requestMessages/secMedian msg/sDriftSlope %/minMB/secAccepted msg/sErrorsStanding cores
Dekaf (3conn)0.71688.851,916,8101,971,393+15.7%+1.55%1828.011,916,81001.36
Dekaf (dekaf-first)0.95974.981,589,0981,611,895+1.5%+0.07%1515.481,589,09801.51
Dekaf (confluent-first)0.92943.221,541,9701,567,598-6.3%-0.50%1470.541,541,97001.42
Confluent (dekaf-first)1.28-1,384,8141,395,777-0.5%-0.07%1320.661,384,81401.77
Confluent (confluent-first)1.40-1,323,2021,334,107+1.3%+0.12%1261.901,323,20201.85

Median msg/s is the median sampled client-side throughput interval; it shows steady-state throughput without letting a short late-run stall dominate the whole-run average.

Rows and Comparison Ratio use Median msg/s when available; older result files without interval samples fall back to Messages/sec.

Drift compares last-third with first-third average throughput. Slope is the normalized least-squares trend; steady-state below 85% of peak or slope below -1%/min fails the regression gate.

Messages/sec counts broker-confirmed deliveries (end-offset delta). Accepted msg/s is the client-side append rate — a large gap means messages were buffered or dropped without ever reaching the broker.

Producer (Fire-and-Forget), 3 Brokers (15 minutes, 1000B messages)
ClientCPU μs/msgCPU μs/requestMessages/secMedian msg/sDriftSlope %/minMB/secAccepted msg/sErrorsStanding cores
Dekaf (3conn)1.03992.581,251,3951,250,962+2.6%+0.26%1193.421,251,39501.29
Dekaf1.051010.851,198,2601,202,782+4.3%+0.43%1142.751,198,26001.26
Confluent1.68-895,991896,773+0.3%+0.02%854.48895,99101.51

Median msg/s is the median sampled client-side throughput interval; it shows steady-state throughput without letting a short late-run stall dominate the whole-run average.

Rows and Comparison Ratio use Median msg/s when available; older result files without interval samples fall back to Messages/sec.

Drift compares last-third with first-third average throughput. Slope is the normalized least-squares trend; steady-state below 85% of peak or slope below -1%/min fails the regression gate.

Messages/sec counts broker-confirmed deliveries (end-offset delta). Accepted msg/s is the client-side append rate — a large gap means messages were buffered or dropped without ever reaching the broker.

Producer (Acks All) (15 minutes, 1000B messages)

Order-Balanced Aggregate

ClientSamplesGeomean comparison msg/sSample rangeMedian CPU μs/msgComparison Ratio
Dekaf21,588,2231,572,835–1,603,7620.941.13x
Confluent21,401,3741,384,156–1,418,8071.271.00x

The aggregate uses the geometric mean across balanced same-VM samples run in both dekaf-first and confluent-first order. Raw ordered samples remain below.

ClientCPU μs/msgCPU μs/requestMessages/secMedian msg/sDriftSlope %/minMB/secAccepted msg/sErrorsStanding cores
Dekaf (dekaf-first)0.94966.901,587,1851,603,762+1.5%+0.11%1513.661,587,18501.49
Dekaf (confluent-first)0.93956.651,560,0401,572,835-0.6%-0.03%1487.771,560,04001.46
Confluent (confluent-first)1.25-1,413,3221,418,807+0.9%+0.09%1347.851,413,32201.77
Confluent (dekaf-first)1.29-1,375,5511,384,156-2.9%-0.25%1311.831,375,55101.78

Median msg/s is the median sampled client-side throughput interval; it shows steady-state throughput without letting a short late-run stall dominate the whole-run average.

Rows and Comparison Ratio use Median msg/s when available; older result files without interval samples fall back to Messages/sec.

Drift compares last-third with first-third average throughput. Slope is the normalized least-squares trend; steady-state below 85% of peak or slope below -1%/min fails the regression gate.

Messages/sec counts broker-confirmed deliveries (end-offset delta). Accepted msg/s is the client-side append rate — a large gap means messages were buffered or dropped without ever reaching the broker.

Producer (Acks All), 3 Brokers (15 minutes, 1000B messages)
ClientCPU μs/msgCPU μs/requestMessages/secMedian msg/sDriftSlope %/minMB/secAccepted msg/sErrorsStanding cores
Dekaf1.501499.04849,533852,910+5.2%+0.54%810.18849,53301.28
Confluent1.96-772,783769,005+0.3%+0.07%736.98772,78301.52

Median msg/s is the median sampled client-side throughput interval; it shows steady-state throughput without letting a short late-run stall dominate the whole-run average.

Rows and Comparison Ratio use Median msg/s when available; older result files without interval samples fall back to Messages/sec.

Drift compares last-third with first-third average throughput. Slope is the normalized least-squares trend; steady-state below 85% of peak or slope below -1%/min fails the regression gate.

Messages/sec counts broker-confirmed deliveries (end-offset delta). Accepted msg/s is the client-side append rate — a large gap means messages were buffered or dropped without ever reaching the broker.

Producer (Fire-and-Forget, Idempotent) (15 minutes, 1000B messages)

Order-Balanced Aggregate

ClientSamplesGeomean comparison msg/sSample rangeMedian CPU μs/msgComparison Ratio
Dekaf21,617,4591,570,640–1,665,6740.911.12x
Confluent21,450,1111,441,199–1,459,0791.251.00x

The aggregate uses the geometric mean across balanced same-VM samples run in both dekaf-first and confluent-first order. Raw ordered samples remain below.

ClientCPU μs/msgCPU μs/requestMessages/secMedian msg/sDriftSlope %/minMB/secAccepted msg/sErrorsStanding cores
Dekaf (dekaf-first)0.89916.601,641,3901,665,674+1.4%+0.11%1565.351,641,39001.47
Dekaf (3conn)0.77711.851,550,5321,577,926+10.6%+0.90%1478.701,550,53201.19
Dekaf (confluent-first)0.93952.771,543,5021,570,640-6.4%-0.51%1472.001,543,50201.44
Confluent (dekaf-first)1.25-1,444,5311,459,079+1.4%+0.06%1377.611,444,53101.80
Confluent (confluent-first)1.26-1,411,3051,441,199+2.0%-0.13%1345.931,411,30501.78

Median msg/s is the median sampled client-side throughput interval; it shows steady-state throughput without letting a short late-run stall dominate the whole-run average.

Rows and Comparison Ratio use Median msg/s when available; older result files without interval samples fall back to Messages/sec.

Drift compares last-third with first-third average throughput. Slope is the normalized least-squares trend; steady-state below 85% of peak or slope below -1%/min fails the regression gate.

Messages/sec counts broker-confirmed deliveries (end-offset delta). Accepted msg/s is the client-side append rate — a large gap means messages were buffered or dropped without ever reaching the broker.

Producer (Fire-and-Forget, Idempotent), 3 Brokers (15 minutes, 1000B messages)
ClientCPU μs/msgCPU μs/requestMessages/secMedian msg/sDriftSlope %/minMB/secAccepted msg/sErrorsStanding cores
Dekaf (3conn)1.091095.571,199,6381,208,997+0.8%+0.09%1144.061,199,63801.30
Dekaf1.171181.561,105,4221,117,158+4.2%+0.43%1054.211,105,42201.29
Confluent1.82-858,561858,416-0.0%+0.00%818.79858,56101.57

Median msg/s is the median sampled client-side throughput interval; it shows steady-state throughput without letting a short late-run stall dominate the whole-run average.

Rows and Comparison Ratio use Median msg/s when available; older result files without interval samples fall back to Messages/sec.

Drift compares last-third with first-third average throughput. Slope is the normalized least-squares trend; steady-state below 85% of peak or slope below -1%/min fails the regression gate.

Messages/sec counts broker-confirmed deliveries (end-offset delta). Accepted msg/s is the client-side append rate — a large gap means messages were buffered or dropped without ever reaching the broker.

Producer → Consumer Round-Trip Steady State (15 minutes, 128B messages)
ClientCPU μs/msgCPU μs/requestMessages/secMedian msg/sDriftSlope %/minMB/secAccepted msg/sErrorsStanding cores
Dekaf0.935003.841,399,7232,652,540+45.8%+459.80%170.861,399,72301.30
Confluent1.85-125,5431,731,781+28.5%+233.66%15.33125,54300.23

Median msg/s is the median sampled client-side throughput interval; it shows steady-state throughput without letting a short late-run stall dominate the whole-run average.

Rows and Comparison Ratio use Median msg/s when available; older result files without interval samples fall back to Messages/sec.

Drift compares last-third with first-third average throughput. Slope is the normalized least-squares trend; steady-state below 85% of peak or slope below -1%/min fails the regression gate.

Messages/sec counts broker-confirmed deliveries (end-offset delta). Accepted msg/s is the client-side append rate — a large gap means messages were buffered or dropped without ever reaching the broker.

Round-Trip Validation

ClientExpectedConsumedMissingDuplicatesCorruptOut of OrderWrong PartitionUnexpectedTimed OutResult
Confluent19,792,47719,792,477000000noPASS
Dekaf19,792,47719,792,477000000noPASS
Producer (Transactional EOS), 3 Brokers (15 minutes, 1000B messages)
ClientCPU μs/msgCPU μs/requestMessages/secMedian msg/sDriftSlope %/minMB/secAccepted msg/sErrorsStanding cores
Dekaf205.90205.909251,244+10.3%+0.89%0.881,23400.25
Confluent231.28-131174+0.2%+0.03%0.1217500.04

Median msg/s is the median sampled client-side throughput interval; it shows steady-state throughput without letting a short late-run stall dominate the whole-run average.

Rows and Comparison Ratio use Median msg/s when available; older result files without interval samples fall back to Messages/sec.

Drift compares last-third with first-third average throughput. Slope is the normalized least-squares trend; steady-state below 85% of peak or slope below -1%/min fails the regression gate.

Messages/sec counts broker-confirmed deliveries (end-offset delta). Accepted msg/s is the client-side append rate — a large gap means messages were buffered or dropped without ever reaching the broker.

Transaction Verification

ClientAcceptedCommittedAbortedDeliveredDuplicatesShortfallAborted leaksUnexpectedMissing sentinelsStatus
Confluent157,200117,90039,300117,90000000PASS
Dekaf1,110,500832,900277,600832,90000000PASS
Consumer (15 minutes, 1000B messages, 16,384B seed batches)
ClientCPU μs/msgCPU μs/requestMessages/secMedian msg/sDriftSlope %/minMB/secAccepted msg/sErrorsStanding cores
Dekaf0.74-1,769,3101,771,526-1.6%-0.20%1687.35-01.31
Confluent1.07-1,359,4281,365,730+1.6%+0.17%1296.45-01.46

Median msg/s is the median sampled client-side throughput interval; it shows steady-state throughput without letting a short late-run stall dominate the whole-run average.

Rows and Comparison Ratio use Median msg/s when available; older result files without interval samples fall back to Messages/sec.

Drift compares last-third with first-third average throughput. Slope is the normalized least-squares trend; steady-state below 85% of peak or slope below -1%/min fails the regression gate.

Consumer (Batch) (15 minutes, 1000B messages, 16,384B seed batches)
ClientCPU μs/msgCPU μs/requestMessages/secMedian msg/sDriftSlope %/minMB/secAccepted msg/sErrorsStanding cores
Dekaf1.15-1,198,2451,195,583-0.9%-0.14%1142.74-01.38

Median msg/s is the median sampled client-side throughput interval; it shows steady-state throughput without letting a short late-run stall dominate the whole-run average.

Rows and Comparison Ratio use Median msg/s when available; older result files without interval samples fall back to Messages/sec.

Drift compares last-third with first-third average throughput. Slope is the normalized least-squares trend; steady-state below 85% of peak or slope below -1%/min fails the regression gate.

Consumer (Raw Bytes) (15 minutes, 1000B messages, 16,384B seed batches)
ClientCPU μs/msgCPU μs/requestMessages/secMedian msg/sDriftSlope %/minMB/secAccepted msg/sErrorsStanding cores
Dekaf0.43-3,624,1603,647,900+1.9%+0.04%3456.27-01.56

Median msg/s is the median sampled client-side throughput interval; it shows steady-state throughput without letting a short late-run stall dominate the whole-run average.

Rows and Comparison Ratio use Median msg/s when available; older result files without interval samples fall back to Messages/sec.

Drift compares last-third with first-third average throughput. Slope is the normalized least-squares trend; steady-state below 85% of peak or slope below -1%/min fails the regression gate.

Consumer (Raw Batch) (15 minutes, 1000B messages, 16,384B seed batches)
ClientCPU μs/msgCPU μs/requestMessages/secMedian msg/sDriftSlope %/minMB/secAccepted msg/sErrorsStanding cores
Dekaf0.36-4,227,3124,178,857-0.6%-0.11%4031.48-01.53

Median msg/s is the median sampled client-side throughput interval; it shows steady-state throughput without letting a short late-run stall dominate the whole-run average.

Rows and Comparison Ratio use Median msg/s when available; older result files without interval samples fall back to Messages/sec.

Drift compares last-third with first-third average throughput. Slope is the normalized least-squares trend; steady-state below 85% of peak or slope below -1%/min fails the regression gate.

Memory & GC statistics — latest run
ClientScenarioGen0Gen1Gen2Total AllocatedAlloc/msg
ConfluentConsumer2402710302780.29 GB2.38 KB
ConfluentProducer (Fire-and-Forget)249305111429.12 GB1.26 KB
ConfluentProducer (Fire-and-Forget)312378111495.72 GB1.26 KB
ConfluentProducer (Fire-and-Forget), 3 Brokers20600511967.84 GB1.26 KB
ConfluentProducer (Acks All)3092922411485.71 GB1.26 KB
ConfluentProducer (Acks All)307843111526.46 GB1.26 KB
ConfluentProducer (Acks All), 3 Brokers172292151834.72 GB1.26 KB
ConfluentProducer (Fire-and-Forget, Idempotent)310289111524.28 GB1.26 KB
ConfluentProducer (Fire-and-Forget, Idempotent)3239663511560.23 GB1.26 KB
ConfluentProducer (Fire-and-Forget, Idempotent), 3 Brokers19737911927.40 GB1.26 KB
ConfluentProducer → Consumer Round-Trip Steady State54451112.07 GB655 B
ConfluentProducer (Transactional EOS), 3 Brokers10411129.35 MB863 B
DekafConsumer264261723002.24 GB1.98 KB
DekafConsumer (Batch)53452312033.45 GB1.98 KB
DekafConsumer (Raw Bytes)310462.58 MB0 B
DekafConsumer (Raw Batch)9101.05 GB0 B
DekafProducer (Fire-and-Forget)42522145.14 MB0 B
DekafProducer (Fire-and-Forget)450111.84 GB1 B
DekafProducer (Fire-and-Forget), 3 Brokers21832913.14 MB1 B
DekafProducer (Acks All)437221.81 GB1 B
DekafProducer (Acks All)4252298.31 MB0 B
DekafProducer (Acks All), 3 Brokers15932702.40 MB1 B
DekafProducer (Fire-and-Forget, Idempotent)40122121.07 MB0 B
DekafProducer (Fire-and-Forget, Idempotent)423221.61 GB1 B
DekafProducer (Fire-and-Forget, Idempotent), 3 Brokers21742859.59 MB1 B
DekafProducer → Consumer Round-Trip Steady State601812.82 GB153 B
DekafProducer (Transactional EOS), 3 Brokers19481486.53 MB459 B
Dekaf (3conn)Producer (Fire-and-Forget)332221.46 GB1 B
Dekaf (3conn)Producer (Fire-and-Forget), 3 Brokers22932987.35 MB1 B
Dekaf (3conn)Producer (Fire-and-Forget, Idempotent)303221.25 GB1 B
Dekaf (3conn)Producer (Fire-and-Forget, Idempotent), 3 Brokers24132995.14 MB1 B

Confluent.Kafka uses native librdkafka; .NET GC allocation counters exclude unmanaged allocations.


About These Tests

Stress tests measure sustained performance over extended periods against real Kafka brokers, with both clients paired on the same VM for a fair comparison.

Methodology — how these numbers are produced
  • Real Kafka: Tests run against actual Apache Kafka instances
  • CPU Isolation: Brokers are pinned to dedicated cores and the client under test to its own cores, so the client — not the broker — is the measured bottleneck
  • RAM-backed Broker Logs: Kafka log dirs are mounted on tmpfs so disk I/O never caps broker ingestion
  • Delivered Throughput: producer tables report broker-confirmed throughput, measured as the end-offset delta across all partitions — not the client-side append rate, which can run far ahead of what the broker ever accepts
  • Median Interval Throughput: table order and comparison ratios use median sampled client-side msg/s when available, which is less sensitive to short late-run stalls than the whole-run mean
  • Same-VM Pairing: comparable Dekaf and Confluent scenarios run sequentially inside one job/VM; 1-broker producer acceptance lanes run twice in opposite client orders and publish a geometric-mean aggregate, while other lanes alternate order by workflow run number
  • Backpressure Parity: both producers are bounded to the same 512 MB local buffer (Dekaf BufferMemory, librdkafka queue.buffering.max) and block on a full buffer, so neither client can absorb an unbounded backlog into RAM
  • Consumer Loop Replay: Consumer tests re-read a pre-seeded topic (seek to beginning when drained) instead of racing a live feeder, so the consumer itself is measured; table headings report the 16KB seed batch size because it amplifies per-batch costs relative to well-batched workloads
  • Delivery Latency Sampling: 1 in 1000 produced messages is awaited end-to-end to record true broker round-trip latency
  • Round-Trip Correctness: Bounded sequenced payloads are consumed back and checked for corruption, wrong partitions, gaps, duplicates, and reordering
  • Round-Trip CPU Scope: CPU time covers both bulk production and consumer validation; it is not a producer-only metric
  • Round-Trip Alloc Scope: the GC/alloc window likewise spans production plus consume-side validation; values are deliberately consumed as byte[] on both clients for parity, so each consumed payload is materialized as a fresh array (~152 B at 128 B messages) — the expected allocation floor for this lane, not a leak
  • CPU Efficiency: CPU time per message differentiates client efficiency even at equal throughput
  • Noise-Aware Trends: each scenario is compared with its last 10 matching runs using a median ± 2×MAD band; one adverse excursion warns and two consecutive regressions fail the workflow
  • Parallel Execution: Each scenario runs in its own isolated environment
  • Both Clients: Direct comparison between Dekaf and Confluent.Kafka
  • Memory Monitoring: Tracks GC behavior and memory usage over time
  • Error Rates: Ensures stability under load