kafka性能测试(kafka性能测试简书)

来源网友投稿 3287 2023-02-20

本站部分文章、图片属于网络上可搜索到的公开信息,均用于学习和交流用途,不能代表睿象云的观点、立场或意见。我们接受网民的监督,如发现任何违法内容或侵犯了您的权益,请第一时间联系小编邮箱jiasou666@gmail.com 处理。
本篇文章给大家谈谈kafka性能测试,以及kafka性能测试简书对应的知识点,希望对各位有所帮助,不要忘了收藏本站喔。 今天给各位分享kafka性能测试的知识,其中也会对kafka性能测试简书进行解释,如果能碰巧解决你现在面临的问题,别忘了关注本站,现在开始吧!

本文目录一览:

Kafka 性能测试

原文地址: https://alphahinex.github.io/2022/06/19/kafka-perf-test/

description: "使用自带脚本进行性能测试"
date: 2022.06.19 10:34
categories:
- Kafka
tags: [Kafka, Java]
keywords: Kafka, Producer, Consumer, Performance, Test

在 Apache Kafka 安装目录的 bin 路径下,包括启停服务在内的很多脚本。这些脚本能够帮助我们完成对 Kafka 的各类操作,其中就有对生产者和消费者进行性能测试的工具。

脚本分为两个版本:Linux 下执行的 Shell 脚本,以及 Windows 下执行的 bat 脚本。

以 Shell 脚本为例,可以查看脚本内容,除了停止 ZooKeeper 和 Kafka 服务的脚本外,其余脚本均会在最后调用 kafka-run-class.sh 并根据使用脚本的不同,传入不同的类进行处理。

本文主要涉及下面五个脚本:

可以先随便执行一个脚本查看一下是否能够正常执行脚本,如:

可参照如下命令,创建一个名为 hinex-topic 的主题,分区数为 6 ,副本数为 2 :

命令执行成功后,可以在消息代理的日志路径( <log.dirstopic-<partition_idx )中,看到分区的存储目录。本例中第一个分区在第三个消息代理节点上的存储路径为 /kafka/kafka-logs-kafka-sh-2/hinex-topic-0 。关于 Kafka 的记录存储结构,可阅读 【译】深入了解 Apache Kafka 存储内部 了解更多。

可通过脚本,在控制台中生产及消费消息,验证消息队列基本功能。

在一个终端窗口中启动生产者:

在另一个终端窗口中启动消费者:

此时在生产者中输入消息内容并回车,消费者终端窗口中可以接收到消息。

功能正常,接下来可以开始进行性能测试了。

由于测试用的主题中并没有什么消息记录,所以先进行生产者性能测试产生消息,再进行消费者性能测试。

可参照如下方式,使用 kafka-producer-perf-test.sh 脚本,约每秒钟产生 10 条消息,每条消息 1024 字节,共产生 200 条消息:

从执行结果中,可以看到消息发送的进度、每秒发送的消息数及数据量、平均延迟及最大延迟等统计信息。

如果想测试一下消息队列的吞吐量,可以将 --throughput 参数设为 -1 :

消费者性能测试可使用 kafka-consumer-perf-test.sh 脚本,如:

可通过 kafka-consumer-perf-test.sh --help 获得参数详细说明。

测试结束后,可将测试主题删除:

对照 Benchmarking Apache Kafka: 2 Million Writes Per Second (On Three Cheap Machines) 中场景,使用自带脚本进行一组实测。

每组测试使用 5 千万条记录,每条记录大小为 100 字节。

各场景结果汇总如下:

各场景运行过程记录如下。

三个终端同时执行如下命令(两个生产 1700 万数据,一个生产 1600 万数据):

各场景使用 6 分区 3 副本的主题,结果汇总如下:

各场景运行过程记录如下。

三个终端同时执行如下命令(两个消费 1700 万数据,一个消费 1600 万数据):

使用一个新的 6 分区 3 副本的主题,生产脚本和消费脚本同时执行。

