关于jvm:JVM性能提升50聊一聊背后的秘密武器Alibaba-Dragonwell

4次阅读

共计 3863 个字符,预计需要花费 10 分钟才能阅读完成。

简介:你要晓得的对于 Alibaba Dragonwell 一些重要优化措施。

往年四月五日,阿里云凋谢了新一代 ECS 实例的邀测[1],Alibaba Dragonwell 也在新 ECS 上进行了极致的优化。相比于之前的 dragonwell_11.0.8.3 版本,行将公布的 dragonwell_11.0.11.6 在 SPECjbb2015[2] composite 模式测试中,零碎吞吐量 max-jOPS 晋升 55%,响应工夫束缚下的零碎吞吐量 critical-jOPS 晋升 602%。

如下图所示,图中数据做了归一化解决,以 11.0.8.3_GA 的 critical-jOPS 为 1 个基准单位。测试环境:阿里云 80 核,256g 内存 ECS 实例,操作系统为 Alinux3 [3]。


Alibaba Dragonwell

过来的十几年中,Java 在阿里巴巴外部迅猛发展。阿里内应用 Java 语言编写的利用越来越多,数万的 Java 开发者每年产出超过十亿行 Java 代码,这些代码都运行在阿里巴巴外部的 OpenJDK 定制版 AJDK 上。

Alibaba Dragonwell 是 AJDK 的开源版[4](github 链接见文章开端),应用和 OpenJDK 一样的 License,并永恒收费。Alibaba Dragonwell 有 8 和 11 两个版本,于 2019 年开源,过后仅反对 x86-64 架构,在 2020 年扩大到 AArch64 平台。

Alibaba Dragonwell 联合阿里在线电商、金融、物流等各个业务场景做了大量粗疏优化,增加了协程 / 多租户 /Jwarmup 等诸多自研个性,并且在阿里云超大规模的服务器集群上禁受了长时间大规模的验证。

调优计划与工具

因为 SPECjbb2015 动辄就须要两个小时能力失去一次残缺的跑分分数,为了压迫性能调优单位工夫内咱们所能取得的信息量和性能试验的效率,咱们开发了自动测试平台和性能剖析工具来辅助 SPECjbb2015 性能调优,并且这套办法能够用在将来更多相似的性能调优案例中。

自动测试平台能够主动发动测试,并且在测试过程中调用基于 perf 的性能剖析工具来采集 CPU 微架构数据以及零碎热点数据,从而收集到每次试验过程中的要害性能数据,并将数据存档以可视化界面的模式展示,不便将来回顾和剖析。

同时为了防止 SPECjbb2015 单次试验耗时长影响效率,跑性能试验时咱们采纳了 SPECjbb2015 非凡的 PRESET 模式。该模式下能够指定压力指定工夫来启动性能测试,不仅不便调优零碎进行性能采集,还能够察看在肯定压力下 SPECjbb2015 的零碎热点和微架构数据状况。

咱们通过该套调优零碎获取到了 Alibaba Dragonwell 和其余 JDK 在跑 SPECjbb2015 时的热点和微架构数据,并且发现了诸多优化机会,如在 GC 热点和暂停工夫上有较为显著的问题,从而深刻到相干代码,并以性能数据为线索解决了相干的性能问题,具体的技术细节将在下文中向大家一一道来。

GC 暂停工夫优化

这项优化源于一个出乎意料的发现,在 SPECjbb2015 中 GC 暂停工夫居然超过了总运行工夫的 20%,并且稳固复现。

通过上一大节中提到的调优零碎,定位到出问题的是一个 GC 工作队列相干函数,并且明确的指向了原子 Compare and Swap(CAS)相干代码。

新 ECS 采纳的 CPU 架构中 CAS 次要有如下的两种实现形式:

应用带 load-aquire 和 store-release 语义的指令对的实现形式
LSE 指令集中的 CAS 专项指令

少数 JVM 在 GC 中应用第一种办法,然而第二种在高抵触的状况下性能更加杰出,因而 Dragonwell 扭转了编译形式,应用 LSE 指令集实现 CAS,无效的缩小了暂停工夫。下图展现了优化成果,咱们采集了 SPECjbb2015 运行在不同核数上的 GC 数据,并采纳吞吐量作为掂量 GC 性能的指标。

吞吐量 = (运行工夫 – Stop-The-World 工夫)/ 运行工夫 * 100%

咱们能够看到优化前的 CAS 形式会造成吞吐量随应用的核数减少而激烈降落,在 80 核的状况下甚至有余 80%,而应用 LSE CAS 后吞吐量稳固在 99% 以上。

对这个优化的另外两点补充阐明:

  1. 此改变只针对 JVM 外部的 CAS 实现,不包含 JIT(Just-In-Time)生成的代码。JIT 会动静查看硬件个性,在反对 LSE 指令集的零碎上会优先应用 LSE 指令集。
  2. 除了应用 LSE CAS 外,扭转 GC 队列算法缩小 CAS 也能够达到缩小暂停工夫的成果,OpenJDK 社区在新版本中采纳了这种办法。不过两种方法并不抵触,Alibaba Dragonwell 同时采纳了两种优化,达到了最优成果。

