欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

Kafka Performance Benchmark

程序员文章站 2022-04-19 16:06:19
...

摘要

  本文主要介绍了如何利用Kafka自带的性能测试脚本测试Kafka的性能,最后给出了Kafka的性能测试报告。

Kafka性能测试脚本

  • $KAFKA_HOME/bin/kafka-producer-perf-test.sh 该脚本被设计用于测试Kafka Producer的性能,主要输出4项指标,总共发送消息量(以MB为单位),每秒发送消息量(MB/second),发送消息总数,每秒发送消息数(records/second)。除了将测试结果输出到标准输出外,该脚本还提供CSV Reporter,即将结果以CSV文件的形式存储,便于在其它分析工具中使用该测试结果
  • $KAFKA_HOME/bin/kafka-consumer-perf-test.sh 该脚本用于测试Kafka Consumer的性能,主要输出指标为:开始时间,结束时间 ,消费消息总大小,每秒消费大小,消费消息总条数,每秒消费条数

Kafka Benchmark

CPU model: Intel(R) Xeon(R) CPU E5-2620 v4 @ 2.10GHz
Mem: 64G Disk:1000.2G*2
OS : CentOS 7.5.1804
Kafka Version:1.0.1
利用Ambari的监控功能查看测试过程中的吞吐率

Message Size VS. Throughput

  实验条件:1个Broker,1个Topic,6个Partition,1个Replication,3个Producer

  测试项目:分别测试消息长度为100,120,140,150,200,400,800,1000,2000,5000字节时的集群总吞吐量  

创建Topic

./bin/kafka-topics.sh –create –zookeeper storage-1.sinocbd.local:2181,storage-2.sinocbd.local:2181,storage-3.sinocbd.local:2181 –replication-factor 1 –partitions 6 –topic D1

测试脚本

./bin/kafka-producer-perf-test.sh --topic D1 --num-records 10000  --throughput 10000 --reco-size 100 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic D1 --num-records 10000  --throughput 10000 --reco-size 120 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic D1 --num-records 10000  --throughput 10000 --reco-size 140 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic D1 --num-records 10000  --throughput 10000 --reco-size 150 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic D1 --num-records 10000  --throughput 10000 --reco-size 200 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic D1 --num-records 10000  --throughput 10000 --reco-size 400 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic D1 --num-records 10000  --throughput 10000 --reco-size 800 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic D1 --num-records 10000  --throughput 10000 --reco-size 1000 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic D1 --num-records 10000  --throughput 10000 --reco-size 2000 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667 
./bin/kafka-producer-perf-test.sh --topic D1 --num-records 10000  --throughput 10000 --reco-size 5000 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667

测试结果

 不同消息长度时的集群总吞吐率如下图所示

Kafka Performance Benchmark
由上图可知,消息越长,每秒所能发送的消息数越少,而每秒所能发送的消息的量(MB)越大。另外,每条消息除了Payload外,还包含其它Metadata,所以每秒所发送的消息量比每秒发送的消息数乘以100字节大,而Payload越大,这些Metadata占比越小,同时发送时的批量发送的消息体积越大,越容易得到更高的每秒消息量(MB/s)。其它测试中使用的Payload为100字节,之所以使用这种短消息(相对短)只是为了测试相对比较差的情况下的Kafka吞吐率。

Partition Number VS. Throughput

  实验条件:1个Broker,1个Topic,1个Replication,3个Producer,消息Payload为100字节

  测试项目:分别测试1到9个Partition时的吞吐量
  

创建Topic

