1

我通过在 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 

其次,我在具有 32Gb RAM 和额外 6 个 SSD 驱动器的 i2.2xlarge 机器上安装了单个 Kafka 服务器,其中每个磁盘分区为/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

我所有的测试都是从另一个实例完成的,实例之间的延迟小于 1 毫秒。当分区键是从 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

现在,当我发送 100k 条消息时,我每秒收到 10k 条消息和大约 1 毫秒的延迟。

这意味着我每秒有 10 兆字节,相当于 80Mb/s,这还不错,但我希望位于同一区域的那些实例具有更好的性能。

我在配置中遗漏了什么吗?

4

2 回答 2

3

我建议你分解问题。没有 JSON 编码的速度有多快。一个节点有多快,没有复制与复制。构建每个组件应该有多快的图片。
我还建议您测试裸机机器以查看它们的比较,因为它们可以明显更快(除非 CPU 受限,在这种情况下它们可以大致相同)

根据此基准,您应该能够从一个节点http://kafka.apache.org/07/performance.html获得 50 MB/s

我希望您应该能够接近饱和您的 1 Gb 链接(我假设这就是您所拥有的)

免责声明:我在 Chronicle Queue 上工作,速度相当快,http://java.dzone.com/articles/kafra-benchmark-chronicle

于 2014-12-12T17:09:48.957 回答
1

如果它对您的应用程序有意义,您可以通过流式传输字节数组而不是 JSON 对象来获得更好的性能,并在管道的最后一步将字节数组转换为 JSON 对象。

如果每个消费者线程一致地从同一个主题分区中读取,您也可能会获得更好的性能。我认为 Kafka 一次只允许一个消费者从一个分区中读取,因此根据您随机选择分区的方式,如果消费者试图从与另一个消费者线程相同的分区中读取,则可能会被短暂阻塞。

您也有可能使用更少的消费者线程或不同的 kafka 批量大小来获得更好的性能。我使用参数化的 JUnit 测试来帮助找到最佳设置,例如每个使用者的线程数和批量大小。以下是我写的一些例子来说明这个概念:

http://www.bigendiandata.com/2016-10-02-Junit-Examples-for-Kafka/ https://github.com/iandow/kafka_junit_tests

我希望这会有所帮助。

于 2016-10-07T17:02:05.393 回答