【kafka性能测试脚本详解、性能测试、性能分析与性能调优】

这篇具有很好参考价值的文章主要介绍了【kafka性能测试脚本详解、性能测试、性能分析与性能调优】。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

Kafka 性能测试

一、介绍

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
-h, --help 指定生产的消息总数
–topic 如果通过 --payload-file 指定了从文件中获取消息内容,那么这个参数的意义是指定文件的消息分隔符,默认值为 \n,即文件的每一行视为一条消息;如果未指定 --payload-file 则此参数不生效
–num-records 限制每秒发送的最大的消息数,设为 -1 表示不限制
–payload-delimeter 直接指定 Producer 配置,格式为 NAME=VALUE,例如 bootstrap.server=127.0.0.1:9092,通过此种方式指定的配置优先级高于 --producer.config
–throughput 指定 Producer 的配置文件,格式参照官方的 config/producer.properties
–producer-props 在测试结束后打印更详尽的指标,默认为 false
–producer-config 指定事务 ID,测试并发事务的性能时需要,只有在 --transaction-duration-ms > 0 时生效,默认值为 performance-producer-default-transactional-id
–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 指定

测试

producer(生产者)

partitions(分区)

3个分区(partitions)

–replication-factor 4 --partitions 3(test)
1000 条大小为 1KB 的消息

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

kafka-consumer-perf-test.sh,kafka,kafka,分布式
1000000 条大小为 1KB 的消息

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

kafka-consumer-perf-test.sh,kafka,kafka,分布式

–replication-factor 1 --partitions 3(test13)
1000000 条大小为 1KB 的消息
kafka-consumer-perf-test.sh,kafka,kafka,分布式

4个分区(partitions)

–replication-factor 4 --partitions 4(testpro)
1000000 条大小为 1KB 的消息
kafka-consumer-perf-test.sh,kafka,kafka,分布式

–replication-factor 3 --partitions 4(testpro34)
1000000 条大小为 1KB 的消息
kafka-consumer-perf-test.sh,kafka,kafka,分布式

–replication-factor 1 --partitions 4(testpro14)
1000000 条大小为 1KB 的消息
kafka-consumer-perf-test.sh,kafka,kafka,分布式

5个分区(partitions)

–replication-factor 4 --partitions 5(testpro45)
1000000 条大小为 1KB 的消息
kafka-consumer-perf-test.sh,kafka,kafka,分布式

–replication-factor 3 --partitions 5(testpro35)
1000000 条大小为 1KB 的消息
kafka-consumer-perf-test.sh,kafka,kafka,分布式

2个broker的集群

4个副本3个分区(test)与4个副本5个分区(testpro45)生产1000000条数据对比:
test吞吐量相对高一点点(高3 mb/sec),而平均时延、最大时延、即生产各完成百分段时延都是testpro45较低

4个副本3个分区(test)与4个副本4个分区(testpro)生产1000000条数据对比:
testpro吞吐量高很多(高51 mb/sec),而平均时延、最大时延、即生产各完成百分段时延都是testpro低

3个副本4个分区(testpro34)与4个副本4个分区(testpro)生产1000000条数据对比:
testpro吞吐量相对较高(高15 mb/sec),而平均时延testpro34相对较低,最大时延testpro44相对较低,50%的消息时延testpro34较低,95%之后都是testpro的消息时延较低!

4个副本4个分区(testpro)与4个副本5个分区(testpro45)生产1000000条数据对比:
testpro吞吐量高很多(高54 mb/sec),而平均时延、最大时延、即生产各完成百分段时延都是testpro低


在同等条件下,消息数为1000000,分区数由小到大变化,其他参数不变,4个分区时,性能最优。


compression(压缩算法)

kafka-consumer-perf-test.sh,kafka,kafka,分布式


在同等条件下,消息数为1000000,压缩算法为gzip、snappy、lz4,其他参数不变,当采用lz4时吞吐量最高,而对于消息时延来说,gzip的平均和最大时延都是最低。


建议只有在producer cpu资源充裕的情况下,才开启压缩,否则会使机器cpu资源耗尽,反而得不偿失;
如果宽带资源比较紧张,建议开启压缩,可以使用zstd,极大的减少网络资源开销