引文:795,064 records/sec (75.8 MB/sec)
实测:738,836 records/sec (70.46 MB/sec)

生产者终端:

消费者终端:

Kafka性能测试方法及Benchmark报告

[TOC]

吞吐量是多少?
kafka高吞吐量:即使是非常普通的硬件Kafka也可以支持每秒数百万的消息。

Kafka性能测试脚本

Kafka使用Yammer Metrics来报告服务端和客户端的Metric信息。Yammer Metrics 3.1.0提供6种形式的Metrics收集——Meters,Gauges,Counters,Histograms,Timers,Health Checks。与此同时,Yammer Metrics将Metric的收集与报告(或者说发布)分离,可以根据需要自由组合。目前它支持的Reporter有Console Reporter,JMX Reporter,HTTP Reporter,CSV Reporter,SLF4J Reporter,Ganglia Reporter,Graphite Reporter。因此,Kafka也支持通过以上几种Reporter输出其Metrics信息。

使用JConsole通过JMX,是在不安装其它工具(既然已经安装了Kafka,就肯定安装了Java,而JConsole是Java自带的工具)的情况下查看Kafka服务器Metrics的最简单最方便的方法之一。
首先必须通过为环境变量JMX_PORT设置有效值来启用Kafka的JMX Reporter。如export JMX_PORT=19797。然后即可使用JConsole通过上面设置的端口来访问某一台Kafka服务器来查看其Metrics信息,如下图所示。

使用JConsole的一个好处是不用安装额外的工具,缺点很明显,数据展示不够直观,数据组织形式不友好,更重要的是不能同时监控整个集群的Metrics。在上图中,在kafka.cluster-Partition-UnderReplicated-topic4下,只有2和5两个节点,这并非因为topic4只有这两个Partition的数据是处于复制状态的。事实上,topic4在该Broker上只有这2个Partition,其它Partition在其它Broker上,所以通过该服务器的JMX Reporter只看到了这两个Partition。

Kafka的一个核心特性是高吞吐率,因此本文的测试重点是Kafka的吞吐率。

本文的测试共使用6台安装Red Hat 6.6的虚拟机,3台作为Broker,另外3台作为Producer或者Consumer。每台虚拟机配置如下

CPU:8 vCPU, Intel(R) Xeon(R) CPU E5-2680 v2 @ 2.80GHz,2 Sockets,4 Cores per socket,1 Thread per core
内存:16 GB
磁盘:500 GB

本文主要测试如下四种场景,测试的指标主要是每秒多少兆字节数据,每秒多少条消息。

Producer Number VS. Throughput

实验条件:3个Broker,1个Topic,6个Partition,无Replication,异步模式,消息Payload为100字节
测试项目:分别测试1,2,3个Producer时的吞吐量,多个Producer可同时向同一个Topic发送数据,在Broker负载饱和前,理论上Producer数量越多,集群每秒收到的消息量越大,并且呈线性增涨。本实验主要验证该特性。同时作为性能测试,本实验还将监控测试过程中单个Broker的CPU和内存使用情况

测试结果:使用不同个数Producer时的总吞吐率如下图所示

由上图可看出,单个Producer每秒可成功发送约128万条Payload为100字节的消息,并且随着Producer个数的提升,每秒总共发送的消息量线性提升,符合之前的分析。

性能测试过程中,Broker的CPU和内存使用情况如下图所示。

由上图可知,在每秒接收约117万条消息(3个Producer总共每秒发送350万条消息,平均每个Broker每秒接收约117万条)的情况下,一个Broker的CPU使用量约为248%,内存使用量为601 MB。

实验条件:3个Broker,1个Topic,6个Partition,无Replication,异步模式,3个Producer
测试项目:分别测试消息长度为10,20,40,60,80,100,150,200,400,800,1000,2000,5000,10000字节时的集群总吞吐量
测试结果:不同消息长度时的集群总吞吐率如下图所示

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

