元组从喷口到最后一个螺栓(又称“完整延迟”)需要花费更多时间

时间:2018-10-27 08:38:08

标签: apache-storm

Version Info: 
   "org.apache.storm" % "storm-core" % "1.2.1" 
   "org.apache.storm" % "storm-kafka-client" % "1.2.1" 

我正在创建并尝试使用自己创建的Storm拓扑,该拓扑具有4个螺栓和一个kafka喷口。

我正在尝试调整这些螺栓的平行度,最大喷口未决等配置,以了解我可以从中获得多少规模。经过一些配置后,配置/结果如下所示:

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               |
+----------+-------------+----------+----------------------+

处理延迟和执行延迟几乎相同。螺栓3涉及一个HTTP调用,这大约花费了很多时间,螺栓2和螺栓4也在执行一些I / O操作。

虽然我可以看到每个螺栓可以单独处理超过3k(螺栓3:1500 / 289.679ms = 5.17k qps,螺栓4: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毫秒,但是如上所述{3}},元组可以在缓冲区中等待,这建议增加dop(并行度),这是我已经完成并达到状态之上的。

我添加了更多的测光功能,我发现元组平均需要大约1.3秒才能从螺栓2到达螺栓3,从螺栓3到螺栓4需要5秒。虽然我知道Storm可能会将它们保持在出站或入站状态缓冲区,我的问题是如何减少这些螺栓,因为这些螺栓应该能够像我之前的计算一样在一秒钟内处理更多的元组,是什么阻止它们以更快的速度进入和处理?

1 个答案:

答案 0 :(得分:0)

我认为您的问题可能是由于ack元组所引起的,该元组用于启动和停止完整的延迟时钟,被卡在等待中。

您遇到了很多麻烦,并且吞吐量可能很高,这将导致大量ack消息。尝试使用topology.acker.executors配置值来增加acker的数量,这将有望减少ack元组的排队延迟。

如果您还使用自定义指标使用者,则可能还需要增加此组件的并行度,因为您有螺栓数量。