Consumer(消费者)

compression(压缩算法)

使用不同的压缩算法生产消息
kafka-consumer-perf-test.sh,kafka,kafka,分布式
kafka-consumer-perf-test.sh,kafka,kafka,分布式

kafka-consumer-perf-test.sh,kafka,kafka,分布式

使用不同的解压缩算法消费消息
kafka-consumer-perf-test.sh,kafka,kafka,分布式


在同等条件下,消息数为1000000,压缩算法为gzip、snappy、lz4,其他参数不变,当生产和消费消息时采用lz4时性能最优。


threads(线程)

bin/kafka-consumer-perf-test.sh --broker-list 192.168.1.5:9092 --topic test --messages 1000000 --threads 8 compression.type=lz4
kafka-consumer-perf-test.sh,kafka,kafka,分布式

bin/kafka-consumer-perf-test.sh --broker-list 192.168.1.5:9092 --topic test --messages 1000000 --threads 4

kafka-consumer-perf-test.sh,kafka,kafka,分布式

threads 1
kafka-consumer-perf-test.sh,kafka,kafka,分布式

获取消息的线程数与实际吞吐率影响不大。
在增加分区数与消费线程数时,在小于3个分区时,3个分区与3个消费线程性能最优,在其他条件不改变的前提下,再进一步增加分区数与消费程数时,实际吞吐量变化不大。

配置建议

基于kafka的高度可配置的特性,可以应用到不同的业务场景,比如,实时性较强的跟踪用户在页面上的行为动作、实时性不高但可靠性很高的信用卡支付操作的处理等。

可靠性配置:

replication.factor

副本因子,针对topic级别的配置参数是replication.factor,以本次测试为例,有3个broker实例,建议合理的复制系数为1-3,以3为例,也就是每个分区会被3个broker各复制一次,即每个broker保存一个分区,即使在2个broker失效的情况下,仍然可以向topic写入消息或从topic读取消息。总结如下:
如果复制系数为N,那么在N-1个broker失效的情况下,仍然具备读写能力,因此更高的复制系数会带来更高的可靠性,但另一方面,N个复制系数需要至少N个broker,而且会有N份数据副本(副本包含leader与follower)。

unclean.leader.election.enable

不完全的leader选举,unclean.leader.election.enable在broker级别上进行配置,默认值为true(仅在当前版本为true,后续高版本为false)确保分区可从非 ISR 中选举 leader,官方在kafka高版本发行时,修改了这个默认值,暂时理解为官网的推荐设置,但对于实时性较高的业务,比如实时统计用户访问量的分析,一般会启用这个配置,即设置为true,但对于可靠性较高的业务,比如银行的业务,宁可花费几分钟或几个小时的延时后再处理像信用卡支付的业务,也不会冒险处理错误的消息。因此,按真实的业务场景来设置即为合理。

min.insync.replicas

最少同步副本,min.insync.replicas默认是1,本次测试中采用了3个broker,因此这个值可以设置1-3,当然如果选择3时,即为最少要同步3个副本才可以向分区写入数据,即为真正的提交,需要注意的是如果有1个broker出现问题,无法同步副本,那么剩下的broker就会停止生产者的所有请求,并抛出NotEnouqhReplicasException给生产者,直至问题broker恢复,此时消费者可以正常读取消息。

producer

producer发送确认,生产者可以选择3种不同模式的确认,acks为0时,只要生产者把消息发送出去,即认为已成功写入broker,这种模式下运行速度非常快,吞吐率和带宽利用率非常高,不过采用这种模式风险较高,容易丢失一些消息。一般压力测试都是基于这个模式的。使用实时性较高的系统,也不建议采用该模式。

acks

acks为1时,即为leader收到消息并写入分区数据文件(不一定同步到磁盘)后,提交成功,返回确认响应。
acks为-1或all时,即leader收到消息后,会等待所有同步副本都收到消息,才会返回确认响应。