./bin/kafka-topics.sh --create --zookeeper storage-1.sinocbd.local:2181,storage-2.sinocbd.local:2181,storage-3.sinocbd.local:2181 --replication-factor 1 --partitions 1 --topic p1
./bin/kafka-topics.sh --create --zookeeper storage-1.sinocbd.local:2181,storage-2.sinocbd.local:2181,storage-3.sinocbd.local:2181 --replication-factor 1 --partitions 2 --topic p2
./bin/kafka-topics.sh --create --zookeeper storage-1.sinocbd.local:2181,storage-2.sinocbd.local:2181,storage-3.sinocbd.local:2181 --replication-factor 1 --partitions 3 --topic p3
./bin/kafka-topics.sh --create --zookeeper storage-1.sinocbd.local:2181,storage-2.sinocbd.local:2181,storage-3.sinocbd.local:2181 --replication-factor 1 --partitions 4 --topic p4
./bin/kafka-topics.sh --create --zookeeper storage-1.sinocbd.local:2181,storage-2.sinocbd.local:2181,storage-3.sinocbd.local:2181 --replication-factor 1 --partitions 5 --topic p5
./bin/kafka-topics.sh --create --zookeeper storage-1.sinocbd.local:2181,storage-2.sinocbd.local:2181,storage-3.sinocbd.local:2181 --replication-factor 1 --partitions 6 --topic p6
./bin/kafka-topics.sh --create --zookeeper storage-1.sinocbd.local:2181,storage-2.sinocbd.local:2181,storage-3.sinocbd.local:2181 --replication-factor 1 --partitions 7 --topic p7
./bin/kafka-topics.sh --create --zookeeper storage-1.sinocbd.local:2181,storage-2.sinocbd.local:2181,storage-3.sinocbd.local:2181 --replication-factor 1 --partitions 8 --topic p8
./bin/kafka-topics.sh --create --zookeeper storage-1.sinocbd.local:2181,storage-2.sinocbd.local:2181,storage-3.sinocbd.local:2181 --replication-factor 1 --partitions 9 --topic p9

测试脚本

./bin/kafka-producer-perf-test.sh --topic p1 --num-records 1000000  --throughput 1000000 --record-size 100 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic p2 --num-records 1000000  --throughput 1000000 --record-size 100 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic p3 --num-records 1000000  --throughput 1000000 --record-size 100 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic p4 --num-records 1000000  --throughput 1000000 --record-size 100 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic p5 --num-records 1000000  --throughput 1000000 --record-size 100 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic p6 --num-records 1000000  --throughput 1000000 --record-size 100 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic p7 --num-records 1000000  --throughput 1000000 --record-size 100 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic p8 --num-records 1000000  --throughput 1000000 --record-size 100 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic p9 --num-records 1000000  --throughput 1000000 --record-size 100 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667

测试结果

不同Partition数量时的集群总吞吐率如下图所示
Kafka Performance Benchmark
由上图可知,当Partition数量小于Broker个数(3个)时,Partition数量越大,吞吐率越高,且呈线性提升。此实验中,启动3个Broker,而一个Partition只能存在于1个Broker上,故当某个Topic只包含1个Partition时,实际只有1个Broker在为该Topic工作。如之前文章所讲,Kafka会将所有Partition均匀分布到所有Broker上,所以当只有2个Partition时,会有2个Broker为该Topic服务。3个Partition时同理会有3个Broker为该Topic服务。换言之,Partition数量小于等于3个时,越多的Partition代表越多的Broker为该Topic服务。由Kafka相关知识知,不同Broker上的数据并行插入,这就解释了当Partition数量小于等于3个(Broker数量)时,吞吐率随Partition数量的增加线性提升。

  当Partition数量多于Broker个数时,总吞吐量并未有所提升,甚至还有所下降。可能的原因是,当Partition数量为4和5时,不同Broker上的Partition数量不同,而Producer会将数据均匀发送到各Partition上,这就造成各Broker的负载不同,不能最大化集群吞吐量。而上图中当Partition数量为Broker数量整数倍时吞吐量明显比其它情况高,也证实了这一点。

Replica Number VS. Throughput

  实验条件:3个Broker,1个Topic,3个Partition,3个Producer,消息Payload为100字节,

  测试项目:分别测试1到3个Replica时的吞吐率
  

