一、介绍

Apache Kafka 官方提供了两个客户端性能测试脚本,它们的存放位置如下:

  • 生产者性能测试脚本:$KAFKA_HOME/bin/kafka-producer-perf-test.sh
  • 消费者性能测试脚本:$KAFKA_HOME/bin/kafka-consumer-perf-test.sh

kafka-producer-perf-test.sh 支持测试的性能指标包括:吞吐量(throughput)、最大时延(max-latency)、平均时延(avg-latency);kafka-consumer-perf-test.sh 同样支持吞吐量指标,还提供了一些消费端特有的指标,但没有直接提供时延信息。

二、使用

2.1 kafka-producer-perf-test.sh

此脚本用于测试 Kafka 生产消息的性能,可选参数列表如下。

-h, --help 	显示使用帮助并退出
--topic 	指定生产的消息发往的 topic
--num-records 	指定生产的消息总数
--payload-delimeter 	如果通过 --payload-file 指定了从文件中获取消息内容,那么这个参数的意义是指定文件的消息分隔符,默认值为 \n,即文件的每一行视为一条消息;如果未指定 --payload-file 则此参数不生效
--throughput 	限制每秒发送的最大的消息数,设为 -1 表示不限制
--producer-props 	直接指定 Producer 配置,格式为 NAME=VALUE,例如 bootstrap.server=127.0.0.1:9092,通过此种方式指定的配置优先级高于 --producer.config
--producer-config 	指定 Producer 的配置文件,格式参照官方的 config/producer.properties
--print-metrics 	在测试结束后打印更详尽的指标,默认为 false
--transactional-id 	指定事务 ID,测试并发事务的性能时需要,只有在 --transaction-duration-ms > 0 时生效,默认值为 performance-producer-default-transactional-id
--transactional-duration-ms 	指定事务持续的最长时间,超过这段时间后就会调用 commitTransaction 来提交事务,只有指定了 > 0 的值才会开启事务,默认值为 0
--record-size 	指定每条消息的大小,单位是字节,和 --payload-file 两个中必须指定一个,但不能同时指定
--payload-file 	指定消息的来源文件,只支持 UTF-8 编码的文本文件,文件的消息分隔符通过 --payload-delimeter 指定,和 --record-size 两个中必须指定一个,但不能同时指定

【示例】

bin/kafka-producer-perf-test.sh --topic perf-test --num-records 1000 --record-size 1024 --throughput -1 --producer-props bootstrap.servers=127.0.0.1:9092 compression.type=lz4

【输入解释】

发送 1000 条大小为 1KB 的消息到地址为 127.0.0.1:9092 的 broker 上的 perf-test 主题,发送时不限制吞吐量,并使用 lz4 算法压缩消息。

执行示例命令后,控制台输出一行测试结果,如下:

1000 records sent, 3424.657534 records/sec (3.34 MB/sec), 13.61 ms avg latency, 255.00 ms max latency, 13 ms 50th, 20 ms 95th, 255 ms 99th.

【输出解释】

成功消费了 1000 条消息,吞吐量为 3424.657534 条/秒 (或 3.34 MB/秒),平均时延为 13.61 ms,最大时延为 255.00 ms,50 % 的消息延时在 13 ms 内,95 % 的消息延时在 20 ms 内,99 % 的消息延时在 255 毫秒内。

2.2 kafka-consumer-perf-test.sh

此脚本用于测试 Kafka 消费消息的性能,可选参数列表如下。

--bootstrap-server 指定 broker 地址,必选,除非用 --broker-list 代替(不建议)
--topic 指定消费的 topic,必选
--version 输出 Kafka 版本
--consumer.config 指定 Consumer 配置文件
--date-format 指定用于格式化 *.time 的规则,默认为 yyyy-MM-dd HH:mm:ss:SSS
--fetch-size 指定一次请求消费的大小,默认为 1048576 即 1 MB
--from-latest 如果 Consumer 没有已经建立的 offset,则指定从 log 中最新的位点开始消费,而不是从最早的位点开始消费
--group 指定 ConsumerGroup ID,默认为 perf-consumer-40924
--help 显示使用帮助并退出
--hide-header 指定后不输出 header 信息
--messages 指定消费的消息数量,必选
--num-fetch-threads 指定 fetcher 线程的数量
--print-metrics 指定打印 metrics 信息
--reporting-interval 指定打印进度信息的时间间隔,默认为 5000 即 5 秒
--show-detailed-stats 指定每隔一段时间(由 --reporting-interval 指定)输出显示详细的状态信息
--socket-buffer-size 指定 TCP 的 RECV 大小,默认为 2097152 即 2 MB
--threads 指定消费的线程数,默认为 10
--timeout 指定允许的最大超时时间,即每条消息返回的最大时间间隔,默认为 10000 即 10 秒

【示例】

bin/kafka-consumer-perf-test.sh --bootstrap-server 127.0.0.1:9092 --topic perf_test --messages 1000000 --threads 8 --reporting-interval 1000 --show-detailed

【输入解释】

同时开启 8 个消费线程,从 127.0.0.1:9092 的 broker 上的 perf-test 主题中消费 1000 条消息,每隔 1000 ms = 1 s 打印一次消费进度信息。最后两个参数在消费数量很小的场景下没有什么帮助,比如若消费数量只有 1000,命令瞬间就可以执行返回;但当指定的消费数量很大(如示例中为 1000 万)时,需要 10 s 左右才能消费完,此时定时输出一下进度信息就显得很有用了。执行示例命令后,控制台输出两行信息,其中第一行为表头,接下来的数行为每秒的进度信息,如下:

time, threadId, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec, rebalance.time.ms, fetch.time.ms, fetch.MB.sec, fetch.nMsg.sec
2021-03-25 15:57:59:426, 0, 657.2275, 657.2275, 673001, 673001.0000, 1616659078690, -1616659077690, 0.0000, 0.0000
...

【输出解释】

time:当前时间,格式由 --date-format 指定
threadId:线程 ID
data.consumed.in.MB:消费到的数据总大小,单位为 MB
MB.sec:消费 TPS,即每秒消费的消息大小
data.consumed.in.nMsg:消费到的总消息数
nMsg.sec:消费 TPS,即每秒消费的消息条数
rebalance.time.ms:消费者组重平衡的耗时,单位为 ms,0 表示没有发生重平衡
fetch.time.ms:fetch 线程的总耗时,单位为 ms
fetch.MB.sec:fetch 线程每秒钟获取到的消息大小
fetch.nMsg.sec:fetch 线程每秒钟获取到的消息数量

【注意】

若没有指定 --show-detailed,则输出信息中的前两项会有所不同,如下:

start.time, end.time, data.consumed.in.MB, MB.sec, ...

start.time:消费开始的时间,格式由 --date-format 指定
end.time:消费结束的时间,格式由 --date-format 指定

参考连接:https://www.cnblogs.com/lkxed/p/kafka-perf-test-tools.html