acks = 0
如果设置为零,则生产者将不会等待来自服务器的任何确认,该记录将立即添加到套接字缓冲区并视为已发送。在这种情况下,无法保证服务器已收到记录,并且重试配置将不会生效(因为客户端通常不会知道任何故障),为每条记录返回的偏移量始终设置为-1。
acks = 1
这意味着leader会将记录写入其本地日志,但无需等待所有副本服务器的完全确认即可做出回应,在这种情况下,如果leader在确认记录后立即失败,但在将数据复制到所有的副本服务器之前,则记录将会丢失。
acks = all
这意味着leader将等待完整的同步副本集以确认记录,这保证了只要至少一个同步副本服务器仍然存活,记录就不会丢失,这是最强有力的保证,这相当于acks= -1的设置。
可以设置的值为:all, -1, 0, 1

producer

producer失败重试参数,当生产者没有收到成功的响应,重试发送次数,当前版本默认为0,根据实际业务来设置该参数,并非越大越好,也不建议设置为0,生产者收到的错误会包括2种,一种是可恢复性错误,一种是不可恢复性错误,遇到可恢复性的错误时,可以通过重试来解决,不可恢复性错误,只能由开发者手动处理。但由于网络原因造成的无法收到成功响应,此时如果无限次的重试发送,会造成分区内存在重复消息,增加了消费者读取消息时的业务处理的复杂度。因此分析实际业务场景,谨慎设置。

consumer auto.offset.reset

consumer auto.offset.reset,默认值为latest,即在没有offset时,消费者会从分区的末尾开始读取数据,减少读取重复消息的可能性,但可能会错过一些消息。设置为earliest,当出现offset不存在的情况时,从分区的开始位置读取数据,这样会读取大量重复消息,由消费端的业务逻辑来处理重复消息。增加了业务的复杂度。

当kafka中没有初始offset或offset超出范围时将自动重置offset
earliest:重置为分区中最小的offset;
latest:重置为分区中最新的offset(消费分区中新产生的数据);
none:只要有一个分区不存在已提交的offset,就抛出异常;

consumer auto.commit.interval.ms

consumer auto.commit.interval.ms,默认值为5000ms,即5秒提交一次,可以通过该参数来设置提交的频度,一般来说,提交频度越高,越会带来更高的系统开销,可靠性也随之提高。

1、实时类业务

实时类业务,把零延时作为第一考虑因素,比如聊天室、会议室、直播类似系统等,在保证最小延时的基础上,适当设置可靠性相关参数。建议可靠性参数如下:

replication.factor:1

unclean.leader.election.enable:true

min.insync.replicas:1

acks:0

retries:0

2、近实时类业务

即可接受一定范围内的延时,比如实时计算用户访问量等类似web监控类业务,在保证最小延时的基础上,适当设置可靠性相关参数。建议可靠性参数如下:

replication.factor:2

unclean.leader.election.enable:true

min.insync.replicas:2

acks:1

retries:1/2/3

consumer auto.commit.interval.ms:1000ms

consumer auto.offset.reset:latest

3、非实时类业务

非实时类业务,即可以允许一定时间的延时,从而来保证系统更高的可靠性。以3个broker以例,建议可靠性参数如下:

replication.factor:3 

unclean.leader.election.enable:false

min.insync.replicas:2/3

acks:all

retries:MAX_INT

consumer auto.commit.interval.ms:500ms

consumer auto.offset.reset:earliest

kafka-consumer-perf-test.sh,kafka,kafka,分布式文章来源地址https://www.toymoban.com/news/detail-763555.html

