我通过在 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,这还不错,但我希望位于同一区域的那些实例具有更好的性能。
我在配置中遗漏了什么吗?