1. 介绍
本文主要介绍对kafka的测试。
测试的主要目的是研究不同消息可靠性语义下对吞吐量的影响。
测试信息如下
使用版本:kafka 0.10.0.0
JVM配置信息:
-Xmx1G
-Xms1G
-XX:+UseG1GC
-XX:MaxGCPauseMillis=20
-XX:InitiatingHeapOccupancyPercent=35
-XX:+DisableExplicitGC
-Djava.awt.headless=true
-Xloggc:/root/Downloads/kafka_2.11-0.10.0.0/bin/../logs/kafkaServer-gc.log
-verbose:gc
-XX:+PrintGCDetails
-XX:+PrintGCDateStamps
-XX:+PrintGCTimeStamps
-Dcom.sun.management.jmxremote
-Dcom.sun.management.jmxremote.authenticate=false
-Dcom.sun.management.jmxremote.ssl=false
-Dcom.sun.management.jmxremote.port=9999
-Dkafka.logs.dir=/root/Downloads/kafka_2.11-0.10.0.0/bin/../logs
-Dlog4j.configuration=file:./../config/log4j.properties
测试集群信息:2台broker,1个topic,5个分区,2个replication
2. 使用工具介绍
我们主要采用$KAKA_HOME/bin下自带的工具kafka-perf-test.sh来进行测试
可以看到该工具主要提供了以下选项:
- 产生的消息记录数
- 每条记录的大小,单位为byte
- 设定吞吐量阈值,测试时不超过该阈值
- 设定producer 的选项
可见,该工具还是比较灵活的。可以自由设定producer的选项。
PS: linger.ms的设定是为了延迟发送,可以做批量处理
使用的命令如下(其中acks的值我们分别考察0,1,all的方式):
sh kafka-producer-perf-test.sh --topic my-topic --num-records 5000000 --record-size 512 --throughput 1000000 --producer-props bootstrap.servers=mysql1:9092,mysql2:9092 acks=all retries=2 linger.ms=1
3. kafka测试
3.1 acks=all的情况
总结:吞吐量平均约为3W的TPS
3.2 acks=1的情况
总结:吞吐量平均在7W,延迟850ms
3.3 acks=0的情况
总结:吞吐量平均在9.6万,延迟606ms
4. 总结
可见,不同的消息可靠性语义对吞吐量的影响很大。
acks=0的吞吐量比acks=1时高出37%;比acks=all的时候高出220%。
此外,这次测试之所以TPS没有达到很恐怖的50W以上,主要还是机器本身配置不够高,而且我们这次采用的JVM堆大小也只有1G。
例如:增加linger.ms的时间、减小每条消息的大小、增大JVM堆大小等手段都能显著提升TPS。下图是linger.ms为10,记录大小为100byte时的测试数据,可以发现及时在all语义下,也接近10W的TPS了。
此外,kafka性能参数和压力测试揭秘这篇kafka的测试也写的不错,可以参考下