来 DTDS 全球数字人才发展峰会,与刘润、叶军、快刀青衣畅聊成长>> 了解详情
写点什么

Pulsar 和 Kafka 基准测试报告(下)

2021 年 1 月 28 日

Pulsar 和 Kafka 基准测试报告(下)

为了更全面地了解 Pulsar 和 Kafka,我们“复现”了 Confluent 对 Pulsar 和 Kafka 基准测试。重复这一基准测试的原因有两个,一是 Confluent 的测试方法存在一些问题;二是 Confluent 的测试范围和测试场景不够全面。为了更准确地对比 Pulsar 和 Kafka,我们在测试中不仅修复了 Confluent 测试中的问题,还扩大了测试范围,纳入更多性能衡量标准,模拟更多实际场景。


和 Confluent 的测试相比,我们的测试主要有三项改进:


  1. 包含 Pulsar 和 Kafka 支持的所有持久性级别。在同等持久性级别下,对比二者的吞吐量和延迟。

  2. 引入影响性能的其他因素和测试条件,如分区数量、订阅数量、客户端数量等。

  3. 测试的混合负载同时包含写入、追赶读和追尾读,模拟实际使用场景。


我们进行了最大吞吐量测试、发布和端到端延迟测试、追赶读测试和混合工作负载测试(详见上篇)。由于篇幅有限,本篇主要介绍发布和端到端延迟测试详情。

发布和端到端延迟测试

测试目标:观测在处理发布和追尾读工作负载时 Pulsar 和 Kafka 可实现的最低延迟。


测试设置:通过调整订阅数量和分区数量,观测订阅数量和分区数量对发布延迟和端到端延迟的影响。


测试策略:


  • 将所有消息都复制三次,确保容错;

  • 改变 ack 数量,测试在不同持久性保证下,Pulsar 和 Kafka 吞吐量的差异;

  • 改变订阅数量(从 1 到 10),分别测试延迟;

  • 改变分区数量(从 100 到 10000),分别测试延迟;

  • 消息大小为 1KB;

  • 生产者以 200000/s(约 200MB/s)的固定速度发送消息,追尾读消费者在生产者持续发送消息时处理消息。


各项测试结果如下。


#1 100 个分区, 1 个订阅


我们从 100 个分区、1 个订阅开始,在所有不同持久性保证下,对 Pulsar 和 Kafka 能实现的最低延迟进行了基准测试。


测试证明,在所有持久性级别上,Pulsar 的发布延迟和端到端延迟都比 Kafka 低,是 Kafka 的 1/5 到 1/2。


发布延迟 - 同步本地持久性


使用两种复制持久性设置(分别为 ack-1 和 ack-2)和同步本地持久性时,Pulsar 和 Kafka 发布延迟的差异如图 10。表 2 为每种情况下的精确延迟数值。在异步复制持久性(ack-1)下,Pulsar P99 延迟是 Kafka 的 1/3; 在同步复制持久性(ack-2)下是 Kafka 的 1/5。



图 10 Pulsar 和 Kafka 的发布延迟(数据同步)


表 2 Pulsar 和 Kafka 的实际发布延迟测试结果(数据同步)


平均值P50P90P99P999
pulsar-ack-13.233.214.234.735.89
pulsar-ack-23.643.424.4710.3732.74
kafka-ack-12.541.993.7811.3718.71
kafka-ack-all9.845.7119.758.83164.20


为了更深入地了解延迟如何随时间变化,我们绘制了 Pulsar 和 Kafka 采取不同复制持久性设置时的 P99 延迟图。如图 11 所示,Pulsar 的延迟比较稳定(约 5 毫秒),但 Kafka 的延迟波动较大。对于关键任务服务(mission-critical services)来说,稳定、持续的低延迟至关重要。



图 11 Pulsar 和 Kafka 的 P99 延迟


端到端延迟--同步本地持久性


使用两种复制持久性设置(分别为 ack-1 和 ack-2)和同步本地持久性时,Pulsar 和 Kafka 端到端延迟的差异如图 12。表 3 为每种情况下的精确延迟数值。在异步复制持久性(ack-1)下,Pulsar P99 端到端延迟是 Kafka 的 1/3,在同步复制持久性(ack-2)下是 Kafka 的 1/5。



