用kafka-producer-perf-test.sh对比batch.size从1到16384再到65536+linger.ms的吞吐量变化,再对比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秒,因为请求真实在队列里排队等前面的逐条请求处理完。
命令 · 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根本没攒起来。
命令 · 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
每一步都是本文上面用kafka-producer-perf-test.sh跑出来的原始结果。