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

为什么kafka producer(perf测试)会有如此低的吞吐量/高的延迟?

艾心远
2023-03-14

我是Kafka的新手,正在运行一些性能测试。我正在运行一个由我的笔记本电脑和一个raspberry pi zero W(1 GHz、单核CPU、512 MB RAM、802.11n无线局域网)组成的2台机器集群。最终,pi将运行一个单独的生成器(java),该生成器将二进制传感器数据(理想情况下是更小的记录,例如,10 kb,以最快的速度)发送给kafka,然后由消费者在我的笔记本电脑或另一个pi上读取这些数据。一个单独的应用程序稍后脱机处理数据。我只有一个主题,有一个分区,没有复制。

我目前正在尝试对producer性能进行基准测试/了解它的功能。这是来自kafka-producer-perf-test.sh的输出,显示有相当大的延迟,而吞吐量不是很大。我已经玩过这些设置(像linger.ms、batch.size、acks、吞吐量和记录大小,看起来记录大小越大,吞吐量就越高(直到750 kb,然后下降),但是延迟要么是差不多的,要么实际上是下降的。

我只能达到0.6MB/秒,这对于我正在开发的应用程序来说太慢了。当我降低记录大小时,吞吐量更差,为~0.10Mb/秒。因为我是新的Kafka,我想知道这是我应该期待的,当使用pi零w或是一些次优的设置/生产者属性,等等?

pi@raspberrypi:~/Kafka/kafka_2.12-2.4.0 $ bin/kafka-producer-perf-test.sh --topic perf_test --num-records 100 --thughput 1000000 --producer-props bootstrap.servers=192.168.0.170:9092,192.168.0.172:9092 --record-size 750000
OpenJDK Zero VM warning: G1 GC is disabled in this release.
2 records sent, 0.3 records/sec (0.25 MB/sec), 4439.5 ms avg latency, 4607.0 ms max latency.
5 records sent, 0.9 records/sec (0.62 MB/sec), 6909.0 ms avg latency, 9180.0 ms max latency.
5 records sent, 0.8 records/sec (0.58 MB/sec), 12783.4 ms avg latency, 15075.0 ms max latency.
5 records sent, 0.8 records/sec (0.59 MB/sec), 18587.0 ms avg latency, 21165.0 ms max latency.
5 records sent, 0.9 records/sec (0.62 MB/sec), 24551.2 ms avg latency, 26851.0 ms max latency.
4 records sent, 0.8 records/sec (0.55 MB/sec), 30048.0 ms avg latency, 31850.0 ms max latency.
5 records sent, 0.9 records/sec (0.62 MB/sec), 35323.4 ms avg latency, 37657.0 ms max latency.
5 records sent, 0.9 records/sec (0.63 MB/sec), 41030.4 ms avg latency, 43266.0 ms max latency.
5 records sent, 0.8 records/sec (0.59 MB/sec), 46736.6 ms avg latency, 49240.0 ms max latency.
5 records sent, 0.9 records/sec (0.62 MB/sec), 51716.2 ms avg latency, 53756.0 ms max latency.
5 records sent, 0.9 records/sec (0.63 MB/sec), 53765.8 ms avg latency, 53848.0 ms max latency.
5 records sent, 0.9 records/sec (0.61 MB/sec), 53506.2 ms avg latency, 53731.0 ms max latency.
4 records sent, 0.8 records/sec (0.55 MB/sec), 53638.3 ms avg latency, 54029.0 ms max latency.
5 records sent, 0.9 records/sec (0.62 MB/sec), 53690.4 ms avg latency, 54003.0 ms max latency.
5 records sent, 0.9 records/sec (0.64 MB/sec), 53371.6 ms avg latency, 53703.0 ms max latency.
5 records sent, 0.9 records/sec (0.62 MB/sec), 52922.0 ms avg latency, 53008.0 ms max latency.
4 records sent, 0.7 records/sec (0.53 MB/sec), 53774.3 ms avg latency, 53805.0 ms max latency.
5 records sent, 0.9 records/sec (0.63 MB/sec), 53788.6 ms avg latency, 53827.0 ms max latency.
5 records sent, 0.9 records/sec (0.64 MB/sec), 53317.2 ms avg latency, 53698.0 ms max latency.
5 records sent, 0.8 records/sec (0.60 MB/sec), 53373.2 ms avg latency, 53406.0 ms max latency.
5 records sent, 0.9 records/sec (0.63 MB/sec), 53441.8 ms avg latency, 53476.0 ms max latency.
100 records sent, 0.816993 records/sec (0.58 MB/sec), 42056.90 ms avg latency, 54029.00 ms max latency, 52990 ms 50th, 53805 ms 95th, 54029 ms 99th, 54029 ms 99.9th.

共有1个答案

吴星汉
2023-03-14

消息在发送给Kafaka之前是分批处理的。批处理中的消息数量越多,单次发送的消息数量就越多,吞吐量就越高。

如果要增加消息大小,则还必须增加batch.size,以便每个批分配更多的消息。

从您粘贴的代码中,没有设置Batch.size的属性,因此默认为16384字节(16kb),这远远小于您的消息大小(750kb),所以您看到0.3条记录/秒,以此类推。

在batch.size文档中

不会尝试批处理大于此大小的记录。

因此,您可以尝试增加batch.size以分配更多的消息,例如,增加到10MB左右,并检查。

 类似资料:
  • 我正在尝试运行Flink流媒体作业。我想确定流处理的延迟和吞吐量。我已启动Kafka代理服务器,并收到来自Kafka的传入消息。如何计算每秒的邮件数(吞吐量)?(如rdd.count。是否有类似的方法来获取传入消息的计数) (完整的场景:我已经通过生产者发送了消息作为Json对象。我在Json对象中添加了一些信息,如名称为字符串和System.currentTimeMills。在流式传输期间,我如

  • 问题内容: 我为Apache Flink写了一个非常简单的Java程序,现在我对测量统计信息感兴趣,例如吞吐量(每秒处理的元组数)和等待时间(程序需要处理每个输入元组的时间)。 我知道Flink公开了一些指标: https://ci.apache.org/projects/flink/flink-docs- release-1.2/monitoring/metrics.html 但是我不确定如何使

  • 总的来说,我认为我对延迟和吞吐量之间的区别有很好的理解。但是,对于Intel Intrinsics,延迟对指令吞吐量的影响我还不清楚,尤其是在顺序(或几乎顺序)使用多个内在调用时。 例如,让我们考虑: 这有11个延迟,在Haswell处理器上的吞吐量为7。如果我在循环中运行这条指令,我会在11个循环后获得每个循环的连续输出吗?由于这需要一次运行11条指令,并且由于我的吞吐量为7,我是否用完了“执行

  • 我需要从很多客户端通过网络套接字连接到java服务器来提取数据。 有很多web套接字实现,我选择了vert。x、 我做了一个简单的演示,在那里我听json的文本帧,用jackson解析它们,然后返回响应。Json解析器对吞吐量没有显著影响。 我的总速度是每秒2.5公里,有2到10个客户。 然后我尝试使用缓冲,客户端不会等待每个响应,而是在服务器确认后发送一批消息(30k-90k),速度提高到每秒8

  • 我为帖子的篇幅感到抱歉,但有很多事情可能会导致我的情况,我已经尝试将我根据其他帖子所做的所有设置更改包括在内。简言之,我的WCF服务似乎一次只能处理3到4个并发客户端请求。如果我将应用程序池最大工作进程数设置得更高(大约10个),或者将服务行为ConcurrencyMode设置为多个,那么吞吐量就会大大提高(快几倍)。然而,这些似乎是真正问题的解决办法,带来了他们自己的问题。是我错了,还是IIS应

  • 我正在对ElasticSearch进行基准测试,以实现非常高的索引吞吐量。 我目前的目标是能够在几个小时内索引30亿(3,000,000,000)文档。为此,我目前有3台windows服务器机器,每台16GB内存和8个处理器。插入的文档有一个非常简单的映射,只包含少数数字非分析字段(被禁用)。 使用这个相对适中的钻机,我能够达到每秒大约120,000个索引请求(使用大桌子监控),我相信吞吐量可以进