基准测试kafka-性能一般

uubf1zoe  于 2021-06-08  发布在  Kafka
关注(0)|答案(2)|浏览(411)

我通过在ec2服务器上传输1k大小的消息来测试kafka 0.8.1.1。
我在两台m3.xlarge服务器上安装了zookeeper,配置如下:

dataDir=/var/zookeeper/                                                                    
clientPort=2181
initLimit=5
syncLimit=2
server.server1=zoo1:2888:3888                                
server.server2=zoo2:2888:3888

第二,我在i2.2x大型计算机上安装了一台kafka服务器,它有32gbram和额外的6个ssd驱动器,每个磁盘分区为 /mnt/a , mnt/b, etc.... . 在服务器上,我有一个代理,端口9092上有一个主题,有8个分区,复制因子为1:

broker.id=1
port=9092
num.network.threads=4
num.io.threads=8
socket.send.buffer.bytes=1048576
socket.receive.buffer.bytes=1048576
socket.request.max.bytes=104857600
log.dirs=/mnt/a/dfs-data/kafka-logs,/mnt/b/dfs-data/kafka-logs,/mnt/c/dfs-data/kafka-logs,/mnt/d/dfs-data/kafka-logs,/mnt/e/dfs-data/kafka-logs,/mnt/f/dfs-data/kafka-logs
num.partitions=8
log.retention.hours=168
log.segment.bytes=536870912
log.cleanup.interval.mins=1
zookeeper.connect=172.31.26.252:2181,172.31.26.253:2181
zookeeper.connection.timeout.ms=1000000
kafka.metrics.polling.interval.secs=5
kafka.metrics.reporters=kafka.metrics.KafkaCSVMetricsReporter
kafka.csv.metrics.dir=/tmp/kafka_metrics
kafka.csv.metrics.reporter.enabled=false
replica.lag.max.messages=10000000

我所有的测试都是在另一个示例上完成的,示例之间的延迟小于1ms。当分区键是从0到7的随机数时,我使用一个线程生产者和8个线程消费者编写了生产者/消费者java客户机。通过提供自定义编码器,我使用json序列化了每条消息。
我的消费生产者属性如下:

metadata.broker.list = 172.31.47.136:9092
topic = mytopic
group.id = mytestgroup
zookeeper.connect = 172.31.26.252:2181,172.31.26.253:2181
serializer.class = com.vanilla.kafka.JsonEncoder
key.serializer.class = kafka.serializer.StringEncoder
producer.type=async
queue.enqueue.timeout.ms = -1
batch.num.messages=200
compression.codec=0
zookeeper.session.timeout.ms=400
zookeeper.sync.time.ms=200
auto.commit.interval.ms=1000
number.messages = 100000

现在,当我发送10万条消息时,每秒的容量是10万条,延迟大约是1毫秒。
这意味着我有每秒10兆字节的速度,相当于80mb/s,这还不错,但是我希望位于同一区域的那些示例有更好的性能。
我在配置中遗漏了什么吗?

c6ubokkw

c6ubokkw1#

我建议你把问题分解一下。如果没有json编码,速度有多快。一个节点有多快,没有复制还是有复制。绘制每个组件的速度图。
我还建议您测试裸机,看看它们是如何进行比较的,因为它们可以明显更快(除非cpu受限,在这种情况下它们可以大致相同)
根据这个基准测试,您应该能够从一个节点获得50mb/shttp://kafka.apache.org/07/performance.html
我希望你应该能够接近饱和你的1GB链接(我想这就是你所拥有的)
免责声明:我工作的编年史队列,这是相当快一点,http://java.dzone.com/articles/kafra-benchmark-chronicle

xbp102n0

xbp102n02#

如果对您的应用程序有意义,您可以通过流式传输字节数组而不是json对象来获得更好的性能,并在管道的最后一步将字节数组转换为json对象。
如果每个使用者线程一致地从同一主题分区读取数据,您也可能获得更好的性能。我认为kafka一次只允许一个使用者从一个分区读取数据,因此根据您随机选择分区的方式,如果一个使用者试图从另一个使用者线程所在的同一分区读取数据,那么它可能会被短暂地阻止。
您还可以使用更少的使用者线程或不同的kafka批处理大小来获得更好的性能。我使用参数化的junit测试来帮助找到最佳设置,比如每个使用者的线程数和批处理大小。下面是我写的一些例子来说明这个概念:
http://www.bigendiandata.com/2016-10-02-junit-examples-for-kafka/httpshttp://github.com/iandow/kafka\u junit\u测试
我希望这有帮助。

相关问题