起因
我从kafka2.6.1升级到kafka3.3.1的kraft模式之后,想要压测一下来对比两者性能。
使用kafka自带的压测脚本kafka-producer-perf-test.sh写入10G的数据
nohup ./kafka-producer-perf-test.sh --topic test --num-records 10485760 --record-size 1024 --throughput -1 --producer-props bootstrap.servers=10.9.165.68:9092,10.9.64.103:9092,10.9.178.93:9092 > ./producer.log 2>&1 &
结果压测出来
kafka3.3.1有74MB/s
kafka2.6.1居然有142MB/s
两套物理环境的硬件配置一致,都是三节点的2c 4G 200G SSD。2.6.1用的centos6,3.3.1用的centos7
dd测试两套环境磁盘写入速度相近,都有140MB/s左右的速度
结论
结论:ack和压测程序逻辑有变化
kafka3.3.1相比kafka2.6.1生产者的默认参数有很大的变化主要有以下区别
| 2.6.1默认值 | 3.3.1默认值 | |
|---|---|---|
| partitioner.adaptive.partitioning.enable | 无此配置 | 开启 |
| ack | 1 | all |
| partitioner.availability.timeout.ms | 无此配置 | 0 |
| partitioner.ignore.keys | 无此配置 | false |
| socket.connection.setup.timeout.ms | 无 | 10000 |
| ack会影响broker的返回写入成功的速度 |
还有一个很重要的点是压测程序org.apache.kafka.tools.ProducerPerformance生成消息payload的时候逻辑不一样
kafka2.6.1发送消息的时候所有消息都是共用一个payload对象
而kafka3.3.1则是每发送一次消息就重新生成一次payload
将压测命令完善并将压测逻辑修payload生成逻辑修改成与kafka2.6.1一致,重新打包成kafka-tools-3.3.1.jar放到kafka/libs下压测
./kafka-producer-perf-test.sh \
--topic test \
--num-records 10485760 \
--record-size 1024 \
--throughput -1 \
--producer-props bootstrap.servers=10.9.165.68:9092,10.9.64.103:9092,10.9.178.93:9092 \
partitioner.class=org.apache.kafka.clients.producer.RoundRobinPartitioner \
acks=1 \
batch.size=16384 \
linger.ms=5 \
compression.type=none \
buffer.memory=67108864 > ./producer.log 2>&1 &
2.6.1
3.3.1
kafka3.3.1的速度已经与kafka2.6.1差不多,略有提升