【问题标题】:High latency between spout -> bolt and bolt -> boltsspout -> bolt 和 bolt -> bolts 之间的高延迟
【发布时间】:2018-03-30 18:40:07
【问题描述】:

在我的拓扑中,将元组从 spout 传输到 bolt 或从 bolt 传输到 bolt 时,我看到大约 1 到 2 ms 的延迟。我正在使用纳秒时间戳计算延迟,因为整个拓扑在单个工作人员内运行。 拓扑在集群中运行,该集群在具有生产能力的硬件中运行。

据我了解,在这种情况下,不需要对元组进行序列化/反序列化,因为所有内容都在单个 JVM 中。我已将大多数 spout 和 bolts 的并行提示设置为 5,并且 spout 仅以每秒 100 个的速率产生事件。我不认为高延迟是由于事件排队造成的,因为我没有看到延迟随着时间的推移而增加。也没有增加内存。日志级别设置为 ERROR。 CPU 使用率在 200 到 300 % 之间。

什么可能导致这种延迟?我原以为只有少数我们可以进行元组传输。

【问题讨论】:

    标签: apache-storm


    【解决方案1】:

    我假设您使用的是已发布的 Storm 版本之一,而不是 2.0.0-SNAPSHOT,因为该版本中的队列实现已更改。

    我认为延迟很可能是因为 Storm 在将元组交付给消费者之前对它们进行了批处理。查看https://github.com/apache/storm/blob/v1.2.1/storm-core/src/jvm/org/apache/storm/utils/DisruptorQueue.java#L247,并查看该文件中的 Flusher 类。当一个 spout/bolt 发布一个元组时,它被放入 _currentBatch 列表中。它会一直停留在那里,直到收到足够的元组以使批次“足够大”(您可以查看 _inputBatchSize 变量以确定何时发生),或者直到触发 Flusher(默认情况下每毫秒发生一次)。

    【讨论】:

    • 我使用的是稳定的 1.0.6 版本。我试过你的建议。本质上,我将批量大小设置为 1,超时设置为 1ms。它确实改善了一些事情,但平均延迟仍然高于 600 微秒,有时甚至达到 2000 微秒左右。当一切都在同一个 JVM 中运行时,我实际上正在寻找 1 - 40 us 范围内的非常低延迟的元组传输。这在暴风雨中可行吗?还是我为我的低延迟应用评估了错误的框架?
    • Storm 通常会在多台机器上集群运行,所以我预计您通常会看到比由于网络延迟更高的延迟。我认为 Storm 倾向于优化吞吐量而不是延迟。尝试在 Storm-user 邮件列表 (storm.apache.org/getting-help.html) 上发布您的用例,以及为什么需要这种延迟,那里的人可能会知道这是否可能。
    • 干杯,我在该组中发帖,他们确认我看到的延迟很常见,除非我需要升级到不稳定的版本 2。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-04-22
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-04-17
    相关资源
    最近更新 更多