疾速序列化

Alibaba Dragonwell 在保障兼容性根底上对 java 原生序列化进行了优化,通过缓存大幅提高了性能。通过剖析发现, 原生序列化瓶颈大多在于大量的 class 查找,如在反序列化时须要获取对端类定义的元信息等。引入了一层通过类全限定名和类加载器映射到 java 类对象的缓存,缩小了大量 Class.forName 的调用。

具体做法:在反序列化时获取到类描述符,再依据类描述符查找信息时将会受限从 classCache 中查找,命中则立刻返回,如果没有找到以后 classloader 和类全限定名惟一指定的类对象,将会走默认的类查找流程并且将后果缓存。同时, 在反序列化时会大量调用 latestUserDefinedLoader 来查找首个用户定义的类加载器,因为此过程较重(波及一次 JNI 调用和爬栈)也进行了缓存。

指令交融

指令交融是指将多个指令应用效率更高的一条或者几条指令进行替换从而进步性能。

Dragonwell 对内存屏障 / 内存读写 / 比拟跳转等多个场景做了优化,因为篇幅限度而且此类优化原理较为相似,在此仅举一例,三条指令交融成一条,如下图所示。

下面介绍了 Alibaba Dragonwell 外部的一些优化,上面咱们换一个角度,从参数调优方面介绍对 SPECjbb2015 的优化。

大内存零碎开启压缩指针

SPECjbb2015 是一个内存敏感型的测试,压缩指针对 SPECjbb2015 分数的晋升非常明显。不过默认状况下应用压缩指针最大只能用 32g 内存,这对 80 核的零碎来说切实是太小了。其实通过适当的参数组合,咱们齐全能够在更大的内存中应用压缩指针。

首先咱们理解下压缩指针的基本原理。如上图所示,因为 Java 对象有明确的对齐要求,因而对象的地址必然由数个 0 结尾,0 的个数由对齐位数决定。省略 java 对象地址结尾的数个 0 可解决内存而且不会失落无效地址信息,须要拜访对象时能够通过补 0 取得残缺的地址。

由此可知,咱们能够通过调整 Java 对象对齐位数管制压缩指针失效的最大内存。默认状况下 Java 为 8 字节对齐(3bit),加上压缩指针自身的的 32bit,最多只能示意 32g 内存。但如果调整为 32 字节对齐,那么有 37bit 能够应用,也就是 128g,这对于 80 核来说基本上够用了。

分层编译调优

分层编译是 JVM 最根底的机制之一,个别状况下对它改变比拟少,不过在 SPECjbb2015 的场景下,在分层编译上仍有调优空间。首先介绍下分层编译。JVM 在运行的时候动静的将字节码编译成机器码执行,JVM(hotspot)外部编译引擎次要有三个:

  • 解释器:无编译开销,但解释执行效率很低。
  • C1 编译器:编译开销较低,生成代码品质个别。
  • C2 编译器:生成代码品质很高,但编译开销很高。

这三个编译引擎相互配合,执行次数较少的代码由解释器和 C1 负责,C2 只编译热点代码,从而让 Java 能够达到峰值性能与编译开销的均衡,使利用运行更加平滑。

不过分层编译也有本人的毛病,一个较为显著的问题是它会增大生成代码的总量。下图展现 SPECjbb2015 运行时 C1/C2 编译办法数目。

图中 Level1- 3 均为 C1 编译,依据收集运行信息的力度不同分为了三个等级,Level4 为 C2 编译。咱们能够看到 C1 编译了 70% 的办法,因而敞开分层编译,仅保留 C2 编译器能够缩小生成代码,从而肯定水平上进步高速缓存和叶表命中率。

对于 SPECjbb2015 来说,因为分数只取决于最初几分钟的峰值解决能力,后面大略两个小时的申请俯冲阶段都能够视作预热,因而启动期的编译开销并不要害。咱们能够敞开分层编译来缩小生成代码,进步高速缓存和列表命中率。最终在测试中发现敞开分层编译生成代码总量由 29M 升高到 9M,有显著缩小。

本文总结了 Alibaba Dragonwell 的一些重要优化措施,请留神阿里承诺会继续的优化 Dragonwell 性能,同时更严密地和 OpenJDK 等开源社区合作,奉献更多的定制化个性,促成 Java 技术的继续倒退。

援用

[1] https://www.aliyun.com/daily-…
[2] SPECjbb2015 是一款模仿电商利用的权威基准测试程序,蕴含了购买下单、折扣优惠、库存计算、客户数据存储与剖析等典型电商利用行为:https://www.spec.org/jbb2015/
[3]Alinux3:Alibaba Cloud Linux 是阿里云推出的 Linux 发行版,它为云上应用程序环境提供 Linux 社区的最新加强性能,在提供云上最佳用户体验的同时,也针对阿里云基础设施做了深度的优化 https://help.aliyun.com/docum…
[4] Alibaba Dragonwell 是阿里巴巴开源 JDK:https://github.com/alibaba/dr…

原文链接
本文为阿里云原创内容,未经容许不得转载。

正文完
 0