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

元组从喷口到达最后一个插销(又名完全延迟)需要更多的时间,这是很高的

澹台建华
2023-03-14
Version Info: 
   "org.apache.storm" % "storm-core" % "1.2.1" 
   "org.apache.storm" % "storm-kafka-client" % "1.2.1" 

我试着调优配置,比如这些螺栓的并行性,max-spout-pending等,看看我能从中得到多大的规模。在某些配置之后,config/results如下所示:

max-spout-pending: 1200
Kafka Spout Executors: 10
Num Workers: 10
+----------+-------------+----------+----------------------+
| boltName | Parallelism | Capacity | Execute latency (ms) |
+----------+-------------+----------+----------------------+
| __acker  |          10 | 0.008    | 0.005                |
| bolt1    |          15 | 0.047    | 0.211                |
| bolt2    |         150 | 0.846    | 33.151               |
| bolt3    |        1500 | 0.765    | 289.679              |
| bolt4    |          48 | 0.768    | 10.451               |
+----------+-------------+----------+----------------------+

处理延迟和执行延迟几乎相同。Bolt3中涉及到一个HTTP调用,它花费了大约如此多的时间,而Bolt2和Bolt4也在执行一些I/O操作。

虽然我可以看到每个bolt可以单独处理超过3k(bolt3:1500/289.679ms=5.17k qps,Bolt4:48/10.451ms=4.59k qps等等),但总体而言,这个拓扑只处理3k qps的元组。我在10个盒子上运行它(所以每个盒子有一个工人),有12个核心CPU和32GB RAM。我为每个工作进程-xms提供了8GB和-xmx提供了10GB,因此RAM也不应受到限制。我看到GC也正常发生,每分钟4个GC大约在一分钟内花费350ms的总时间(从工作进程的飞行记录1分钟)。

我看到每个元组的complete latency大约是4秒,这是我无法理解的,就好像我计算所有螺栓所用的所有时间,大约是334毫秒,但是正如这里提到的,元组可以在缓冲区中等待,它建议增加dop(并行度),我已经做到了,并且达到了上面的状态。

我添加了一些更多的计量,我看到元组从螺栓2到螺栓3平均需要1.3秒,从螺栓3到螺栓4平均需要5秒。虽然我知道Storm可能会将它们保留在它的出站或入站缓冲区中,但我的问题是我如何减少它,因为这些bolt应该能够在一秒钟内处理更多的元组,就像我之前的计算一样,是什么阻碍了它们以更快的速度进入和处理?

共有1个答案

何禄
2023-03-14

我认为您的问题可能是由于ack元组造成的,它用于启动和停止完整的延迟时钟,并被卡在了ACKERS旁等待。

您有很多bolts和高吞吐量,这将导致大量ack消息。尝试使用topology.acker.executors配置值增加ackers的数量,这有望减少ACK元组的排队延迟。

如果您也在使用一个自定义的度量消费者,您可能也希望增加这个组件的并行性,给定您拥有的bolt的数量。

 类似资料:
  • 在我的拓扑中,当元组从spout转移到bolt或从bolt转移到bolt时,我看到大约1-2 ms的延迟。我使用纳秒时间戳来计算延迟,因为整个拓扑运行在单个Worker中。拓扑是在集群中运行的,集群运行在具有生产能力的硬件中。 根据我的理解,在这种情况下,元组不需要序列化/反序列化,因为所有东西都在单个JVM中。我已经将大多数喷流和螺栓的并行性提示设置为5,并且喷流仅以每秒100的速率产生事件。我

  • 我试图在MSSQL中通过jdbc连接批量插入10K记录,批量插入大约需要18到20秒。我想在3秒内插入。有没有办法快速插入。 下面给出我的代码 提前谢谢你的帮助。

  • 这里我尝试用一个摇摆计时器,并不断冻结gui,我做错了什么?。

  • 我还不明白的是,喷口是否也是这样。如果一个spout发出一个元组(即,spout中的函数被执行),并且spout运行的计算机在此后不久崩溃,该元组会被zookeeper复活吗?还是我们需要Kafka来保证这一点? 附注。我理解,在对的调用中,必须为spout发出的元组分配唯一的ID。 P.P.S.我在书中看到的示例代码使用之类的东西来跟踪哪些喷出的元组尚未被加密。这是不是自动被Zookeeper坚

  • 我启动了一个项目,现在项目中有大约7个测试,使用执行整个测试套件已经花费了一分钟多的时间。 从附加输出(标志)中,我可以看到,对于每个测试类和方法,整个quarkus应用程序以及mongodb实例等依赖项都会重新启动。 这与quarkus文档在测试指南页面上的内容完全相反: 到目前为止,在我们的所有示例中,我们只为所有测试启动Quarkus一次。在运行第一个测试之前,Quarkus将启动,然后所有