kafka生产和消费压测
1.测试工具
官方自带工具
kafka-consumer-perf-test.sh
kafka-producer-perf-test.sh
2.环境准备
连接线上集群:broker节点数大于6,版本2.2.1
这里主要是分享流程,服务器配置以及集群情况不一样测试数据也会不一样,所以就不贴服务器配置了。
提前创建topic
pressure_test_p1:1个分区
pressure_test_p6:6个分区
3.生产测试
kafka-producer-perf-test 重要参数
--record-size:单条消息大小,单位字节 --num:消息条数 --throughput:每秒多少条信息,设置成-1,表示不限流,可测生产者最大吞吐量
(1)单分区生产测试
测试了单分区topic,单条消息为1KB,10w条消息写入的吞吐量,测试三次结果:
命令: kafka-producer-perf-test --topic pressure_test_p1 --record-size 1024 --num-records 100000 --throughput -1 --producer-props bootstrap.servers=xxxx 结果: 100000 records sent, 43630.017452 records/sec (42.61 MB/sec), 505.11 ms avg latency, 627.00 ms max latency, 592 ms 50th, 615 ms 95th, 623 ms 99th, 626 ms 99.9th. 100000 records sent, 45662.100457 records/sec (44.59 MB/sec), 488.63 ms avg latency, 600.00 ms max latency, 566 ms 50th, 577 ms 95th, 594 ms 99th, 598 ms 99.9th. 100000 records sent, 45766.590389 records/sec (44.69 MB/sec), 478.87 ms avg latency, 592.00 ms max latency, 564 ms 50th, 577 ms 95th, 589 ms 99th, 591 ms 99.9th.
同上条件,测试100w条消息:
命令: kafka-producer-perf-test --topic pressure_test_p1 --record-size 1024 --num-records 1000000 --throughput -1 --producer-props bootstrap.servers=xxxx 结果: 256036 records sent, 51207.2 records/sec (50.01 MB/sec), 525.7 ms avg latency, 615.0 ms max latency. 285570 records sent, 57114.0 records/sec (55.78 MB/sec), 540.5 ms avg latency, 566.0 ms max latency. 285750 records sent, 57150.0 records/sec (55.81 MB/sec), 537.4 ms avg latency, 549.0 ms max latency. 1000000 records sent, 55549.383402 records/sec (54.25 MB/sec), 534.46 ms avg latency, 615.00 ms max latency, 537 ms 50th, 571 ms 95th, 580 ms 99th, 607 ms 99.9th.
(2)多分区生产测试
测试单个topic 6 个分区,单条消息为1KB,100w条消息写入的吞吐量
命令: kafka-producer-perf-test --topic pressure_test_p6 --record-size 1024 --num-records 1000000 --throughput -1 --producer-props bootstrap.servers=xxxx 结果: 1000000 records sent, 186011.904762 records/sec (181.65 MB/sec), 150.06 ms avg latency, 300.00 ms max latency, 136 ms 50th, 228 ms 95th, 280 ms 99th, 295 ms 99.9th.
4.消费测试
kafka-consumer-perf-test 重要参数
broker-list:节点地址 topic:指定topic名称 fetch-size:指定每个fetch的数据大小 messages:总共要消费的消息个数
单个消费者消费一个分区:100w条消息,每条1KB的结果如下
命令: kafka-consumer-perf-test --broker-list xxxx --topic pressure_test_p1 --fetch-size 5000 -messages 1000000 --threads 1 结果: start.time, end.time, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec, rebalance.time.ms, fetch.time.ms, fetch.MB.sec, fetch.nMsg.sec 2022-07-07 14:17:31:293, 2022-07-07 14:19:04:348, 976.5674, 10.4945, 1000005, 10746.3865, 3022, 90033, 10.8468, 11107.0941
解释:
开始时间:2022-07-07 14:17:31:293
结束时间:2022-07-07 14:19:04:348
共消费数据:976.5674MB
吞吐量:10.4945MB/s (感觉有点小)
共消费数据:1000005条
平均每秒消费:10746.3865条
6个消费者消费6个分区:100w条消息,每条1KB的结果如下
命令: kafka-consumer-perf-test --broker-list xxxx --topic pressure_test_p6 --fetch-size 5000 -messages 1000000 --threads 6 结果: 2022-07-07 14:24:39:438, 2022-07-07 14:24:58:465, 976.5625, 51.3251, 1000000, 52556.8928, 3023, 16004, 61.0199, 62484.3789
解释:
开始时间:2022-07-07 14:24:39:438
结束时间:2022-07-07 14:24:58:465
共消费数据:976.5625MB
吞吐量:51.3251MB/s
共消费数据:1000000条
平均每秒消费:52556.8928条
5.实验分析
实验结果表明分区增长带来的吞吐量的提升大致是线性的。(可以多测试几个对照组,本文偷懒了)
但是也不能无脑加分区,每个分区要消耗文件句柄的,也会给broker的管理带来开销。
那么创建topic时选择多少分区合适呢?
上限我们姑且不超过50(Kafka内部消费者组和事务topic设置分区数默认就是50)
下限我们可以按吞吐量预估
假设
单分区生产吞吐量是44.59 MB/sec,用TP表示
单分区的消费吞吐量是10.49MB/s,用TC表示
我们预期吞吐量是100MB/s,用TE表示
那么
分区数 = TE / min(TP,TC) = 9.53 向上取整10个分区
除了按照吞吐量外,还可以按照业务预估分区。比如说数据量不大,但是可以按照枚举划分业务范围如季节,就可以创建4个分区,春夏秋冬分别读写分区0、1、2、3
官网提供了详细的性能测试:
https://engineering.linkedin.com/kafka/benchmarking-apache-kafka-2-million-writes-second-three-cheap-machines