1.测试目的
本次性能测试在正式环境下单台服务器上Kafka处理MQ消息能力进行压力测试。测试包括对Kafka写入MQ消息和消费MQ消息进行压力测试,根据10w、100w和1000w级别的消息处理结果,评估Kafka的处理性能是否满足项目需求。(该项目期望Kafka能够处理上亿级别的MQ消息)
2.测试范围及方法
2.1测试范围概述
测试使用Kafka自带的测试脚本,通过命令对Kafka发起写入MQ消息和Kafka消费MQ消息的请求。模拟不同数量级的MQ消息写入和MQ消息消费场景,根据Kafka的处理结果,评估Kafka是否满足处理亿级以上的消息的能力。
2.2性能测试场景设计
2.2.1Kafka写入消息压力测试
测试场景 | MQ消息数 (W) | 每秒写入消息数(条) | 记录大小(单位:字节) |
---|---|---|---|
Kafka消息写入测试 | 10 | 2000 | 1000 |
Kafka消息写入测试 | 100 | 5000 | 1000 |
Kafka消息写入测试 | 1000 | 5000 | 1000 |
2.2.2Kafka消费消息压力测试
测试场景 | 消费MQ消息数 (W) |
---|---|
Kafka消息消费测试 | 10 |
Kafka消息消费测试 | 100 |
Kafka消息消费测试 | 1000 |
2.3测试方法简要描述
2.3.1测试目的
验证带台服务器上Kafka写入消息和消费消息的能力,根据测试结果评估当前Kafka集群模式是否满足上亿级别的消息处理能力。
2.3.2测试方法
在服务器上使用Kafka自带的测试脚本,分别模拟10w、100w和1000w的消息写入请求,查看Kafka处理不同数量级的消息数时的处理能力,包括每秒生成消息数、吞吐量、消息延迟时间。Kafka消息吸入创建的topic命名为test_perf,使用命令发起消费该topic的请求,查看Kafka消费不同数量级别的消息时的处理能力。
测试项 | 压测消息数(单位:W) | 测试命令 |
---|---|---|
写入MQ消息 | 10 | ./kafka-producer-perf-test.sh --topic test_perf --num-records 100000 --record-size 1000 --throughput 2000 --producer-props bootstrap.servers=localhost:9092 |
写入MQ消息 | 100 | ./kafka-producer-perf-test.sh --topic test_perf --num-records 1000000 --record-size 1000 --throughput 5000 --producer-props bootstrap.servers=localhost:9092 |
写入MQ消息 | 1000 | ./kafka-producer-perf-test.sh --topic test_perf --num-records 10000000 --record-size 1000 --throughput 5000 --producer-props bootstrap.servers=localhost:9092 |
消费MQ消息 | 10 | ./kafka-consumer-perf-test.sh --broker-list localhost:9092 --topic test_perf --fetch-size 1048576 --messages 100000 --threads 1 |
消费MQ消息 | 100 | ./kafka-consumer-perf-test.sh --broker-list localhost:9092 --topic test_perf --fetch-size 1048576 --messages 1000000 --threads 1 |
消费MQ消息 | 1000 | ./kafka-consumer-perf-test.sh --broker-list localhost:9092 --topic test_perf --fetch-size 1048576 --messages 10000000 --threads 1 |
注:脚本执行目录 /usr/local/Cellar/kafka/2.1.0/libexec/bin
3.测试环境
硬件:Mac book、16G内存、4核处理器
测试工具:Kafka自带压测脚本
4.测试结果
4.1测试结果说明
本次测试针对Kafka消息处理的能力 进行压力测试,对Kafka集群服务器中的一台进行MQ消息服务的压力测试,关注Kafka消息写入的延迟时间是否满足需求。对Kafka集群服务器中的一台进行MQ消息处理的压力测试,验证Kafka的消息处理能力。
4.2测试结果
4.2.1写入MQ消息
设置消息总数(单位:w) | 设置单个消息大小(单位:字节) | 设置每秒发送消息数 | 实际写入消息数/秒 | 95%的消息延迟(单位:ms) |
---|---|---|---|---|
10 | 1000 | 2000 | 1999.52 | 1 |
100 | 1000 | 5000 | 4999.75 | 1 |
1000 | 1000 | 5000 | 4999.97 | 1 |
压测结果截图
写入10w消息压测结果
写入100w消息压测结果
写入1000w消息压测结果
kafka-producer-perf-test.sh 脚本命令的参数解析(以100w写入消息为例):
–topic topic名称,本例为test_perf
–num-records 总共需要发送的消息数,本例为100000
–record-size 每个记录的字节数,本例为1000
–throughput 每秒钟发送的记录数,本例为5000
–producer-props bootstrap.servers=localhost:9092 (发送端的配置信息,本次测试取集群服务器中的一台作为发送端,可在kafka的config目录,以该项目为例:/usr/local/kafka/config;查看server.properties中配置的zookeeper.connect的值,默认端口:9092)
MQ消息写入测试结果解析:
本例中写入100w条MQ消息为例,每秒平均向kafka写入了4.77MB的数据,大概是4999.75条消息/秒,每次写入的平均延迟为0.94毫秒,最大的延迟为153毫秒,1ms内占95%。
4.2.2消费MQ消息
消费消息总数(单位:w) | 共消费数据(单位:M) | 每秒消费数据(单位:M) | 每秒消费消息数 | 消费耗时(单位:s) |
---|---|---|---|---|
10 | 95.82 | 187.15 | 196244.1 | 0.5 |
100 | 954.03 | 319.60 | 335133.3 | 3.0 |
1000 | 9537.11 | 411.01 | 430976.81 | 23.2 |
压测结果截图
消费10w消息压测结果
消费100w消息压测结果
消费1000w消息压测结果
kafka-consumer-perf-test.sh 脚本命令的参数为:
–zookeeper 指定zookeeper的链接信息,本例为localhost:2181 ;
–topic 指定topic的名称,本例为test_perf,即4.2.1中写入的消息;
–fetch-size 指定每次fetch的数据的大小,本例为1048576,也就是1M
–messages 总共要消费的消息个数,本例为1000000,100w
以本例中消费100w条MQ消息为例总共消费了954.03M的数据,每秒消费数据大小为319.6081M,总共消费了1000373条消息,每秒消费335133.33条消息。
5.结果分析
kafka写入MQ消息设置5000条/秒时,消息延迟时间小于等于1ms,在可接受范围内,说明消息写入及时;kafka消费MQ消息时,1000W待处理消息的处理能力如果在每秒40w条以上,那么处理结果是理想的。
根据Kafka处理10w、100w和1000w级的消息时的处理能力,可以评估出Kafka集群服务,是否有能力处理上亿级别的消息。
本次测试是在正式环境集群服务中的单台服务器上进行,基本不需要考虑网络带宽的影响。所以单台服务器的测试结果,对评估集群服务是否满足上线后实际应用的需求,很有参考价值。
6、原文链接
https://blog.csdn.net/laofashi2015/article/details/81111466
https://www.cnblogs.com/xiao987334176/p/10075659.html
注:以上操作均在 Mac 系统上实践。