图 12 1 个订阅时,Pulsar 和 Kafka 的端到端延迟(数据同步)


表 3 1 个订阅时,Pulsar 和 Kafka 的实际端到端延迟测试结果(数据同步)


平均值P50P90P99P999
pulsar-ack-14.324.415.355.867.65
pulsar-ack-24.724.655.6011.6433.90
kafka-ack-16.234.919.0818.7591.74
kafka-ack-all12.897.5323.0764.62169.83


发布延迟 - 异步本地持久性


使用两种复制持久性设置(分别为 ack-1 和 ack-2)和异步本地持久性时,Pulsar 和 Kafka 发布延迟的差异如图 13。表 4 为每种情况下的精确延迟数值。在异步复制持久性(ack-1)下,Kafka 性能更优,但 Pulsar P99 发布延迟更稳定(低于 5 毫秒),增加复制持久性保证(从 ack-1 到 ack-2)并未影响延迟。在同步复制持久性(ack-2)下,Kafka P99 发布延迟是 Pulsar 的 2 倍



图 13 Pulsar 和 Kafka 的发布延迟(无数据同步)


表 4 Pulsar 和 Kafka 的实际发布延迟测试结果(无数据同步)


平均值P50P90P99P999
pulsar-ack-12.812.793.84.215.45
pulsar-ack-22.992.973.964.476.19
kafka-ack-11.741.622.603.069.91
kafka-ack-all3.012.773.978.4715.57


为了更深入地了解发布延迟如何随时间变化,我们绘制了 Pulsar 和 Kafka 在不同复制持久性设置下的 P99 发布延迟图。如图 14 所示,Pulsar 的延迟始终保持在较低的水平(低于 5 毫秒),而 Kafka 的延迟始终是 Pulsar 的 2 倍



图 14 不同复制持久性设置下,Pulsar 和 Kafka 的 P99 发布延迟


端到端延迟--异步本地持久性


使用两种复制持久性设置(分别为 ack-1 和 ack-2)和异步本地持久性时,Pulsar 和 Kafka 端到端延迟的差异如图 15。表 5 为每种情况下的精确延迟数值。在所有情况下,Pulsar 的性能都优于 Kafka。Pulsar P99 端到端延迟保持稳定(约 5 毫秒),改变复制持久性设置对其并无影响。对于 ack-1,Kafka 的 P99 端到端延迟比 Pulsar 高;对于 ack-2,Kafka 的 P99 端到端延迟是 Pulsar 的 2 倍



图 15 1 个订阅时,Pulsar 和 Kafka 的端到端延迟(无数据同步)


表 5 1 个订阅时,Pulsar 和 Kafka 的实际端到端延迟测试结果(无数据同步)


平均值P50P90P99P999
pulsar-ack-13.963.994.905.337.93
pulsar-ack-24.064.175.085.558.52
kafka-ack-14.264.105.396.9417.24
kafka-ack-all4.223.965.1910.4318.95


#2 100 个分区, 10 个订阅


了解 Pulsar 和 Kafka 只有一个订阅时的性能后,我们想知道更改订阅数量会如何影响发布延迟和端到端延迟。于是我们把订阅数量从 1 增加到 10,并为每个订阅分配了 2 个消费者。


从表 6 的数据中可以看出,我们的测试结果表明:


  • Pulsar P99 发布延迟和端到端延迟保持在 5 到 10 毫秒之间。

  • 增加订阅数量会对 Kafka 的 P99 发布和端到端延迟产生巨大影响,导致延迟增加到几秒。


表 6 10 个订阅时,发布和端到端延迟的测试结果


发布延迟端到端延迟
同步本地持久性测试结果测试结果
异步本地持久性测试结果测试结果


发布延迟 - 同步本地持久性


使用两种复制持久性设置(分别为 ack-1 和 ack-2)和同步本地持久性时,Pulsar 和 Kafka 发布延迟的差异如图 16。表 7 为每种情况下的精确延迟数值。在异步复制持久性(ack-1)下,Pulsar P99 发布延迟仍然是 Kafka 的 1/3。但在同步复制持久性(ack-2)下,Pulsar 的发布延迟是 Kafka 的 1/160(1 个订阅时,Pulsar 的发布延迟是 Kafka 的 1/5)。