创建Topic

./bin/kafka-topics.sh --create --zookeeper storage-1.sinocbd.local:2181,storage-2.sinocbd.local:2181,storage-3.sinocbd.local:2181 --replication-factor 1 --partitions 1 --topic r1
./bin/kafka-topics.sh --create --zookeeper storage-1.sinocbd.local:2181,storage-2.sinocbd.local:2181,storage-3.sinocbd.local:2181 --replication-factor 2 --partitions 1 --topic r2
./bin/kafka-topics.sh --create --zookeeper storage-1.sinocbd.local:2181,storage-2.sinocbd.local:2181,storage-3.sinocbd.local:2181 --replication-factor 3 --partitions 1 --topic r3

测试脚本

./bin/kafka-producer-perf-test.sh --topic r1 --num-records 1000000  --throughput 1000000 --record-size 500 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667,storage-2.sinocbd.local:6667,storage-3.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic r2 --num-records 1000000  --throughput 1000000 --record-size 500 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667,storage-2.sinocbd.local:6667,storage-3.sinocbd.local:6667
./bin/kafka-producer-perf-test.sh --topic r3 --num-records 1000000  --throughput 1000000 --record-size 500 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667,storage-2.sinocbd.local:6667,storage-3.sinocbd.local:6667

测试结果

不同Replica数量时的集群总吞吐率如下图所示
Kafka Performance Benchmark
由Kafka相关知识可知,随着Replica数量的增加,吞吐率应随之下降。但由上图可知吞吐率的下降并非线性下降,分析得出因为多个Follower的数据复制是并行进行的,而非串行进行;再结合之前测试结果分析得出因为单个吞吐率并未达到应有的吞吐率。

Consumer Only

  实验条件:3个Broker,1个Topic,6个Partition,1个Replication,消息Payload为100字节

  测试项目:分别测试1到3个Consumer时的集群总吞吐率

测试脚本

./bin/kafka-consumer-perf-test.sh --broker-list storage-1.sinocbd.local:6667,storage-2.sinocbd.local:6667,storage-3.sinocbd.local:6667 --threads 1 --topic D1 --messages 1000000
./bin/kafka-consumer-perf-test.sh --broker-list storage-1.sinocbd.local:6667,storage-2.sinocbd.local:6667,storage-3.sinocbd.local:6667 --threads 2 --topic D1 --messages 1000000
./bin/kafka-consumer-perf-test.sh --broker-list storage-1.sinocbd.local:6667,storage-2.sinocbd.local:6667,storage-3.sinocbd.local:6667 --threads 3 --topic D1 --messages 1000000

测试结果

在集群中已有大量消息的情况下,使用1到3个Consumer时的集群总吞吐量如下图所示

Kafka Performance Benchmark)

由上图可知,单个Consumer每秒可消费64万条消息,该数量远大于单个Producer每秒可消费的消息数量,这保证了在合理的配置下,消息可被及时处理。并且随着Consumer数量的增加,集群总吞吐量增加。

Producer Consumer pair

  实验条件:3个Broker,1个Topic,6个Partition,1个Replication,消息Payload为100字节

  测试项目:测试1个Producer和1个Consumer同时工作时Consumer所能消费到的消息量

测试脚本

./bin/kafka-producer-perf-test.sh --topic D1 --num-records 1000000  --throughput 1000000 --record-size 100 --producer-props bootstrap.servers=storage-1.sinocbd.local:6667,storage-2.sinocbd.local:6667,storage-3.sinocbd.local:6667
./bin/kafka-consumer-perf-test.sh --broker-list storage-1.sinocbd.local:6667,storage-2.sinocbd.local:6667,sinocbd.local:6667 --threads 1 --topic D1 --messages 1000000

测试结果

621504.039776 records/sec (59.27 MB/sec)

感谢下列文章的分享