Facebook的GraalVM使用经验


Facebook 正在使用 GraalVM 来加速其 Spark 工作负载并减少内存和 CPU 使用率。继续阅读以了解他们的迁移故事、性能改进结果和未来计划。
Facebook 在几个关键领域使用 Java,例如大数据(Spark、Presto 等)、后端服务和移动。在迁移到 GraalVM 之前,该团队将 Oracle JDK 和 OpenJDK 用于 Java 8 和 Java 11。
在这样的规模下,任何性能改进都会带来巨大的价值——它们可以改善用户体验并降低基础设施成本。这就是为什么工程团队一直在寻找提高应用程序性能的方法,并决定评估 GraalVM 以确定它是否是更快的 Java 运行时。
 
为什么选择 GraalVM

  • 由于性能是一个主要考虑因素,Facebook 团队决定将 GraalVM 评估为他们的 Java 运行时,看看它是否会提高他们的 Java 应用程序的性能。GraalVM 提供高级优化,例如部分转义分析和内联启发式。多亏了这一点,许多 Java/JVM 应用程序将通过切换到 GraalVM 看到开箱即用的性能提升。正如 Facebook 团队所观察到的,GraalVM 在 SpecJVM2008 和 DaCapo 等基准测试中与 C2 相比显示出显着的同比改进。
  • 此外,GraalVM 编译器是从头开始编写的,以模块化和可扩展的方式使用 Java。这允许轻松维护以及增加增量改进。这对 Facebook 很重要,因为该团队正在考虑对 GraalVM 进行长期投资。
  • 社区。GraalVM 项目拥有一个充满活力的开源社区,许多组织和个人为该项目做出了贡献并制定了其路线图。在社区中寻找帮助和支持也很容易。

 
在 GraalVM 上运行 Java 和 Spark
Facebook 团队使用 GraalVM 作为 OpenJDK 的替代品。在这种情况下,迁移到 GraalVM 非常容易——只需切换运行时,无需更改应用程序代码。由于 GraalVM 的高级性能优化,这种转变使应用程序运行得更快,而无需任何手动调整。
Apache Spark 是用于大数据处理的统一分析引擎,具有用于流、SQL、机器学习和图形处理的内置模块。它开箱即用地处理数据的速度非常快,但许多团队正在寻找进一步优化其性能的方法。最简单的方法之一是在 GraalVM 上运行 Spark 工作负载。GraalVM 可以显着加速 Spark 工作负载。
对于 Facebook 而言,Spark 是其数据仓库中最大的 SQL 查询引擎,运行在聚合计算存储集群上。由于数据量巨大,效率和成本降低是重中之重。
 
GraalVM 如何加速 Spark 工作负载
对 Spark 性能提升贡献最大的一些优化是:
  • 多态内联。传统的内联只有在编译器可以决定方法调用所针对的确切方法时才有效。GraalVM 通过收集允许抽象方法也被内联的额外分析信息来实现在这一点之外的内联。
  • 部分逃逸分析。部分逃逸分析的思想是通过在对象未逃​​逸的分支中执行标量替换来消除不必要的对象分配,并确保该对象存在于必须逃逸的分支的堆中。这既减少了应用程序的内存占用,也减少了 GC 引起的 CPU 负载。这种优化在数据密集型应用程序(如 Spark)中更为重要。特别是,正如 Facebook 所观察到的那样,GraalVM 将 CPU 消耗减少了 5 倍,例如java/lang/Double.valueOf.
  • 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 发行版,Spark 工作负载可以获得大约 10%-42% 的加速。
有趣的是——来自另一个流行社交媒体平台 Twitter 的工程师分享了类似的旅程和类似的观察结果。在将他们的 Scala 工作负载转移到 GraalVM 之后,他们观察到显着的性能改进,例如由于 GraalVM 编译器将 P99 延迟降低了 19.9%。对于 Twitter 或 Facebook 等平台,此类性能改进会因平台规模而进一步增加。
 
黑客新闻网友讨论:
GraalVM 是一项了不起的技术,它支持许多新应用程序。Oracle 有勇气在这项研究上投入巨资,免费提供社区版,而企业版则要求非常合理的费用。诚然,定价模型有点复杂,但据我所知,这是该行业中相当普遍的定价模型。如果您以不允许的方式使用企业版,您将面临后果风险。
 
我的第一个问题是许可成本。这是费率:使用 GraalVM Enterprise 时,每个处理器每月 18 美元。是是底层硬件的CPU核,为运行工作负载的每个CPU核购买许可证,不管是否运行虚拟机。但是有改变:

  • Amazon EC2 和 RDS - 如果启用超线程,则两个 vCPU 相当于一个 Oracle 处理器许可证,如果未启用超线程,则一个 vCPU 相当于一个 Oracle 处理器许可证。
  • Microsoft Azure – 如果启用了超线程,则两个 vCPU 相当于一个 Oracle 处理器许可证,如果未启用超线程,则一个 vCPU 相当于一个 Oracle 处理器许可证。

 
这篇文章是由 GraalVM Developer Advocate 撰写的,从技术上讲它甚至不是 Facebook 撰写的。