Kafka机器数量计算、性能评估、压力测试

一、Kafka机器数量计算

Kafka机器数量(经验公式)= 2 *(峰值生产速度 * 副本数 / 100)+ 1

先拿到峰值生产速度,再根据设定的副本数,就能预估出需要部署Kafka的数量。

1)峰值生产速度

峰值生产速度可以压测得到。

2)副本数

副本数默认是1个,在企业里面2-3个都有,2个居多。

副本多可以提高可靠性,但是会降低网络传输效率。

比如我们的峰值生产速度是50M/s。副本数为2。

Kafka机器数量 = 2 *(50 * 2 / 100)+ 1 = 3台

二、Kafka分区数计算

(1)创建一个只有1个分区的topic

(2)测试这个topicproducer吞吐量和consumer吞吐量。

(3)假设他们的值分别是TpTc,单位可以是MB/s

(4)然后假设总的目标吞吐量是Tt,那么分区数 = Tt / minTpTc

例如:producer吞吐量 = 20m/sconsumer吞吐量 = 50m/s,期望吞吐量100m/s

分区数 = 100 / 20 = 5分区

如何根据数据量确定Kafka分区个数、Kafka的分区是不是越多越好、Kafak生产者分发策略,消费者负载均衡 09_啊策策的博客-CSDN博客icon-default.png?t=M3K6https://blog.csdn.net/weixin_42641909/article/details/89294698

分区数一般设置为:3-10

一、性能评估

1.14.1 单broker性能评估

我们做单broker性能评估的目的包括以下几方面:

1)为我们进行资源申请评估提供依据;

2)让我们更了解集群的读写能力及瓶颈在哪里,针对瓶颈进行优化;

3)为我们限流阈值设置提供依据;

4)为我们评估什么时候应该扩容提供依据;

1.14.2 topic分区性能评估

1)为我们创建topic时,评估应该指定多少分区合理提供依据;

2)为我们topic的分区扩容评估提供依据;

1.14.3 单磁盘性能评估

1)为我们了解磁盘的真正读写能力,为我们选择更合适Kafka的磁盘类型提供依据;

2)为我们做磁盘流量告警阈值设置提供依据;

1.14.4 集群规模限制摸底

1)我们需要了解单个集群规模的上限或者是元数据规模的上限,探索相关信息对集群性能和稳定性的影响;

2)根据摸底情况,评估集群节点规模的合理范围,及时预测风险,进行超大集群的拆分等工作;

二、压力测试

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消息数

每秒写入消息数

记录大小(单位:字节Byte)

Kafka消息写入测试

10W

2000条

1000

100W

5000条

1000

1000W

5000条

1000

2.2.2Kafka消费消息压力测试

测试场景

消费MQ消息数

Kafka消息消费测试

10W

100W

1000W


2.3测试方法简要描述

        Kafka 官方自带压力测试脚本(kafka-consumer-perf-test.sh、kafka-producer-perf-test.sh)。Kafka 压测时,可以查看到哪个地方出现了瓶颈(CPU,内存,网络 IO)。一般都是网络 IO达到瓶颈

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=10.150.30.60:9092 
100/kafka-producer-perf-test.sh --topic test_perf --num-records 1000000 --record-size 2000  --throughput 5000 --producer-props bootstrap.servers=10.150.30.60:9092 
1000./kafka-producer-perf-test.sh --topic test_perf --num-records 10000000 --record-size 2000  --throughput 5000 --producer-props bootstrap.servers=10.150.30.60:9092
消费MQ消息10./kafka-consumer-perf-test.sh --zookeeper localhost:2181 --topic test_perf --fetch-size 1048576 --messages 1000000 --threads 1
100./kafka-consumer-perf-test.sh --zookeeper localhost:2181 --topic test_perf --fetch-size 1048576 --messages 10000000 --threads 1

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) 

3.测试环境

3.1测试环境机器配置表
  

