我通过在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,这还不错,但是我希望位于同一区域的那些示例有更好的性能。
我在配置中遗漏了什么吗?
2条答案
按热度按时间c6ubokkw1#
我建议你把问题分解一下。如果没有json编码,速度有多快。一个节点有多快,没有复制还是有复制。绘制每个组件的速度图。
我还建议您测试裸机,看看它们是如何进行比较的,因为它们可以明显更快(除非cpu受限,在这种情况下它们可以大致相同)
根据这个基准测试,您应该能够从一个节点获得50mb/shttp://kafka.apache.org/07/performance.html
我希望你应该能够接近饱和你的1GB链接(我想这就是你所拥有的)
免责声明:我工作的编年史队列,这是相当快一点,http://java.dzone.com/articles/kafra-benchmark-chronicle
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测试
我希望这有帮助。