实验条件:3个Broker,1个Topic,无Replication,异步模式,3个Producer,消息Payload为100字节
测试项目:分别测试1到9个Partition时的吞吐量
测试结果:不同Partition数量时的集群总吞吐率如下图所示

由上图可知,当Partition数量小于Broker个数(3个)时,Partition数量越大,吞吐率越高,且呈线性提升。本文所有实验中,只启动3个Broker,而一个Partition只能存在于1个Broker上(不考虑Replication。即使有Replication,也只有其Leader接受读写请求),故当某个Topic只包含1个Partition时,实际只有1个Broker在为该Topic工作。如之前文章所讲,Kafka会将所有Partition均匀分布到所有Broker上,所以当只有2个Partition时,会有2个Broker为该Topic服务。3个Partition时同理会有3个Broker为该Topic服务。换言之,Partition数量小于等于3个时,越多的Partition代表越多的Broker为该Topic服务。如前几篇文章所述,不同Broker上的数据并行插入,这就解释了当Partition数量小于等于3个时,吞吐率随Partition数量的增加线性提升。
当Partition数量多于Broker个数时,总吞吐量并未有所提升,甚至还有所下降。可能的原因是,当Partition数量为4和5时,不同Broker上的Partition数量不同,而Producer会将数据均匀发送到各Partition上,这就造成各Broker的负载不同,不能最大化集群吞吐量。而上图中当Partition数量为Broker数量整数倍时吞吐量明显比其它情况高,也证实了这一点。

kafka 单机/集群压力测试

由于kafka吞吐量特别大,所以先考虑集群服务器的自身瓶颈,因为现在测试的是单机所以只会涉及到磁盘IO以及cpu,但是对于kafka来说对于cpu的使用还是可以忽略不计的,

1.1磁盘IO写入瓶颈
使用以下命令测试磁盘IO的写入瓶颈
sync;time -p bash -c "(dd if=/dev/zero of=test.dd bs=1M count=20000)"
说明: 在当前目录下创建一个test.dd的文件,写入20000个1M的数据
磁盘写入IO的结果
可以看到平均就是187MB/s

1.2 使用iostat命令监测磁盘io情况
使用命令
# iostat -x 1
说明: 扩展查看io性能,每秒刷新一次
注意: 如果没有iostat,请执行 yum install sysstat -y 进行安装 iostat命令

关注wkB/s和%util两个参数

wkB/s:每秒写入设备的数据量(单位:KB)

%util:消耗在I/O请求中的CPU时间百分比(设备带宽利用率)。如果该值接近100%说明设备出现了瓶颈。
如图现在这台机器的磁盘IO极限值为187MB/s

1.3 单机版测试kafka性能
因为测试的次数比较多,也没有去找kafka中数据存储设置,所以就使用docker部署单机版的kafka (因为测试的数据比较多,也就多次的删除了容器,重新启动镜像)
新建目录:
mkdir /usr/local/kafka_test
dockerfile

run.sh

sources.list

目录结构如下:

生成镜像
docker build -t kafka_test /usr/local/kafka_test
启动kafka
docker run -d -it kafka_test

测试结果

从表格中可以看出来五个分区就已经是极限了

结果分析
这中间并没有设置条数/每秒,所以就是按照kafka 就会按照量级自动的吞入数据,如果我们需要对于消息的即时性做控制,还需要再重新测试一下,按照业务的延迟找到最合适的数量(单机版,然后再部署集群,测试适合的数量)

集群测试:
部署就不再这里说明了
本次测试的是三台机器集群

测试结果:

之后还测试了9个分区的topic 因为空间不足所以就没有继续测下去,但是看部分数据还超过了500MB/s还是有上升空间的

1.3 磁盘IO 读取瓶颈
使用一下命令测试磁盘IO的读取瓶颈
hdparm -tT --direct /dev/vda
说明: hdparm命令是显示与设定硬盘的参数, -t参数为评估硬盘的读取效率(不经过磁盘cache), -T参数为评估硬盘的读取效率(经过磁盘cache).