4.测试结果
4.1测试结果说明
本次测试针对Kafka消息处理的能力 进行压力测试,对Kafka集群服务器中的一台进行MQ消息服务的压力测试,关注Kafka消息写入的延迟时间是否满足需求。对Kafka集群服务器中的一台进行MQ消息处理的压力测试,验证Kafka的消息处理能力。

4.2测试结果

4.2.1写入MQ消息

压测结果截图

写入100w消息压测结果 

699884 records sent, 139976.8 records/sec (13.35 MB/sec), 1345.6 ms avg latency, 2210.0 ms max latency.

713247 records sent, 141545.3 records/sec (13.50 MB/sec), 1577.4 ms avg latency, 3596.0 ms max latency.

773619 records sent, 153862.2 records/sec (14.67 MB/sec), 2326.8 ms avg latency, 4051.0 ms max latency.

773961 records sent, 154206.2 records/sec (15.71 MB/sec), 1964.1 ms avg latency, 2917.0 ms max latency.

776970 records sent, 154559.4 records/sec (15.74 MB/sec), 1960.2 ms avg latency, 2922.0 ms max latency.

MQ消息写入测试结果解析:
本例中写入100w条MQ消息为例,每秒平均向kafka写入了4.77MB的数据,大概是4999.875条消息/秒,每次写入的平均延迟为1毫秒,最大的延迟为647毫秒,1ms内占99%。

4.2.2消费MQ消息

压测结果截图

消费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消息为例总共消费了953.66M的数据,每秒消费数据大小为177.19M,总共消费了10000004条消息,每秒消费185804.53条消息。

吞吐量受网络带宽和fetch-size的影响 

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

2021-08-03 21:22:57:671, 2021-08-03 21:23:41:938, 514.7169, 11.6276, 5397198, 121923.7355

5.结果分析

根据4.2.测试结果,可以看出在单台服务器上,写入MQ消息设置5000条/秒时,消息写入及时,95%的消息延迟时间小于等于1ms,在可接受范围内;Kafka消费MQ消息时,1000W待处理消息的处理能力在每秒20w条以上,处理结果理想。
   根据Kafka处理10w、100w和1000w级的消息时的处理能力,可以评估出Kafka集群服务,是否有能力处理上亿级别的消息。
本次测试是在正式环境集群服务中的单台服务器上进行,基本不需要考虑网络带宽的影响。所以单台服务器的测试结果,对评估集群服务是否满足上线后实际应用的需求,很有参考价值。
 
原文链接:https://blog.csdn.net/laofashi2015/article/details/81111466

Kafka性能测试内容 

        kafka的测试主要分为producer端的吞吐量,consumer端的吞吐量,以及判断影响两者的因素。在实际测试环境中,需根据具体情况调整测试的数据量与参数。

性能测试工具:

  • kafka-producer-perf-test.sh (生产端)
  • kafka-consumer-perf-test.sh (消费端)

性能测试环境:

三台同样的虚拟机作为kafka broker,IP地址为192.168.1.81-192.168.1.83,配置如下:

CPU 内存 磁盘

4core 16G 100G

一、Producer端性能测试

a. Partition分区与速率的关系

方法:建立两个topic, 两个topic除了partition数量不一致外其他参数完全一致,使用kafka-producer-perf-test.sh进行测试。

过程:

首先建立两个topic,分别为test_part1与test_part2:

kafka-topics.sh --zookeeper 192.168.1.81:2181 --create --topic test_part1 --partitions 1 --replication-factor 1

kafka-topics.sh --zookeeper 192.168.1.81:2181 --create --topic test_part2 --partitions 5 --replication-factor 1

test_part1进行测试跑批:

kafka-producer-perf-test.sh --topic test_part1 --num-records 2000000 --record-size 200 --throughput 300000 --producer-props bootstrap.servers=192.168.1.82:9092

运行结果:

2000000 records sent, 136211.945788 records/sec (25.98 MB/sec), 1002.59 ms avg latency, 2559.00 ms max latency, 801 ms 50th, 2271 ms 95th, 2538 ms 99th, 2553 ms 99.9th.

test_part2进行测试跑批:

kafka-producer-perf-test.sh --topic test_part2 --num-records 2000000 --record-size 200 --throughput 300000 --producer-props bootstrap.servers=192.168.1.82:9092

运行结果:

2000000 records sent, 187529.301453 records/sec (35.77 MB/sec), 520.00 ms avg latency, 2196.00 ms max latency, 336 ms 50th, 1922 ms 95th, 2159 ms 99th, 2190 ms 99.9th.

结论:Producer端传输效率和partition数成正比。

b. Replication副本数与速率的关系

方法:首先建立两个topic, 两个topic除了replication数量不一致外其他参数完全一致,使用kafka-producer-perf-test.sh进行测试。

过程:

首先建立两个topic,分别为test_rep1与test_rep2:

kafka-topics.sh --zookeeper 192.168.1.81:2181 --create --topic test_rep1 --partitions 1 --replication-factor 1

kafka-topics.sh --zookeeper 192.168.1.81:2181 --create --topic test_rep2 --partitions 1 --replication-factor 3

test_rep1进行跑批测试:

kafka-producer-perf-test.sh --topic test_rep1 --num-records 2000000 --record-size

运行结果:

2000000 records sent, 217438.573603 records/sec (41.47 MB/sec), 610.43 ms avg latency, 1387.00 ms max latency, 497 ms 50th, 1284 ms 95th, 1341 ms 99th, 1386 ms 99.9th.

test_rep2进行跑批测试:

kafka-producer-perf-test.sh --topic test_rep2 --num-records 2000000 --record-size 200 --throughput 300000 --producer-props bootstrap.servers=192.168.1.82:9092

运行结果:

2000000 records sent, 103423.311614 records/sec (19.73 MB/sec), 1353.03 ms avg latency, 4050.00 ms max latency, 1213 ms 50th, 3042 ms 95th, 3998 ms 99th, 4047 ms 99.9th

结论:Producer端传输效率和replication数量成反比。

C. 传输的数据记录大小与速率的关系

方法:向一个topic写入大小不同的数据记录,检验是否对速率有影响。

过程:

首先建立一个test topic:

kafka-topics.sh --zookeeper 192.168.1.81:2181 --create --topic test --partitions 3 --replication-factor 3

使用小数据块跑批:

kafka-producer-perf-test.sh --topic test --num-records 1000000 --record-size 200 --throughput 300000 --producer-props bootstrap.servers=192.168.1.82:9092

运行结果:

1000000 records sent, 149231.457991 records/sec (28.46 MB/sec), 814.24 ms avg latency, 1334.00 ms max latency, 810 ms 50th, 1290 ms 95th, 1327 ms 99th, 1333 ms 99.9th.

使用大数据块跑批:

kafka-producer-perf-test.sh --topic test --num-records 1000000 --record-size 2048 --throughput 300000 --producer-props bootstrap.servers=192.168.1.82:9092

运行结果:

1000000 records sent, 22161.155926 records/sec (43.28 MB/sec), 637.75 ms avg latency, 1598.00 ms max latency, 576 ms 50th, 959 ms 95th, 1547 ms 99th, 1580 ms 99.9th.

结论:Producer端传输数量和单条记录大小成正比。

二、Customer端性能测试

        由于kafka-consumer-perf-test.sh返回结果并不像producer端那么简洁易懂,这里解释一下,这个命令会返回类似以下的结果:

2019-11-18 13:47:53:297, 2019-11-18 13:47:55:078, 190.7349, 107.0943, 1000000, 561482.3133

总共六个参数:

第一个是开始时间;

第二个是结束时间;

第三个是本次消费了多少MB数据;

第四个是本次消费的速率MB/S;

第五个是总的消费数据条数;

第六个是每秒消费数据条数。

a. Partition与速率的关系

方法:首先建立两个topic, 两个topic除了partition数量不一致外其他参数完全一致,使用kafka-consumer-perf-test.sh进行测试。

过程:

建立topic,这里沿用Customer端测试过程中建立的test_part1和test_part2.