图 16 10 个订阅时,Pulsar 和 Kafka 的发布延迟(数据同步)


表 7 10 个订阅时,Pulsar 和 Kafka 的实际发布延迟测试结果(数据同步)


平均值P50P90P99P999
pulsar-ack-13.243.204.264.8910.31
pulsar-ack-23.673.474.569.9431.31
pafka-ack-13.142.394.3915.0761.29
kafka-ack-all290.51176.82724.261593.462686.41


端到端延迟--同步本地持久性


使用两种复制持久性设置(分别为 ack-1 和 ack-2)和同步本地持久性时,Pulsar 和 Kafka 端到端延迟的差异如图 17。表 8 为每种情况下的精确延迟数值。在异步复制持久性(ack-1)下,Pulsar P99 延迟是 Kafka 的 1/20,在同步复制持久性(ack-2)下是 Kafka 的 1/110 。



图 17 10 个订阅时,Pulsar 和 Kafka 的端到端延迟(数据同步)


表 8 10 个订阅时,Pulsar 和 Kafka 的实际端到端延迟测试结果(数据同步)


平均值P50P90P99P999
pulsar-ack-14.794.836.037.1215.36
pulsar-ack-25.345.126.4314.6539.90
kafka-ack-111.366.6517.12145.10914.19
kafka-ack-all296.45171.32731.671599.792696.63


发布延迟 - 异步本地持久性


使用两种复制持久性设置(分别为 ack-1 和 ack-2)和异步本地持久性时,Pulsar 和 Kafka 发布延迟的差异如图 18。表 9 为每种情况下的精确延迟数值。Pulsar 的性能显著优于 Kafka。Pulsar 的平均发布延迟约为 3 毫秒,P99 延迟在 5 毫秒以内。Kafka 在异步复制持久性(ack-1)下性能令人满意,但在同步复制持久性(ack-2)下性能差了很多。在同步复制持久性下,Kafka 的 P99 发布延迟是 Pulsar 的 270 倍。



图 18 10 个订阅时,Pulsar 和 Kafka 的发布延迟(无数据同步)


表 9 10 个订阅时,Pulsar 和 Kafka 的实际发布延迟测试结果(无数据同步)


平均值P50P90P99P999
pulsar-ack-12.862.823.864.4611.18
pulsar-ack-23.053.004.034.7310.39
kafka-ack-12.111.893.026.3514.74
kafka-ack-all158.0417.63526.911281.251956.71


端到端延迟--异步本地持久性


使用两种复制持久性设置(分别为 ack-1 和 ack-2)和异步本地持久性时,Pulsar 和 Kafka 端到端延迟的差异如图 19。表 10 为不同情况下的精确延迟数值。在所有情况下,Pulsar 的性能始终优于 Kafka。Pulsar 的端到端延迟始终保持在 4~7 毫秒之间,改变复制持久性设置对其并无影响。对于 ack-1,Kafka 的 P99 端到端延迟是 Pulsar 的 13 倍;对于 ack-2,则是 187 倍。



图 19 10 个订阅时,Pulsar 和 Kafka 的端到端延迟(无数据同步)


表 10 10 个订阅时,实际端到端延迟测试结果(无数据同步)


平均值P50P90P99P999
pulsar-ack-14.514.475.606.8415.77
pulsar-ack-24.614.615.766.9414.21
kafka-ack-18.015.909.3889.80532.68
kafka-ack-all212.7787.72537.851295.781971.03


#3 100, 5000, 8000, 10000 个分区


了解更改订阅数量会如何影响 Pulsar 和 Kafka 的发布延迟后,我们想更改分区数量,看看会产生什么效果。于是,我们把分区数量从 100 个累加到 10000 个,观察发生了什么变化。


测试数据见表 11,测试结果表明:


  • 分区数量增加时,Pulsar P99 发布延迟稳定在 5 毫秒内。

  • Kafka 的 P99 发布延迟受分区数量累加影响很大,延迟上升到几秒。

  • 分区数量超过 5000 后,Kafka 的消费者就跟不上发布吞吐量了。


表 11 不同 ack 和不同持久性下的实际发布延迟测试结果


Ack = 1Ack = 2
同步本地持久性测试结果测试结果
异步本地持久性测试结果测试结果


