Spark on GraalVM在facebook的应用

Facebook 正在使用 GraalVM 来加速其 Spark 工作负载并减少内存和 CPU 使用率。 继续阅读以了解他们的迁移故事、性能改进结果和未来计划。

Spark on GraalVM在facebook的应用

Facebook 背后的技术

Facebook 每月有 28 亿活跃用户,是全球访问量最大的平台之一。 为了确保在这种负载下的可靠性和高性能,工程团队采用了广泛的技术,包括 Java、JavaScript、Flow Hack、PHP、Python、C++ 等。

Java 用于 Facebook 的几个关键领域,例如大数据(Spark、Presto 等)、后端服务和移动。 在迁移到 GraalVM 之前,该团队使用 Oracle JDK 和 OpenJDK for Java 8 和 Java 11。

在这样的规模下,任何性能改进都会带来巨大的价值——它们会改善用户体验并降低基础设施成本。 这就是为什么工程团队一直在寻找提高应用程序性能的方法,并决定评估 GraalVM 以确定它是否是更快的 Java 运行时。

为什么使用GraalVM

由于性能是主要考虑因素,Facebook 团队决定评估 GraalVM 作为他们的 Java 运行时,看看它是否会提高他们的 Java 应用程序的性能。 GraalVM 提供高级优化,例如部分逃逸分析和内联启发式。 由于这一点,许多 Java/JVM 应用程序只需切换到 GraalVM 就可以立即获得性能提升。 正如 Facebook 团队还观察到的那样,与 C2 相比,GraalVM 在 SpecJVM2008 和 DaCapo 等基准测试中显示出显着的同比改进。

此外,GraalVM 编译器是从头开始编写的,以模块化和可扩展的方式使用 Java。 这允许轻松维护以及增加增量改进。 这对 Facebook 很重要,因为该团队正在考虑将 GraalVM 作为他们的长期投资。

社区。 GraalVM 项目拥有一个充满活力的开源社区,许多组织和个人都在为该项目做出贡献并制定其路线图。 在社区中也很容易找到帮助和支持。

在 GraalVM 上运行 Java 和 Spark

Facebook 团队使用 GraalVM 社区作为 OpenJDK 的替代品。 在这种情况下,迁移到 GraalVM 非常容易——只需切换运行时即可,无需更改应用程序代码。 由于 GraalVM 的高级性能优化,无需任何手动调整,这种转变使应用程序运行得更快。

Apache Spark 是一个用于大数据处理的统一分析引擎,具有用于流式处理、SQL、机器学习和图形处理的内置模块。 它开箱即用地处理数据非常快,但许多团队正在寻找进一步优化其性能的方法。 最简单的方法之一是在 GraalVM 上运行 Spark 工作负载。 多亏了一组特定的编译器优化,我们稍后会详细讨论,GraalVM 可以显着加快 Spark 工作负载。 Renaissance 基准套件的 Apache Spark 基准测试显示GraalVM社区版平均加速 1.1 倍,GraalVM企业版平均加速 1.42 倍,一些基准测试的运行速度高达 4.84 倍。

Spark on GraalVM在facebook的应用

对于 Facebook,Spark 是其数据仓库中最大的 SQL 查询引擎,运行在聚合计算存储集群上。 由于数据量巨大,效率和成本降低是重中之重。

他们于 2020 年初开始评估。由于初始基准测试显示出良好的结果,该团队将 GraalVM 推广到生产环境并持续监控性能和可靠性。

Spark on GraalVM在facebook的应用

在性能方面,他们观察到 CPU 使用率降低了大约 10%,并且这种 CPU 降低率自推出以来一直保持一致。

GraalVM 如何加速 Spark 工作负载

对 Spark 性能改进贡献最大的一些优化是:

多态内联。 传统内联仅在编译器可以确定方法调用所针对的确切方法时才有效。 GraalVM 通过收集允许抽象方法也被内联的额外分析信息,支持超越这一点的内联。

部分逃逸分析。 部分逃逸分析的思想是通过在对象没有逃逸的分支中执行标量替换来去除不必要的对象分配,并确保对象存在于它必须逃逸的分支中的堆中。 这减少了应用程序的内存占用和 GC 引起的 CPU 负载。 这种优化在像 Spark 这样的数据密集型应用程序中更为重要。 特别是,正如 Facebook 观察到的那样,GraalVM 在 java/lang/Double.valueOf 等方法中将 CPU 消耗减少了 5 倍。

GraalVM 中的高级推测优化通过利用动态运行时反馈生成更快的机器代码。 通过推测程序的某些部分不会在程序执行期间运行,GraalVM 编译器能够专门化代码并使其更高效。 对于 Spark,这种优化通过消除分支(例如长的 if-then-else 链)、简化控制流、减少循环体中的动态检查量以及建立别名约束(从而实现进一步优化)而效果特别好。

作为评估的结果,Facebook 团队将大部分 CPU 密集型大数据服务迁移到了 GraalVM。 在切换到 GraalVM 后,他们还观察到 Presto 的 CPU 和 GC 暂停改善了 5% 以上。 接下来,该团队计划将 GraalVM 推向其他内存受限服务,以从逃逸分析优化中获益。 该团队还计划为项目和社区做出贡献。

他们还在探索使用其他 GraalVM 功能的机会,例如 Native Image 和 Truffle Framework。

结论

得益于高级编译器优化,GraalVM 可以显着加速许多 Java 和 Scala 工作负载。 特别是,只需将 GraalVM 作为 JDK 发行版切换到 GraalVM,Spark 工作负载就可以获得大约 10%-42% 的加速。

有趣的是——来自另一个流行社交媒体平台 Twitter 的工程师分享了类似的旅程和类似的观察。 在将他们的 Scala 工作负载迁移到 GraalVM 后,他们观察到显着的性能改进,例如由于 GraalVM 编译器,P99 延迟减少了 19.9%。 对于像 Twitter 或 Facebook 这样的平台,这种性能改进会随着平台的规模而进一步扩大。

要开始为您的应用程序使用 GraalVM,请访问 graalvm.org/docs/getting-started/。

0 0 投票数
文章评分

本文为从大数据到人工智能博主「xiaozhch5」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。

原文链接:https://lrting.top/backend/13866/

(0)
上一篇 2023-04-28 17:32
下一篇 2023-05-01 10:20

相关推荐

订阅评论
提醒
guest

0 评论
内联反馈
查看所有评论
0
希望看到您的想法,请您发表评论x