bigywater.tech
Kafka 内部原理 · 54

Producer 吞吐量为什么上不去

用kafka-producer-perf-test.sh对比batch.size从1到16384再到65536+linger.ms的吞吐量变化,再对比acks=1和acks=all在同样批量设置下的差距,看真实决定吞吐量的关键参数是什么。

51倍
batch.size从1改成默认值16384真实带来的吞吐提升
5%
同样批量设置下acks=1相对acks=all真实的差距

验证:不给消息攒批的机会,吞吐量真实低到离谱

命令 · shell $ kafka-producer-perf-test.sh --topic perf-test-topic --num-records 50000 --record-size 200 \ --throughput -1 --producer-props acks=all batch.size=1 linger.ms=0
真实实测 · 本机执行输出
50000 records sent, 6099.79 records/sec (1.16 MB/sec),
  4747.75 ms avg latency, 7904.00 ms max latency

batch.size=1真实意味着每条消息单独凑成一个batch立刻发送,Producer完全没有机会把多条消息真实打包进同一次网络请求——平均延迟真实飙到了4.7秒,因为请求真实在队列里排队等前面的逐条请求处理完。

验证:只是换回默认的batch.size,吞吐量真实涨了50多倍

命令 · shell $ kafka-producer-perf-test.sh --topic perf-test-topic --num-records 200000 --record-size 200 \ --throughput -1 --producer-props acks=all batch.size=16384 linger.ms=0
真实实测 · 本机执行输出
200000 records sent, 314960.63 records/sec (60.07 MB/sec),
  13.62 ms avg latency, 149.00 ms max latency

其它配置一个没动,只是把batch.size从1改回默认的16384字节——吞吐量真实从6099条/秒涨到314960条/秒,51倍。平均延迟也真实从4747毫秒降到13.62毫秒。这一个参数真实就是本文标题问题的答案:吞吐量上不去,最常见的原因不是acks、不是压缩,是batch根本没攒起来。

验证:acks=1和acks=all在同样的批量设置下,差距真实很小

命令 · shell $ kafka-producer-perf-test.sh ... --producer-props acks=all batch.size=65536 linger.ms=20 $ kafka-producer-perf-test.sh ... --producer-props acks=1 batch.size=65536 linger.ms=20
真实实测 · 本机执行输出
acks=all: 445434.30 records/sec (84.96 MB/sec), 1.33 ms avg latency
acks=1:   468384.07 records/sec (89.34 MB/sec), 1.09 ms avg latency
同样调大批量之后,acks=1相对acks=all真实只快了约5%——因为本机3副本都在同一台机器的loopback网络上,等所有ISR副本确认的额外开销真实很小。这个真实的量级对比给出一个明确的优先级:如果吞吐量不够,先看batch.size和linger.ms有没有给消息真实攒批的机会(本文这组实验从6099到445434,96倍的空间都在这两个参数上),acks的选择更多是在一致性和极限性能之间做取舍,不是吞吐量的主要瓶颈。

分步演示:四组配置真实的吞吐量对比

每一步都是本文上面用kafka-producer-perf-test.sh跑出来的原始结果。

批量大小的影响是51倍,acks的影响只有5%
这一步新验证的配置

    参考与说明

    • 数据来自本机3节点Kafka 4.3.1集群,topic perf-test-topic(3分区3副本),官方自带的kafka-producer-perf-test.sh压测工具。
    • 和《Producer 批量发送:batch.size 和 linger.ms》一起看:那篇专门拆解这两个参数各自真实的作用,这篇先给出batch大小对吞吐量影响的量级对比。
    • 没有验证:真实网络延迟明显(比如跨机房)场景下acks=1和acks=all的差距是否会显著放大;record-size远大于200字节时批量效应是否依然这么明显。
    京ICP备2026067502号-1京公网安备11010502063487号