Blog chevron_right 未分类

采用 Azul Platform Prime,为 Java 提供长期记忆

Java 虚拟机 (JVM) 在许多方面和电影《记忆碎片》中的主角十分类似。影片中的男主角没有短期记忆。他每隔十分钟左右就会醒来一次,不知道自己之前在做什么、周围在发生什么情况,且必须根据周围的环境和身上的纹身线索将事情拼凑起来。

所有 JVM 的运行过程与这一点都有些相似,尤其是在 JIT 编译和预热方面。JVM 几乎不知道上次运行时它操作过什么。它也不知道周围的其他 JVM 在执行什么任务。它必须根据所掌握的线索来找出如何优化正在运行的代码,即以缓慢的解释模式运行应用程序,同时构建热方法和虚拟机 (VM) 状态的配置文件。

所以,JVM 醒来后会问:“我正在做什么?我猜我正在运行这个叫做 Kafka 的东西。但我从来没听说过它啊!我最好是以解释器模式运行,并弄清楚这里有哪些重要的方法。”即使 JVM 及其容器化兄弟之前已经把 Kafka 运行过一百次了,这样的场景还是会发生。

A JVM wakes up and says, "Where am I?"
JVM 醒来后问道:“我在哪儿?”

这些跟我有什么关系?这带来的影响有: 

  • 预热慢 这会使 JVM 加速的速度变慢,从而导致 VM 的最终用户体验变差。无论您是要扩展游戏引擎实例以满足玩家需求高峰,还是要在大促销期间扩展购物车实例,如果用户使用的 JVM 尚未预热,用户的体验会变差,而且他们更有可能会离开。 
  • CPU 出现峰值 若 JVM 想要同时处理 JIT 优化和应用程序逻辑,就会导致长时间出现 CPU 高峰值。这可能会严重损坏负载均衡器和自动扩缩器的功能。 
  • 有延迟 由于传统 JIT 只针对它现在看到的内容而不是 JVM 整个生命周期中可能看到的内容进行优化,因此您更有可能会遇到去优化的大问题,从而导致出现延迟异常情况。
  • 产生操作难题 因为工程团队必须使用“伪”事务和其他技巧来手动预热 JVM,所以这会带来操作难题,最终会导致用户不太愿意在需要的时候通过精确扩展资源来积极利用云弹性。 
  • 成本高 终有一天,要解决上面列出的所有问题,就必须过度配置资源并减少弹性扩展,以弥补 Java 缓慢的预热曲线,从而需要花费更多费用。 

“Java 的预热问题长期以来一直是确保应用程序峰值性能所需要面对的一大难题,”451 Research 研究总监 William Fellows 如是说。“组织应该考虑如何通过自动选择基于容器的应用程序的最佳优化模式,来减少操作摩擦,同时提高弹性,以便控制云成本。”(1)

Azul Platform Prime 是 Azul 的 OpenJDK 优化版本,包括一项名为 ReadyNow 的技术,可记录 JVM 运行时所有必要的性能分析信息,以便在下次运行时,JVM 能拥有所需的全部信息,进而跳过性能分析阶段并立即开始编译。只要有机会,JVM 就会在主方法执行之前编译多种方法。只要应用程序一“接触”到该方法,且 JVM 拥有执行编译所需的状态信息,JVM 就会继续执行编译。

ReadyNow Latency Line Chart

Azul 一直在致力于构建云原生 JVM 的概念。云原生 JVM 不是孤立存在 的 JVM,它可以:

  • 通过学习其他 JVM 运行某组代码的经验,与云中运行的其他 JVM 进行协作 
  • 充分利用云原生服务,将过去在本地完成的工作转移到专门的(且更好的)服务上 
  • 充分利用云的弹性,在需要时提供更多资源,并在不需要时将其缩减到接近零,与仅使用本地资源处理所有这些任务相比,可带来更高的价值和成本效益  

我们针对云原生 JVM 研发的第一个产品是Cloud Native Compiler,该产品会将 JIT 编译工作转移到专用硬件上,并可以利用之前编译的缓存来节省 JVM 预热的时间和资源。 

今天,我们将发布可支持云原生 JVM 的后续服务:ReadyNow Orchestrator。首先,我们消除了使用 ReadyNow 时的许多操作摩擦。在过去,您必须手动保存 ReadyNow 配置文件来更改部署过程,以便 JVM 启动时可以使用保存的配置文件。而现在,ReadyNow Orchestrator 可直接处理 ReadyNow 配置文件的读取和写入任务。您只需要提供几个命令行参数,RNO 就会自动记录来自多个 JVM 的 ReadyNow 配置文件,并在新的 JVM 请求配置文件时,为其选择最好的一个。

同样重要的是,ReadyNow 配置文件已经过优化,可与 Cloud Native Compiler 搭配使用,尤其是还能使用之前编译的服务器端缓存。若将 ReadyNow 配置文件与 CNC 编译器搭配使用,您不仅可以记住 JVM 需要哪些编译,还可以从 CNC 缓存中提取更多的编译,而无需再次进行编译。所带来的效果是,您能够更快加速,并降低用于提供编译的基础设施成本。 

现在,我们的全套云原生 JVM 服务已根据 Optimizer Hub 框架进行打包。Optimizer Hub 是 Azul Platform Prime 的一个组件。所有 Azul Platform Prime 客户都可以免费使用该组件,无需额外许可或签署其他合同。Azul Optimizer Hub 将作为 Kubernetes 集群进行分发,您可以在云端或本地环境中进行配置和维护。

1 《应用程序现代化:需要一个(云)村》,S&P Global Market Intelligence 旗下的 451 Research,2022 年

在配置文件方面遇到了难题?

可以让 ReadyNow Orchestrator 为 JVM 自动选择配置文件。