Ack = 1,同步本地持久性


使用同步本地持久性和异步复制持久性 (ack = 1) 更改分区数量时,Pulsar 和 Kafka 发布和端到端延迟的差异分别如图 20 和图 21。



图 20 分区数量不同,ACK=1 时的发布延迟(数据同步)



图 21 分区数量不同,ACK=1 时的端到端延迟(数据同步)


表 12 显示了分区数量不同,ACK=1 时的实际发布延迟测试结果。表 13 显示了分区数量不同,ACK=1 时的实际端到端延迟测试结果。


表 12 分区数量不同,ACK=1 时的实际发布延迟测试结果(数据同步)


平均值P50P90P99P999
kafka-1002.541.993.7811.3718.71
kafka-50003.504.419.2129.2644.39
kafka-80008.375.1120.1840.7069.72
kafka-1000011.146.5726.8152.2482.07
pulsar-1003.233.214.234.735.89
pulsar-50003.353.304.345.0313.96
pulsar-80003.673.674.895.6116.07
pulsar-100003.423.374.485.3619.20


表 13 分区数量不同,ACK=1 时的实际端到端延迟测试结果(数据同步)


平均值P50P90P99P999
kafka-1006.234.919.0818.7591.74
pulsar-1004.324.415.355.867.65
pulsar-50004.524.535.556.2617.78
pulsar-80004.894.996.116.8623.83
pulsar-100004.494.625.706.6727.25


图 22 给出了分区数量不同,ACK=1 时 Pulsar 端到端的延迟。图 23 给出了分区数量不同,ACK=1 时 Kafka 端到端的延迟。



图 22 分区数量不同,ACK=1 时 Pulsar 的端到端延迟(数据同步)



图 23 分区数量不同,ACK=1 时 Kafka 的端到端延迟(数据同步)


从以上图表可以看出:


  • Pulsar P99 发布延迟稳定在 5 毫秒左右,更改分区数量对其并无影响。

  • Pulsar P99 端到端延迟稳定在 6 毫秒左右,更改分区数量对其并无影响。

  • Kafka 的 P99 发布延迟随着分区数量增加而逐渐拉长,在 10000 个分区时,其延迟增加了 5 倍(与 100 个分区时相比),比 Pulsar 的延迟高出 10 倍。

  • Kafka 的 P99 端到端延迟随着分区数量增加而逐渐拉长,在 10000 个分区时,其延迟高出 10000 倍(与 100 个分区时相比),增加到 180 秒,是 Pulsar 的 280000 倍。


Ack = 2,同步本地持久性


使用同步本地持久性和同步复制持久性(ack = 2)更改分区数量时,Pulsar 和 Kafka 发布延迟的差异如图 24。表 14 为每种情况下的精切延迟数值。



图 24 分区数量不同,ack=2/all 时的发布延迟(数据同步)


表 14 分区数量不同, ack=2/all 时的实际发布延迟测试结果(数据同步)


平均值P50P90P99P999
kafka-1009.845.7119.758.83164.20
kafka-5000154.5036.86468.751259.822017.15
kafka-8000283.50124.82784.691742.272729.79
kafka-10000259.5096.15731.851718.092684.28
pulsar-1003.643.424.4710.3732.74
pulsar-50003.843.574.6912.8142.83
pulsar-80004.153.975.2311.9042.19


图 25 和图 26 分别显示了更改分区数量如何影响 Pulsar 和 Kafka 端到端的延迟。



图 25 分区数量不同,ack=2 时 Pulsar 的端到端延迟(数据同步)



图 26 分区数量不同,ack=2 时 Kafka 的端到端延迟(数据同步)


从以上图表可以看出:


  • Pulsar P99 发布延迟稳定在约 10 毫秒,增加分区数量对其并无影响。

  • 随着分区数量增加,Kafka 的 P99 发布延迟逐渐拉长;有 10000 个分区时,其延迟是 100 个分区的 30 倍,增加到 1.7 秒,是 Pulsar 的 126 倍。

  • Pulsar P99 端到端延迟稳定在约 10 毫秒,增加分区数量仅对 Pulsar P99 端到端延迟产生轻微影响。但即使有 10000 个分区,延迟仍相对较低,约为 50 毫秒。

  • 随着分区数量增加,Kafka 的 P99 端到端延迟逐渐拉长。有 10000 个分区时,Kafka P99 端到端延迟增加到 200 秒,是 Pulsar 的 14771 倍。


