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等配置,看看我可以从中获得多大的规模。在一些配置配置/结果看起来如下所示:
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,(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,元组可以在缓冲区中等待,它建议增加掺杂(并行度),我已经完成并达到了上述状态。
我添加了一些更多的计量,我看到元组平均需要大约1.3秒从螺栓2到螺栓3和5秒从螺栓3到螺栓4.虽然我知道Storm可能会将它们保留在它的出站或入站缓冲区中,My问题是我如何减少它,因为这些螺栓应该能够在一秒钟内处理更多的元组作为我之前的计算,是什么阻止他们以更快的速度进入和处理?
我认为你的问题可能是由于ack
元组,用于启动和停止完整的延迟时钟,等待在ackers等待。
你有很多螺栓,可能是高吞吐量,这会导致很多ack
消息。尝试增加ackers的数量,使用topology.acker.executors
配置值,这将有望减少ack
元组的排队延迟。
如果您还使用自定义度量标准使用者,则可能还需要增加此组件的并行度,这取决于您拥有的螺栓数量。