我最近开始使用apachestorm。现在主要关注我的一个应用程序的一些性能测试和调优(从nosql数据库中提取数据、格式化并发布到jms队列供请求者使用),以便一次能够进行更多的并行请求处理。我已经能够根据更改螺栓数量、最大开销等来调整拓扑,并使用一些滴答声的方法来限制拓扑中的数据流。
我想知道当我们定义更多的并行性而不是我们没有的核时会发生什么。在我的例子中,我有一个单节点,单工作拓扑和机器有32个核心。但执行器总数(所有喷嘴和螺栓)=60。所以我的问题是:
这个高数字真的有助于处理请求吗?或者它实际上降低了性能,因为我相信在bolt任务之间会有更多的上下文切换来利用核心。
如果我为一个bolt定义了20个(只是随机选择)执行器,并且我的代码流不需要使用bolt,这会影响性能吗?storm如何处理这种情况?
1条答案
按热度按时间krcsximq1#
这是一个非常普遍的问题,所以答案是(一如既往):视情况而定。
如果您的负载很大,并且单个执行器完全利用了一个核心,那么拥有更多的执行器并不能提高吞吐量。如果有任何影响,则可能是负面的(也与内部使用队列的争用有关,所有执行器都需要读取和写入这些队列以进行元组传输)。
如果您的负载“很小”,并且没有充分利用您的CPU,那么这也很重要--您不会获得或丢失任何东西--因为您的核心没有充分利用,您仍然有一些剩余的空间。
此外,请考虑storm在每个worker中跨越了更多线程。因此,如果执行器充分利用了硬件,这些线程也会受到影响。
总的来说,你不应该运行你的拓扑结构来完全利用核心,但要为小的“尖峰”等留出空间。在运行中,也许80%的cpu利用率是一个很好的值。根据经验,每个核心有一个执行器是可以的。