目前,我在一台有4个核心的边缘节点上运行Nifi。如果我有20个传入的流文件,并给ExecuteStreamCommand处理器设置并发任务为10,这意味着我只能获得并发执行还是同时获得并行执行?
目前,我在一台有4个核心的边缘节点上运行Nifi。如果我有20个传入的流文件,并给ExecuteStreamCommand处理器设置并发任务为10,这意味着我只能获得并发执行还是同时获得并行执行?
回复:
John,JVM线程处理是一个相当复杂的话题,但一般情况下会有n+C个JVM线程,其中C是某个常数(main线程、VM线程、GC线程),而n是由流程控制器创建以执行处理器任务的“个体”线程数量。JVM线程与本机操作系统线程1:1映射,因此在运行10个处理器线程的4核系统上,您将拥有“4个并行执行”。我认为,在高层次上,您的操作系统将使用时间分片来循环处理这10个线程中的4个,并且每个线程将处理~2个流文件。
再次强调,这只是一个非常粗略的想法(假设1个流文件=1个工作单位=1秒):
Cores | Threads | Flowfiles/thread | Relative time
1 | 1 | 20 | 20 s (normal)
4 | 1 | 20 | 20 s (wasting 3 cores)
1 | 4 | 5 | 20 s (time slicing 1 core for 4 threads)
4 | 4 | 5 | 5 s (1:1 thread to core ratio)
4 | 10 | 2 | 5+x s (see execution table below)
Flowfiles A - T
Cores α, β, γ, δ
Threads 1 - 10
Time/thread 1 s
Time | Core α | Core β | Core γ | Core δ
0 | 1/A | 2/B | 3/C | 4/D
1 | 5/E | 6/F | 7/G | 8/H
2 | 9/I | 10/J | 1/K | 2/L
3 | 3/M | 4/N | 5/O | 6/P
4 | 7/Q | 8/R | 9/S | 10/T
Time | Core α | Core β | Core γ | Core δ
0 | 1/A | 2/B | 3/C | 4/D
.5 | 5/E | 6/F | 7/G | 8/H
1 | 9/I | 10/J | 1/A | 2/B
1.5 | 3/C | 4/D | 5/E | 6/F
2 | 7/G | 8/H | 9/I | 10/J
2.5 | 1/K | 2/L | 3/M | 4/N
3 | 5/O | 6/P | 7/Q | 8/R
3.5 | 9/S | 10/T | 1/K | 2/L
4 | 3/M | 4/N | 5/O | 6/P
4.5 | 7/Q | 8/R | 9/S | 10/T
我刚在本地的1.5.0开发分支上进行了一个快速测试 -- 我连接了一个简单的GenerateFlowFile
,使用0秒
计划运行到一个LogAttribute
处理器。 GenerateFlowFile
立即生成了很多流文件,队列启用了反向压力功能(暂停输入处理器,直到队列可以排放一些等待的10,000个流文件)。我停止了两个并重新运行了此操作,给LogAttribute
处理器更多的并发任务。通过将LogAttribute
并发任务设置为GenerateFlowFile
的2:1,队列从未积累超过大约50个排队的流文件。
tl;dr 将并发任务设置为您拥有的核心数应该足够。
更新2:
与我们的一位JVM专家进行了核实,他提到了两件事情:
10
。