test_part1进行跑批测试:

kafka-consumer-perf-test.sh --topic test_part1 --messages 1000000 --threads 1 --num-fetch-threads 1 --zookeeper 192.168.1.81:2181

运行结果:

2018-12-18 13:47:53:297, 2018-12-18 13:47:55:078, 190.7349, 107.0943, 1000000, 561482.3133

test_part2进行跑批测试:

kafka-consumer-perf-test.sh --topic test_part2 --messages 1000000 --threads 1 --num-fetch-threads 1 --zookeeper 192.168.1.81:2181

运行结果:

2018-12-18 13:51:43:887, 2018-12-18 13:51:45:619, 190.7349, 110.1241, 1000000, 577367.2055

结论:Customer端消费效率和partitions数成正比(但影响不大)。

b. Threads线程与速率的关系

方法:在一个topic中消费相同的数据,使用不同的threads,比较速率大小。

过程:建立Topic,这里沿用Customer端测试过程中建立过的test。

使用一个线程消费时:

kafka-consumer-perf-test.sh --topic test --messages 500000 --threads 1 --num-fetch-threads 1 --zookeeper 192.168.1.81:2181

运行结果:

2018-12-18 14:11:32:106, 2018-12-18 14:11:32:951, 95.3671, 112.8604, 500000, 591715.9763

使用三个线程消费时:

kafka-consumer-perf-test.sh --topic test --messages 500000 --threads 3 --num-fetch-threads 1 --zookeeper 192.168.1.81:2181

运行结果:

2018-12-18 14:12:54:716, 2018-12-18 14:12:54:718, 95.3671, 47683.5270, 500000, 250000000.0000

使用六个线程消费时:

kafka-consumer-perf-test.sh --topic test --messages 500000 --threads 6 --num-fetch-threads 1 --zookeeper 192.168.1.81:2181

运行结果:

2018-12-18 14:14:12:935, 2018-12-18 14:14:12:938, 95.3671, 31789.0180, 500000, 166666666.6667

结论:Cumsomer端消费速率和thread成正比,但是达到一定数量(parttion数量)以后趋于平稳,再增加也不会继续变大。

Kafka性能测试结论

由于每个kafka集群环境差异都很大,本文不代表所有情况。

但是一个通常的kafka生产集群以下特性是应该达到的:

1.单个consumer的消费速率必须远大于单个producer的生产速率。

2.单个broker数据生产效率不应小于50M/s,否则增加JVM内存,并增加缓冲区大小。

  • 2
    点赞
  • 23
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
关于Kafka性能测试,您可以考虑以下几个方面: 1. 压力测试:通过模拟大量并发请求,测试Kafka在高负载情况下的性能表现。您可以使用工具如Apache JMeter、Kafka Load Testing Tool等来进行压力测试。 2. 吞吐量测试:测试Kafka在单位时间内能够处理的消息数量。可以通过发送大量消息并记录处理时间来计算吞吐量。同时,可以调整Kafka的配置参数,如分区数量、复制因子等,来观察吞吐量的变化。 3. 延迟测试:测试消息从生产者发送到消费者接收的延迟时间。您可以在消息发送和接收的代码中插入时间戳,并计算两者之间的差值来得到延迟时间。可以通过调整Kafka的配置参数、增加消费者数量等方式来观察延迟的变化。 4. 可用性测试:测试Kafka在出现故障时的可用性。可以模拟节点宕机、网络断开等情况,观察Kafka集群的自动故障转移和恢复能力。 在进行性能测试时,建议注意以下几点: - 确保测试环境与生产环境尽可能相似,包括硬件配置、网络环境等。 - 关注测试结果中的指标,如吞吐量、延迟、丢失率等。 - 注意监控Kafka集群的各项指标,如CPU、内存、网络等的使用情况。 - 尝试不同的场景和配置参数,以获得更全面的性能测试结果。 请注意,以上只是一些常见的性能测试方法,具体测试方案需要根据您的需求和环境来进行调整。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

四月天03

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值