Ack = 1, Async 本地持久性


使用异步本地持久性和异步复制持久性(ack = 1)更改分区数量时,Pulsar 和 Kafka 发布延迟的差异如图 27。表 15 为不同情况下的精切延迟数值。



图 27 分区数量不同,ack=1 时的发布延迟(无数据同步)


表 15 分区数量不同,ack=1 时的实际发布延迟测试结果(无数据同步)


平均值P50P90P99P999
kafka-1001.741.622.603.069.91
kafka-50004.133.055.2025.3233.86
kafka-80006.844.3216.5134.1946.34
kafka-100008.955.3222.7541.8359.32
pulsar-1002.862.793.84.215.45
pulsar-50002.982.953.894.517.85
pulsar-80003.263.274.505.1415.21
pulsar-100003.062.974.155.2319.47


图 28 和图 29 分别显示了更改分区数量如何影响 Pulsar 和 Kafka 端到端的延迟。



图 28 分区数量不同,ack=1 时,Pulsar 端到端的延迟(无数据同步)



图 29 分区数量不同,ack=1 时,Kafka 端到端的延迟(无数据同步)


从以上图表可以看出:


  • Pulsar P99 发布延迟稳定在约 4~5 毫秒之间,增加分区数量对其并无影响。

  • Kafka P99 发布延迟随着分区数量增加而逐渐拉长,有 10000 个分区时,延迟增加到 41 毫秒,是有 100 个分区时的 13 倍,是 Pulsar 的 8 倍。

  • Pulsar P99 端到端延迟稳定在约 4~6 毫秒之间,增加分区数量仅对 Pulsar P99 端到端延迟产生轻微影响,但即使有 10000 个分区,它也保持在相对较低的水平(24 毫秒以内)。

  • 随着分区数量增加,Kafka P99 端到端延迟逐渐拉长。有 10000 个分区时,Kafka P99 端到端延迟高达 180 秒,是 Pulsar 的 34416 倍。


Ack = 2,异步本地持久性


使用异步本地持久性和同步复制持久性 (ack = 2)更改分区数量时,Pulsar 和 Kafka 发布延迟的差异如图 30。表 16 为每种情况下的精确延迟数值。



图 30 分区数量不同,ack=all/2 的发布延迟(无数据同步)


表 16 分区数量不同,ack=all/2 的实际发布延迟测试结果(无数据同步)


平均值P50P90P99P999
kafka-1003.012.773.978.4715.57
kafka-500019.3310.1640.40121.40336.21
kafka-8000138.1942.52385.861164.902008.28
kafka-10000266.66102.55752.951717.832797.51
pulsar-1002.992.973.964.476.19
pulsar-50003.133.104.174.989.45
pulsar-80003.443.444.645.3612.92
pulsar-100003.323.244.396.1823.10


图 31 和图 32 分别显示了更改分区数量如何影响 Pulsar 和 Kafka 端到端的延迟。



图 31 分区数量不同,ack=2 时 Pulsar 的端到端延迟(无数据同步)



图 32 分区数量不同,ack=2 时 Kafka 的端到端延迟(无数据同步)


从以上图表可以看出:


  • Pulsar P99 发布延迟稳定在约 4~5 毫秒之间,增加分区数量对其并无影响。

  • 随着分区数量增加,Kafka P99 发布延迟逐渐拉长,有 10000 个分区时,其延迟增加到 1.7 秒,是 100 个分区时的 202 倍,是 Pulsar 的 278 倍。

  • Pulsar P99 端到端延迟稳定在约 4~6 毫秒之间,增加分区数量仅对其造成轻微影响,延迟仍保持在相对较低的水平(28 毫秒以内)。

  • 随着分区数量增加,Kafka P99 端到端延迟逐渐拉长。有 10000 个分区时,Kafka P99 端到端延迟增加到 200 秒,是 Pulsar 的 32362 倍。

结论

