微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

Google Cloud Dataflow + Java 8 与 Java 11:相同的管道,工作人员的 CPU 利用率不同

如何解决Google Cloud Dataflow + Java 8 与 Java 11:相同的管道,工作人员的 CPU 利用率不同

我有一个 Beam 2.25.0 管道,它获取一些数据、生成更多数据(进行扇出)、重新分区新数据,并并行运行对生成的数据的计算。我为作业指定的机器是 n1-highmem-4,我指定最多 40 名工人。

它在 Java 8 下运行良好:提供给作业的所有工人都被充分利用(> 90% cpu)。吞吐量为 40 个元素/秒。

pipeline running in java8

当我重新编译并重新运行管道以使用 Java 11 时,为作业提供了相同数量的工作线程,但它们的 cpu 利用率仅达到 30%,吞吐量更低,低于 18/s。

pipeline in java 11

为了让作业达到相同的吞吐量数字,我必须指定 --numberOfWorkerHarnessThreads=4 标志,即便如此,吞吐量仍然不像我在 Java 8 下运行管道时的 40/s .

pipeline with java 11 and specify threads per worker

在管道中使用 Java 8 与 Java 11 有什么区别?为什么在 Java 11 下运行的管道不会像在 Java 8 下一样自动使用工作线程?

我还尝试为 Java 11 管道执行重新编译和使用 Beam 2.26.0,但它具有相同的吞吐量。

解决方法

Beam 中有一个 bug 使管道在 Java 11 中默认仅使用 1 个线束线程。指定 numberOfWorkerHarnessThreads=4 使管道使用 4 个线束将使其使用 4线程。

您可以看到工作人员确实使用了大约 25% 的 Cpu,这(因为您使用的是 4 核机器作为 n1-highmem-4,从帖子中看起来),意味着 100 %/4 核 = 25%。

看Jira,应该是2.26.0修复的,但可能延迟到2.27.0了

版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。