kafka压测工具调研及测试
一 介绍Apache Kafka 官方提供了两个客户端性能测试脚本,它们的存放位置如下:$KAFKA_HOME/bin/kafka-producer-perf-test.sh 支持测试的性能指标包括:吞吐量(throughput)、最大时延(max-latency)、平均时延(avg-latency);kafka-consumer-perf-test.sh 同样支持吞吐量指标,还提供了一些消费端特
一 介绍
Apache Kafka 官方提供了两个客户端性能测试脚本,它们的存放位置如下:$KAFKA_HOME/bin/
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 限制每秒发送的最大的消息数(tps),设为 -1 表示不限制,一般来说当不限制时获取到的吞吐量即为broker所能承载的最大吞吐量
–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 kafka-hm-06 --num-records 1000000 --record-size 500 --throughput 20000 --producer-props bootstrap.servers=broker-4234-0.strimzi.kafka.mid:443,broker-4234-1.strimzi.kafka.mid:443 acks=1 compression.type=lz4 --print-metrics --producer.config /usr/local/kafka_2.12-2.2.0/property.conf
描述:即发送 1000000 条大小为 500字节 的消息到地址为 broker-4234-0.strimzi.kafka.mid:443的 broker 上的 kafka-hm-06 topic,发送时每秒最大吞吐量是20000,并使用 lz4 算法压缩消息。
结果返回:
1000000 records sent, 19998.800072 records/sec (9.54 MB/sec), 7.12 ms avg latency, 707.00 ms max latency, 2 ms 50th, 25 ms 95th, 168 ms 99th, 196 ms 99.9th.
备注说明:
成功发送了 1000000 条消息,
吞吐量为 19998.800072 条/秒 (或 3.34 MB/秒),
平均时延为 7.12 ms,
最大时延为 707.00 ms,
50 % 的消息延时在 2 ms 内,
95 % 的消息延时在 25 ms 内,
99 % 的消息延时在 196 毫秒内。
(注意平均吞吐量是3.34MB/s,即占用25-26Mb/s左右的带宽)
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 --topic kafka-hm-06 --messages 1000000 --broker-list broker-4234-0.strimzi.kafka.mid:443,broker-4234-1.strimzi.kafka.mid:443 --consumer.config /usr/local/kafka_2.12-2.2.0/property.conf
结果返回:
start.time, end.time, data.consumed.in.MB, MB.sec, data.consumed.in.nMsg, nMsg.sec, rebalance.time.ms, fetch.time.ms, fetch.MB.sec, fetch.nMsg.sec
2022-01-14 15:31:14:326, 2022-01-14 15:31:54:512, 976.8516, 24.3083, 1000296, 24891.6538, 3063, 37123, 26.3139, 26945.4516
备注说明:
start.time 开始时间
end.time 结束时间
data.consumed.in.MB:消费到的数据总大小,单位为 MB===》976.8516MB
MB.sec:消费 TPS,即每秒消费的消息大小 ===========》24.3083MB/S
data.consumed.in.nMsg:消费到的总消息数 ============》1000296 条
nMsg.sec:消费 TPS,即每秒消费的消息条数 ===========》24891.6538 条/s
rebalance.time.ms:消费者组重平衡的耗时,单位为 ms,0 表示没有发生重平衡
fetch.time.ms:fetch 线程的总耗时,单位为 ms ==========》37123 ms
fetch.MB.sec:fetch 线程每秒钟获取到的消息大小 ========》26.3139MB/S
fetch.nMsg.sec:fetch 线程每秒钟获取到的消息数量 =======》26945.4516 条/s
三 producer测试
3.1 batch size
测试脚本
bin/kafka-producer-perf-test.sh --topic kafka-producer-test-01 --num-records 1000000 --record-size 680 --producer-props bootstrap.servers=broker-4221-0.strimzi.kafka.mid:443,broker-4221-1.strimzi.kafka.mid:443,broker-4221-2.strimzi.kafka.mid:443 batch.size=10000 --producer.config /usr/local/kafka_2.12-2.2.0/test.conf --throughput 30000
batch size(10000–》50000–》100000—》150000–》200000)
返回结果
1000000 records sent, 20700.076590 records/sec (13.42 MB/sec), 2160.51 ms avg latency, 3087.00 ms max latency, 2160 ms 50th, 2720 ms 95th, 3035 ms 99th, 3065 ms 99.9th.
1000000 records sent, 29283.434361 records/sec (18.99 MB/sec), 814.12 ms avg latency, 1663.00 ms max latency, 794 ms 50th, 1326 ms 95th, 1539 ms 99th, 1642 ms 99.9th
1000000 records sent, 29954.469207 records/sec (19.43 MB/sec), 695.98 ms avg latency, 1345.00 ms max latency, 766 ms 50th, 1250 ms 95th, 1298 ms 99th, 1315 ms 99.9th
1000000 records sent, 29968.832414 records/sec (19.43 MB/sec), 308.64 ms avg latency, 990.00 ms max latency, 257 ms 50th, 797 ms 95th, 923 ms 99th, 960 ms 99.9th.
1000000 records sent, 29742.430551 records/sec (19.29 MB/sec), 825.77 ms avg latency, 1566.00 ms max latency, 1040 ms 50th, 1409 ms 95th, 1478 ms 99th, 1520 ms 99.9th.
测试中通过我们增加batch-size的大小,我们可以发现在消息未压缩的前提下,100000-150000条一批次之后吞吐稳定在约30000条/s,而数据量在19.43M/s。
3.2 ack
测试脚本
bin/kafka-producer-perf-test.sh --topic kafka-producer-test-01 --num-records 1000000 --record-size 1024 --producer-props bootstrap.servers=broker-4221-0.strimzi.kafka.mid:443,broker-4221-1.strimzi.kafka.mid:443,broker-4221-2.strimzi.kafka.mid:443 batch.size=30000 acks=0 --producer.config /usr/local/kafka_2.12-2.2.0/test.conf --throughput 30000
ack(-1—》0----》1)
返回结果
1000000 records sent, 18401.972691 records/sec (17.97 MB/sec), 1637.86 ms avg latency, 3060.00 ms max latency, 1755 ms 50th, 2534 ms 95th, 2853 ms 99th, 3029 ms 99.9th.
1000000 records sent, 19405.041430 records/sec (18.95 MB/sec), 1559.15 ms avg latency, 2309.00 ms max latency, 1557 ms 50th, 2105 ms 95th, 2197 ms 99th, 2292 ms 99.9th
1000000 records sent, 17657.237702 records/sec (17.24 MB/sec), 1719.26 ms avg latency, 3458.00 ms max latency, 1603 ms 50th, 3000 ms 95th, 3370 ms 99th, 3449 ms 99.9th.
测试中通过我们对ack值的变更测试,我们可以发现当ack为1时吞吐量最低,对于record-size 1024的数据,吞吐量可达到17657.237702 。
3.3 消息大小
测试脚本
bin/kafka-producer-perf-test.sh --topic kafka-producer-test-01 --num-records 1000000 --record-size 200 --producer-props bootstrap.servers=broker-4221-0.strimzi.kafka.mid:443,broker-4221-1.strimzi.kafka.mid:443,broker-4221-2.strimzi.kafka.mid:443 batch.size=20000 acks=-1 --producer.config /usr/local/kafka_2.12-2.2.0/test.conf --throughput 30000
record-size(200–》500–》1024–》2048)
返回结果
1000000 records sent, 29974.222169 records/sec (5.72 MB/sec), 15.39 ms avg latency, 575.00 ms max latency, 4 ms 50th, 84 ms 95th, 229 ms 99th, 301 ms 99.9th.
1000000 records sent, 28379.260436 records/sec (13.53 MB/sec), 1386.12 ms avg latency, 2818.00 ms max latency, 1533 ms 50th, 2484 ms 95th, 2677 ms 99th, 2805 ms 99.9th.
1000000 records sent, 14919.583445 records/sec (14.57 MB/sec), 2064.88 ms avg latency, 3763.00 ms max latency, 2235 ms 50th, 3632 ms 95th, 3702 ms 99th, 3748 ms 99.9th
1000000 records sent, 8527.111952 records/sec (16.65 MB/sec), 1805.85 ms avg latency, 2670.00 ms max latency, 1784 ms 50th, 2352 ms 95th, 2561 ms 99th, 2639 ms 99.9th
测试中通过我们对消息大小的变更测试,我们可以发现当消息大小逐渐增加时,吞吐量在逐渐减少,带宽占用在逐渐增加
四 consumer测试
测试脚本
bin/kafka-consumer-perf-test.sh --topic kafka-producer-test-01 --fetch-size 1048576 --messages 1000000 --threads 1 --hide-header --num-fetch-threads 1 --broker-list broker-4221-0.strimzi.kafka.mid:443,broker-4221-1.strimzi.kafka.mid:443 --consumer.config /usr/local/kafka_2.12-2.2.0/test.conf
threads(1–》3–》7–》10)
2022-01-18 14:11:59:246, 2022-01-18 14:12:10:162, 190.7349, 17.4730, 1000000, 91608.6479, 3105, 7811, 24.4188, 128024.5807
2022-01-18 11:00:38:987, 2022-01-18 11:01:48:830, 1953.9434, 27.9762, 1000000 100292.8263, 3086, 66757, 29.2695, 14985.9790
2022-01-18 10:50:17:988, 2022-01-18 10:51:28:318, 1953.6250, 27.7780, 1000000, 84222.3233, 3091, 67239, 29.0549, 14876.1284
2022-01-18 10:47:13:670, 2022-01-18 10:48:24:801, 1953.9082, 27.4692, 1000000, 84064.2055, 3149, 67982, 28.7416, 14715.6747
在threads为4时,消费速度最好,达到10.0292w/s,而后续慢慢平稳
五 性能瓶颈测试
5.1 测试目的
本次性能测试在正式环境下单台服务器上Kafka处理MQ消息能力进行压力测试。测试包括对Kafka写入MQ消息和消费MQ消息进行压力测试,根据10w、100w和1000w级别的消息处理结果,评估Kafka的处理性能是否满足项目需求。(该项目期望Kafka能够处理10w+级别的MQ消息)
5.2 测试范围概述
测试使用Kafka自带的测试脚本,通过命令对Kafka发起写入MQ消息和Kafka消费MQ消息的请求。模拟不同数量级的MQ消息写入和MQ消息消费场景,根据Kafka的处理结果,评估Kafka是否满足处理10w+的消息的能力。
5.2.1压测命令信息
写入MQ消息
10w
bin/kafka-producer-perf-test.sh --topic kafka-producer-test-01 --num-records 100000 --record-size 1000 --throughput 2000 --producer-props bootstrap.servers=broker-4251-0.strimzi.kafka.mid:443,broker-4251-1.strimzi.kafka.mid:443,broker-4251-2.strimzi.kafka.mid:443 --producer.config /usr/local/kafka_2.12-2.2.0/test.conf
100w
bin/kafka-producer-perf-test.sh --topic kafka-producer-test-01 --num-records 1000000 --record-size 1024 --throughput 5000 --producer-props bootstrap.servers=broker-4251-0.strimzi.kafka.mid:443,broker-4251-1.strimzi.kafka.mid:443,broker-4251-2.strimzi.kafka.mid:443 --producer.config /usr/local/kafka_2.12-2.2.0/test.conf
1000w
bin/kafka-producer-perf-test.sh --topic kafka-producer-test-01 --num-records 10000000 --record-size 1024 --throughput 5000 --producer-props bootstrap.servers=broker-4251-0.strimzi.kafka.mid:443,broker-4251-1.strimzi.kafka.mid:443,broker-4251-2.strimzi.kafka.mid:443 --producer.config /usr/local/kafka_2.12-2.2.0/test.conf
消费MQ消息
10w
./kafka-consumer-perf-test.sh --zookeeper localhost:2181 --topic test_perf --fetch-size 1048576 --messages 1000000 --threads 1
100w
./kafka-consumer-perf-test.sh --zookeeper localhost:2181 --topic test_perf --fetch-size 1048576 --messages 10000000 --threads 1
1000w
./kafka-consumer-perf-test.sh --zookeeper localhost:2181 --topic test_perf --fetch-size 1048576 --messages 10000000 --threads 1
5.2.2测试机器配置
集群配置:3节点, CPU12核,内存24G
测试机器配置:内存8G cpu4核
5.2.3 写入mq消息结果
设置消息总数(单位:w) 设置单个消息大小(单位:字节) 设置每秒发送消息数 实际写入消息数/秒 95%的消息延迟(单位:ms)
10 1024 2000 1999.120387 12
100 1024 5000 4999.125153 39
1000 1024 5000 4999.935001 21
5.2.4 消费mq消息结果
消费消息总数(单位:w) 线程数 共消费数据(单位:M) 每秒消费数据(单位:M) 每秒消费消息数 消费耗时(单位:s)
10 10 19.4641 3.9140 20108.5864 5
100 10 895.9438, 24.6369 27505.3347 36
1000 10 9684.8530 29.2929 30246.4211 300
5.3 结果分析
根据5.2.测试结果,可以看出写入MQ消息设置5000条/秒时,消息写入及时,95%的消息延迟时间小于等于40ms;
根据5.3的测试结果,Kafka消费MQ消息时,依赖于客户端机器的整体配置,1000W待处理消息当线程数为10时 的处理能力在每秒3w+条以上。
六 同一消费组下的多个实例进行压测
消费500w条数据为例:
消费MQ消息
机器 消费消息总数 单位:w) 线程数 共消费数据(单位:M) 每秒消费数据(单位:M/s) 每秒消费消息数(tps) 消费耗时单位:s)
66 2624964 10 2563.4414 22.1772 22709.4620 106
69 708369 10 691.7666 14.9477 15306.4889 46
156 1666667 10 325.5205 17.7666 42377.5585 40
服务端负荷 5000000 3580.7285 54.8915 80393.5094 106
更多推荐
所有评论(0)