Google Cloud Dataflow + Java 8 vs Java 11:相同的管道,不同的 CPU 工人利用率
Google Cloud Dataflow + Java 8 vs Java 11: same pipeline, different CPU utilization on workers
我有一个 Beam 2.25.0 管道,它获取一些数据,生成更多数据(执行扇出),重新分区新数据,以及 运行 并行计算生成的数据。我为这项工作指定的机器是 n1-highmem-4,我指定最多 40 个工人。
在 Java 8 下工作正常:提供给该工作的所有工人都得到充分利用 (>90% CPU)。吞吐量为 40 elements/s.
当我重新编译并重新运行 管道使用 Java 11 时,为作业提供了相同数量的工人,但它们仅达到 30% CPU 利用率,并且吞吐量较小,低于 18/s。
为了让作业达到相同的吞吐量数字,我必须指定 --numberOfWorkerHarnessThreads=4
标志,即使那样,吞吐量仍然不像我 [=47= 时那样是 40/s ] Java 8.
下的管道
管道使用 Java 8 与 Java 11 之间有什么区别?为什么在 Java 11 下的管道 运行ning 不能像在 Java 8 下那样自动利用工人?
我还尝试重新编译并使用 Beam 2.26.0 执行 Java 11 管道,但它具有相同的吞吐量。
Beam 中有一个 bug 使管道默认只使用 1 个线束线程用于 Java 11。指定 numberOfWorkerHarnessThreads=4
使管道使用 4 个线束将使它使用 4 个线程。
您可以看到工作人员确实使用了大约 25% Cpu,这(因为您使用的是 4 核机器 n1-highmem-4,因为从 post) 看,意味着 100%/4 个核心 = 25%。
看Jira,应该是2.26.0就修复了,可能是延迟到2.27.0
我有一个 Beam 2.25.0 管道,它获取一些数据,生成更多数据(执行扇出),重新分区新数据,以及 运行 并行计算生成的数据。我为这项工作指定的机器是 n1-highmem-4,我指定最多 40 个工人。
在 Java 8 下工作正常:提供给该工作的所有工人都得到充分利用 (>90% CPU)。吞吐量为 40 elements/s.
当我重新编译并重新运行 管道使用 Java 11 时,为作业提供了相同数量的工人,但它们仅达到 30% CPU 利用率,并且吞吐量较小,低于 18/s。
为了让作业达到相同的吞吐量数字,我必须指定 --numberOfWorkerHarnessThreads=4
标志,即使那样,吞吐量仍然不像我 [=47= 时那样是 40/s ] Java 8.
管道使用 Java 8 与 Java 11 之间有什么区别?为什么在 Java 11 下的管道 运行ning 不能像在 Java 8 下那样自动利用工人?
我还尝试重新编译并使用 Beam 2.26.0 执行 Java 11 管道,但它具有相同的吞吐量。
Beam 中有一个 bug 使管道默认只使用 1 个线束线程用于 Java 11。指定 numberOfWorkerHarnessThreads=4
使管道使用 4 个线束将使它使用 4 个线程。
您可以看到工作人员确实使用了大约 25% Cpu,这(因为您使用的是 4 核机器 n1-highmem-4,因为从 post) 看,意味着 100%/4 个核心 = 25%。
看Jira,应该是2.26.0就修复了,可能是延迟到2.27.0