当前位置: 首页 > 知识库问答 >
问题:

Kafka的基准测试——表现平平

阳昊
2023-03-14

我正在通过在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,这还不错,但我希望位于同一区域的那些实例有更好的性能

配置中是否缺少某些内容?

共有2个答案

郭兴平
2023-03-14

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

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

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

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

我希望这能有所帮助。

仉明知
2023-03-14

我建议您分解这个问题。没有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++