arm平台kafka性能测试

当partition个数为broker数的5倍左右时性能较好。

参考之前分区数测试相关命令。

当副本数为1时性能最佳,增加副本后性能下降明显。

Kafka 使用 MirrorMaker 跨机房数据同步实践

南京 kafka 集群有 200+ kafka topic 数据需要镜像同步到重庆集群kafka性能测试,源 kafka 现状如下:

使用 kafka mirrormaker 可以满足此需求kafka性能测试,mirrormaker 是 kafka 官方提供的工具: $KAFAK_HOME/bin/kafka-mirror-maker.sh,在目标 kafka 集群创建好同名 topic,根据使用说明,配置 consumer procuder 配置,topic 信息等,就可以启动 mirror 了。

mirror-maker 的原理大概是启动 consumer 消费南京的 topic message,发送到重庆的 kafka 集群。数据流向:南京 kafka - mirrormaker - 重庆 kafka ,其中 mirrormaker 部署在重庆集群。

需要 mirror 的 topic 可以使用 java-style 正则表达式,两个 topic A ,B 可以写成 --whitelist 'A|B' ,如果要 mirror 所有的 topic 可以使用 --whitelist '*'

对方反馈,集群内,单线程消费大 topic 速度是够的,能达到 6w+ message/sec,试图举证单分区没问题。其中的差异在于 kafka mirrormaker 是走了公网传输,先消费再 push 到目标 kafka 集群。为了验证是否是单 partition 的问题,做了如下测试:

测试结果如下,也验证了 kafka mirrormaker 跨集群环境下,多 parititon 的必要性

单分区优化前:

单分区优化后峰值:

(kafka topic parititon 为 1) = (数据只在一个 broker 上读写) = (消费端只能单线程消费),增加 parititon,数据可以水平扩展,topic 数据落在均衡的落在不同的 broker 上,生产和消费都是多对多,并行的关系,性能肯定优于单 partition。多对多的读写性能肯定优于单点的点对点读写。

这里有一份 kafka 性能测试报告 ,很明显的看出,多 partition 在性能上的优势,不管是 produer 写,还是消费者消费,性能都是成倍增长。

当然由此也可以看出 kafka 的性能还是很强悍的,万兆网卡的集群内,即使是单 partition 平均写入速度可达 10w records/sec。单线程 consumer 消费速度可达 34w records/sec。也解释了对方说的单 partition 性能能满足的问题。

通过 parititon 数,mirromaker 速度基本能跟上源集群,但是 lag 依然存在,处于一个不太可接受的值,超过 2w,部分数据量不大的 topic lag 值也超过 1000。

原因在于 kafka mirrormaker 的参数 --offset.commit.interval.ms,消费 offset 提交间隔,默认使用率 60s,60s 对于生产速度快的 topic 来说很长。

研究了一下这个参数,kafka consumer 配置里面有 old 和 new 之分,其中有个参数 auto.commit.interval.ms 的默认值有变更,旧的 60s 变为 5s,这样能侧面说明新的consumer 是觉得老的这个 60s 的默认配置不够合理,调整到 5s,一个比较合理的值。

3.3.1 Old Consumer Configs
3.3.2 New Consumer Configs

如下图,kafka mirrormaker 默认是使用 new consumer 见下图,但是 commit.interval.ms 配置还是沿用了 old consumer 的默认配置 60s。

关于kafka性能测试和kafka性能测试简书的介绍到此就结束了,不知道你从中找到你需要的信息了吗 ?如果你还想了解更多这方面的信息,记得收藏关注本站。 kafka性能测试的介绍就聊到这里吧,感谢你花时间阅读本站内容,更多关于kafka性能测试简书、kafka性能测试的信息别忘了在本站进行查找喔。
上一篇:日志运维查询周期事件(事件查看器日志)
下一篇:包含it运维工程师工作内容的词条
相关文章

 发表评论

暂时没有评论,来抢沙发吧~