我正在通过在EC2服务器上传输1k大小的消息,对Kafka 0.8.1.1进行基准测试。
我在两个m3上安装了zookeeper。xlarge服务器和具有以下配置:
dataDir=/var/zookeeper/
clientPort=2181
initLimit=5
syncLimit=2
server.server1=zoo1:2888:3888
server.server2=zoo2:2888:3888
第二,我在i2.2x大型机器上安装了一台Kafka服务器,该机器具有32Gb RAM和额外的6个SSD驱动器,其中每个磁盘都分区为mnt/a、mnt/b等 。在服务器上,我有一个代理,端口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,这还不错,但我希望位于同一区域的那些实例有更好的性能。
配置中是否缺少某些内容?
如果这对您的应用程序有意义,您可以通过流式传输字节数组而不是JSON对象来获得更好的性能,并在管道的最后一步将字节数组转换为JSON对象。
如果每个消费者线程一致地从同一个主题分区读取,您也可能获得更好的性能。我认为Kafka一次只允许一个消费者从一个分区读取,因此根据您随机选择分区的方式,如果消费者尝试从与另一个消费者线程相同的分区读取,它可能会被短暂阻止。
使用更少的消费者线程或不同的kafka批处理大小也可能获得更好的性能。我使用参数化的JUnit测试来帮助找到每个消费者的线程数和批处理大小等的最佳设置。以下是我写的一些示例来说明这个概念:
http://www.bigendiandata.com/2016-10-02-Junit-Examples-for-Kafka/ https://github.com/iandow/kafka_junit_tests
我希望这能有所帮助。
我建议您分解这个问题。没有Json编码的速度有多快。一个节点有多快,没有复制与有复制。构建每个组件应该有多快的图片。
我还建议您测试裸机以查看它们的比较情况,因为它们可以显着更快(除非CPU受限,否则在这种情况下它们可能几乎相同)
根据这个基准测试,您应该能够从一个节点获得50 MB/s的速度http://kafka.apache.org/07/performance.html
我希望你应该能够接近饱和你的1 GB链接(我假设这就是你所拥有的)
免责声明:我使用的是纪事队列,速度要快得多,http://java.dzone.com/articles/kafra-benchmark-chronicle
11.4. 基准测试 基准测试是测量一个程序在固定工作负载下的性能。在Go语言中,基准测试函数和普通测试函数写法类似,但是以Benchmark为前缀名,并且带有一个*testing.B类型的参数;*testing.B参数除了提供和*testing.T类似的方法,还有额外一些和性能测量相关的方法。它还提供了一个整数N,用于指定操作执行的循环次数。 下面是IsPalindrome函数的基准测试,其中循
GoCPPLua (JIT) 策略执行的负载在model_b_test.go中进行基准测试。 测试是: 英特尔 酷睿 i7-6700HQ CPU @ 2.60GHz, 2601 Mhz, 4 核, 8 处理器 go test -bench= -benchmem 的测试结果如下 (op = 一次 Enforce() 调用, ms = 毫秒, KB = 千字节): 测试用例 规则大小 时间开销 (m
These benchmarks were designed to measure Javascript running time for Mithril in comparison with other popular Javascript MVC frameworks. Javascript running time is significant because the gzipped siz
https://github.com/17koa/koa-benchmark 比较koa和koa2和express性能 Prerequisites for OSX brew install wrk wrk原理 命令行操作 $ wrk -t8 -c1000 -d10 http://127.0.0.1:3000 Test 首次测试,需要安装依赖,会比较慢 make all 不安装依赖,重复测试
Rust 也支持基准测试,它可以测试代码的性能。让我们把src/lib.rs修改成这样(省略注释): #![feature(test)] extern crate test; pub fn add_two(a: i32) -> i32 { a + 2 } #[cfg(test)] mod tests { use super::*; use test::Bencher;
在 _test.go 结尾的测试文件中,如下形式的函数: func BenchmarkXxx(*testing.B) 被认为是基准测试,通过 "go test" 命令,加上 -bench flag 来执行。多个基准测试按照顺序运行。 基准测试函数样例看起来如下所示: func BenchmarkHello(b *testing.B) { for i := 0; i < b.N; i++