【问题标题】:Tuples taking more time in reaching from spout to last bolt(aka Complete Latency) is high从 spout 到最后一个 bolt 需要更多时间的元组(又名完全延迟)很高
【发布时间】:2019-03-09 23:08:34
【问题描述】:
Version Info: 
   "org.apache.storm" % "storm-core" % "1.2.1" 
   "org.apache.storm" % "storm-kafka-client" % "1.2.1" 

我正在创建和试验我创建的 Storm 拓扑,它有 4 个螺栓和一个 kafka spout。

我试图调整这些螺栓的并行性、最大喷口挂起等配置,以查看我可以从中获得多少规模。经过一些配置配置/结果如下所示:

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

进程延迟和执行延迟几乎相同。 Bolt 3 中涉及一个 HTTP 调用,它花费了大约相同的时间,并且 Bolt 2 和 Bolt 4 也在执行一些 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 大约需要 350 毫秒的总时间(来自 1 分钟工作进程的飞行记录)。

我看到Complete Latency 每个元组大约需要 4 秒,这是我无法理解的,因为如果我计算所有螺栓所花费的所有时间,它大约是 334 毫秒,但正如提到的 here ,元组可以在缓冲区中等待,它建议增加dop(并行度),我已经这样做并达到了上述状态。

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

【问题讨论】:

    标签: apache-storm


    【解决方案1】:

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

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

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

    【讨论】:

    • 我已经增加了 ackers 的数量,之前是 3 个,我增加到 10 个,而且我没有看到 ackers 的执行延迟非常高,你的假设仍然成立吗?
    • Acker 本身的执行延迟并不能告诉您太多,您还需要查看 Acker 到达率。利用率(到达率乘以执行延迟)越接近 1,您的 ack 元组等待的时间就越长,并且人为地将更多的时间添加到完整的延迟值中。
    • 我如何查看 Acker 到达率,是否在某些指标中存在,无法在 nimbus UI 中找到?
    • 我还将 ackers 从 10 增加到 50,对性能没有影响。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-03-08
    • 1970-01-01
    • 2017-05-21
    • 1970-01-01
    • 2020-12-30
    相关资源
    最近更新 更多