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来进行测试

可以看到该工具主要提供了以下选项:

  1. 产生的消息记录数
  2. 每条记录的大小,单位为byte
  3. 设定吞吐量阈值,测试时不超过该阈值
  4. 设定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的测试也写的不错,可以参考下