基于基准测试结果,我们得出以下结论:


  • 纠正配置和调优错误后,Pulsar 与 Kafka 在 Confluent 有限测试用例中实现的端到端延迟基本一致。

  • 在同等持久性保证下,Pulsar 在模拟实际应用场景的工作负载上性能优于 Kafka。

  • 以上测试中,改变了持久性保证设置、订阅、分区和客户端数量,结果表明 Pulsar 在延迟和 I/O 隔离方面均明显优于 Kafka。


原文链接:https://streamnative.io/en/blog/tech/2020-11-09-benchmark-pulsar-kafka-performance-report


相关阅读链接:https://www.infoq.cn/article/xeyeEeNNY5CG0PGyxeVD


Pulsar 用户调研:https://forms.office.com/Pages/ResponsePage.aspx?id=2zjkx2LkIkypCsNYsWmAs96ZDwmey39DhXAvi6EqbJpUNlZWQzRPMlVWNTc1WUcwUE5CWFMyUlI3QS4u

2021 年 1 月 28 日 10:201858

评论 1 条评论

发布
用户头像
对比的第一件事不是应该提供对比的版本么?难免有喜新厌旧,踩一捧一的感觉。但是感谢愿意花时间做这件事的人,让我能用读一篇文章的时间,get了需要几个小时或者更多,才能得到的结果
2021 年 05 月 28 日 18:37
回复
没有更多了
发现更多内容

SpringBoot 系列 2——SpringBoot原理分析

程序员的时光

程序员 springboot 七日更 28天写作

面向垂直领域的OpenIE图谱构建技术

DataFunTalk

推荐系统解构

DataFunTalk

大数据

2021 十大技术趋势扑面而来,你准备好了吗?

李忠良

区块链 人工智能 云计算 大数据 架构

Prometheus学习笔记之查询【基础篇】

卓丁

Prometheus Monitor 监控告警 普罗米修斯 PromQL

大作业二

Geek_83908e

架构师一期

领域驱动设计在爱奇艺打赏业务的实践

爱奇艺技术产品团队

架构 DDD

海明威《老人与海》

抗哥

28天写作

Spring Cloud Gateway (七)处理流程解析

Java 网关 SpringGateway

成功是逼出来的,把自己逼上绝路,你才能成功

陆陆通通

程序 28天写作 倒逼

中国金融科技权威盛会点赞了这个来自 AWS 的金融行业解决方案

亚马逊云科技 (Amazon Web Services)

云计算 AWS

如果梦境取决于一串代码「幻想短篇 2/28」

道伟

28天写作

追寻人生的意义

三只猫

28天写作

架构师训练营大作业

Shunyi

「架构师训练营第 1 期」

详细教程丨如何利用Rancher和Kong实现服务网格?

RancherLabs

微服务 k8s

优化无止境,爱奇艺中后台 Web 应用性能优化实践

爱奇艺技术产品团队

前端

justauth-spring-boot-starter V1.3.5 发布成功

RD

OAuth 2.0 justauth 第三方登录

想不想get和湖南卫视一样的现代直播?

亚马逊云科技 (Amazon Web Services)

AWS x 红帽 | 以客户需求为驱动,加速开放混合云落地

亚马逊云科技 (Amazon Web Services)

云计算 红帽 AWS

价值创造

JiangX

创业 投资 认知 28天写作 价值

洞察

JiangX

创业 投资 认知 28天写作 洞察

关于私域流量与社群的思考

.

28天写作

【薪火计划】09 - 员工激励理论

brave heart

管理 28天写作

Springboot 开发环境搭建和项目启动

武哥聊编程

Java springboot SpringBoot 2 28天写作

python 基本数据类型-1

赵开忠

Python 28天写作

前端性能优化之指标

知识乞丐

前端性能优化 28天写作

大作业 1

郎哲

同理心

lidaobing

28天写作 了不起的盖茨比

Activemq Jms 简单示例

Java 消息队列 JMS Activemq

爱奇艺SOAR探索与实践

爱奇艺技术产品团队

安全

28 天带你玩转 Kubernetes-- 第二天(K8s介绍)

Java全栈封神

Kubernetes k8s k8s入门 28天写作 k8s历史

「中国技术开放日·长沙站」现场直播

「中国技术开放日·长沙站」现场直播

Pulsar 和 Kafka 基准测试报告(下)-InfoQ