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

posted @ 2022-07-07 15:03  OUYM  阅读(1289)  评论(0编辑  收藏  举报