到了这里,关于【kafka性能测试脚本详解、性能测试、性能分析与性能调优】的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 性能分析与调优: Linux 使用 iperf3 进行TCP网络吞吐量测试

    目录 一、实验 1.环境 2.TCP网络吞吐量的微观基准测试 二、问题 1.iperf参数有哪些 2.iperf如何二进制安装 (1)主机 表1-1 主机 主机 架构 组件 IP 备注 prometheus 监测 系统 prometheus、node_exporter  192.168.204.18 grafana 监测GUI grafana 192.168.204.19 agent  监测 主机 node_exporter 192.168.204.20 (1)

    2024年02月03日
    浏览(50)
  • FlinkSQL【分组聚合-多维分析-性能调优】应用实例分析

    FlinkSQL处理如下实时数据需求: 实时聚合不同 类型/账号/发布时间 的各个指标数据,比如: 初始化/初始化后删除/初始化后取消/推送/成功/失败 的指标数据。要求实时产出指标数据,数据源是mysql cdc binlog数据。 其他配置 flink集群参数 检查点配置 job运行资源 管理节点(JM)

    2024年01月17日
    浏览(50)
  • 数据库监控与调优【六】—— SQL性能分析

    TIPS 本文基于MySQL 8.0 EXPLAIN分析SQL它不香吗?如何更加细致分析SQL的性能呢?深入SQL内部分析性能! SHOW PROFILE:简单、方便,已废弃 INFORMATION_SCHEMA.PROFILING:和SHOW PROFILE本质是一样的,已废弃 PERFORMANCE_SCHEMA:MYSQL建议的方式,未来之光,但目前来说使用不够方便 先要做一定的

    2024年02月11日
    浏览(48)
  • Linux的服务器日志分析及性能调优

    作为网络安全和数据传输的重要环节,代理服务器在现代互联网中扮演着至关重要的角色。然而,在高负载情况下,代理服务器可能面临性能瓶颈和效率问题。本文将介绍如何利用Linux系统对代理服务器进行日志分析,并提供一些实用技巧来优化其性能。 1. 日志收集与分析

    2024年02月10日
    浏览(46)
  • 性能分析与调优: Linux 使用ELRepo升级CentOS内核

    目录 一、实验 1.环境 2.agent 服务器使用ELRepo升级CentOS内核 二、问题 1. RHEL-7, SL-7 或者 CentOS-7系统如何安装ELRepo 2.RHEL-8或者RHEL-9系统如何安装ELRepo (1)主机 表1-1 主机 主机 架构 组件 IP 备注 prometheus 监测 系统 prometheus、node_exporter  192.168.204.18 grafana 监测GUI grafana 192.168.204.19

    2024年01月23日
    浏览(51)
  • 性能分析与调优: Linux 磁盘I/O 观测工具

    目录 一、实验 1.环境 2.iostat 3.sar 4.pidstat 5.perf 6. biolatency 7. biosnoop 8.iotop、biotop 9.blktrace 10.bpftrace 11.smartctl 二、问题 1.如何查看PSI数据 2.iotop如何安装 3.smartctl如何使用 (1)主机 表1-1 主机 主机 架构 组件 IP 备注 prometheus 监测 系统 prometheus、node_exporter  192.168.204.18 grafana 监测

    2024年01月16日
    浏览(53)
  • 聚焦112Gb/s SerDes芯片的AN/LT端口自协商和链路学习,评估验证高速链路的信号质量并分析调优(400/800G高速以太网互联接口,AI加速卡网络RDMA性能测试,交换背板接口性能评估)

    目录 引言 关于使用112G Serdes的100G、200G和400G以太网的简要背景 自动协商的基础知识 基础页和下一页 / Base Page and Next Pages DME基础页(IEEE802.3第73条) 下一页 (IEEE802.3) 下一页(以太网技术联盟) AN过程 优先表决 链路训练 训练帧 链路训练过程 如何使用AN和LT 结论 Freya - Xena的

    2024年02月16日
    浏览(56)
  • 【jvm系列-13】jvm性能调优篇---参数设置以及日志分析

    JVM系列整体栏目 内容 链接地址 【一】初识虚拟机与java虚拟机 https://blog.csdn.net/zhenghuishengq/article/details/129544460 【二】jvm的类加载子系统以及jclasslib的基本使用 https://blog.csdn.net/zhenghuishengq/article/details/129610963 【三】运行时私有区域之虚拟机栈、程序计数器、本地方法栈 https

    2024年02月06日
    浏览(44)
  • 【性能调优】local模式下flink处理离线任务能力分析

    本文相关讨论 flink内存对任务性能的影响:通过了解内存模型,了解这些模型都负责那些工作,比如用户代码使用堆,数据通讯使用直接内存等,以便能够根据任务特点针对性调整任务内存; 并发与带宽之间的关系,local模式下怎么根据带宽,设置最佳线程数; 内存监控相关

    2024年01月18日
    浏览(53)
  • kafka消费、生产性能问题分析及优化方法

    问题分析:将代码逻辑注释掉,直进行拉取数据操作,性能应为每分钟产生消息的2倍以上

    2024年02月07日
    浏览(40)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包