优化指南:释放Java更高性能

描述

概述

在过去的十年中,Java 已经成为最流行的云编程语言之一。Hadoop、Cassandra 和 Kafka 等流行的云应用程序都使用 Java 语言和框架。Java 是一种通用的面向对象语言,被设计为 Write Once Run Anywhere,它依赖于一个 Java 虚拟机(JVM)来将字节码转换为特定应用程序所运行的体系结构的机器代码。显然,JVM 在运行时生成的代码质量对应用程序性能至关重要。

本指南描述了在 Ampere Altra 系列处理器上的 Java 支持状态,提供了一种构建 OpenJDK 的方法,并比较了不同 OpenJDK 版本和二进制源代码的性能。

01Ampere Altra 系列处理器和 AARCH64 架构支持 JAVA 吗?

OpenJDK 是官方的参考 JVM 实现。OpenJDK 是自由开源软件(FOSS),被大多数 Java 开发人员使用,并且是大多数 Linux 发行版的默认 JVM。AArch64 移植已经是 OpenJDK 项目的一部分了(见下方网址)。今天,从Java Development Kit 8 (JDK8)开始,OpenJDK 在 AArch64 上得到了很好的支持。

Ampere Altra 和 Ampere Altra Max 处理器从头开始为云而设计,为云原生应用提供可预测的性能、高可扩展性和出色的电源效率。Ampere Altra 计算核心采用 ARMv8 指令集架构(ISA),支持 AArch64 和 AArch32 指令集。目前,各种 Linux 发行版中包含的 jdk 都支持 Ampere Altra 家族处理器,但 JDK17 等较新的长期支持(LTS)版本可以提供明显更好的性能。

02从哪里可以获取 OPENJDK?

用于 Ampere Altra 系列处理器的 OpenJDK 二进制文件可以从几个来源获得。Linux 发行版通过各自的包存储库提供 OpenJDK。Adoptium 是预构建 OpenJDK AArch64 二进制文件的另一个来源。

OpenJDK 有许多发布版本,但只有表 1 中列出的版本具有 LTS 发布限定符(LTS release qualifier)。不同的 OpenJDK 发行版可能提供表1所示的生命终止日期(End of Life)。

JAVA

表 1:OpenJDK LTS

03如何构建 OPENJDK?

Linux 发行版提供了不同的方式来安装 OpenJDK,例如 yum 存储库用于 RHEL 和 CentOS, apt 存储库用于 Ubuntu 或 Debian。

对于自定义构建 OpenJDK,本节列出了如何从源代码构建 OpenJDK 的推荐步骤。

在构建 OpenJDK 时建议使用 GCC。不同的 GCC 版本有不同的 AArch64 选项,如表 2 所示。

JAVA

表 2:GCC Options

构建 OpenJDK 用到了一下配置和选项:

 

bash configure --with-alsa=/usr --with-alsa-lib=/usr/lib64 --with-cacerts-file=/etc/pki/java/cacerts --with-cups=/usr --with-debug-level=release --with-native-debug-symbols=none --with-extra-cflags="-pipe -fPIC -DPIC -Wl,-rpath=/usr/lib64 -L/usr/lib64 -mcpu=neoverse-n1" --with-extra-cxxflags="-pipe -fPIC -DPIC -Wl,-rpath=/usr/lib64 -L/usr/lib64 -mcpu=neoverse-n1" --with-extra-ldflags="-Wl,-rpath=/usr/lib64 -L/usr/lib64" --with-stdc++lib=dynamic --with-target-bits=64 --with-zlib=system --x-includes=/usr/include --x-libraries=/usr/lib64 --with-boot-jdk= --prefix= 
make images 
make install

 

04性能的影响因素

让我们来评估一些通过基本调优就可能实现的性能改进。我们在基于 Ampere Altra q80 -30 的服务器上使用 SPECjbb2015,这是一种在复合模式下流行的标准化 Java 基准测试。系统配置如表 3 所示:

JAVA

表 3:System Configuration

评估中使用了如下的 OpenJDK 选项:

 

-Xms130560m -Xmx130560m -Xmn123g -XX:SurvivorRatio=39 -XX:ObjectAlignmentInBytes=32 -XX:TargetSurvivorRatio=95 -XX:+UseCompressedOops -XX:+UseCompressedClassPointers -XX:MetaspaceSize=64m -server -XX:+AlwaysPreTouch -XX:-UseAdaptiveSizePolicy -XX:-UseCountedLoopSafepoints -XX:-UsePerfData -XX:+PrintFlagsFinal -XX:+UseTransparentHugePages -XX:+UseParallelGC -XX:ParallelGCThreads=80 -XX:AllocatePrefetchDistance=512 -XX:AllocatePrefetchLines=4 -XX:InlineSmallCode=2k -XX:TypeProfileWidth=4 -XX:SoftwarePrefetchHintDistance=128 -XX:+AvoidUnalignedAccesses -XX:BlockZeroingLowLimit=64K -XX:+UseBlockZeroing -XX:-UseSIMDForArrayEquals -XX:+UseSIMDForMemoryOps

 

这些是 SPECjbb 的属性:

 

-Dspecjbb.customerDriver.threads=64 -Dspecjbb.customerDriver.threads.service=64 -Dspecjbb.customerDriver.threads.probe=64 -Dspecjbb.customerDriver.threads.saturate=96 -Dspecjbb.forkjoin.workers=80 -Dspecjbb.forkjoin.workers.Tier1=80 -Dspecjbb.forkjoin.workers.Tier2=1 -Dspecjbb.forkjoin.workers.Tier3=16 -Dspecjbb.comm.connect.selector.runner.count=4 -Dspecjbb.controller.type=HBIR_RT -Dspecjbb.controller.port=24000 

 

*注*:我们的测试并不是为了达到绝对的最佳性能,而是为了研究使用不同的编译器选项和版本来提高性能。

以下是相同 OpenJDK 版本的三个源代码:

CentOS repository

Adoptium prebuilt binary

Self-built binary

使用“如何构建 OpenJDK”一节中描述的方法从 Adoptium 源代码构建自建(self-built)二进制文件。表 4 列出了用于这些二进制文件的 JDK 提供程序和 GCC 版本。

JAVA

表 4:JDK Providers and GCC Versions

使用 SPECjbb2015 Composite Max-jOPS 作为性能指标,以 centos 提供的 JDK8 数据作为基线,图 1 显示了来自不同来源的 JDK8 和 JDK11 的性能。

JAVA

图 1:SPECjbb2015 JDK8 and JDK11 Performance

 from Various Sources

对于特定的 OpenJDK 版本,最新的 centos 提供的二进制文件、Adoptium 二进制文件和自构建(self-built)二进制文件的性能相似,这表明 OpenJDK 社区对 AArch64 和 Ampere Altra 系列处理器的支持已经非常友好。

比较来自同一源代码(centos 提供的二进制)的不同 OpenJDK 版本,OpenJDK17 是 Ampere Altra 系列处理器上性能最好的版本。图 2 显示,从 JDK8 到 JDK11, Max-jOPS 提高了 6%,从 JDK8 到 JDK17 提高了 12%。

JAVA

图 2:Performance Across OpenJDK Versions

表 4 列出并比较了不同 JDK 版本上特定于 aarch64 的 OpenJDK 选项。使用此命令可以获取这些选项:

 

java -XX:+PrintFlagsFinal -version

 

JAVA

表 5:OpenJDK AArch64 options

因为 Ampere Altra 系列处理器功能上已经支持了原子操作和 crc32 的实现,在使用 Altra 和 Altra Max 处理器的进行性能评估时,UseLSE 和 UseCRC32 选项会自动启用。

这意味着,即使没有像“-march=armv8.2-a”或“-mcpu=neoverse-n1”这样的编译选项,OpenJDK 也可以为 Ampere Altra 系列处理器生成优化的代码。

结论

OpenJDK 是 Java 平台的自由/开源软件实现,是云计算中实际使用的 JDK。在本文中,我们看到 OpenJDK  可以无缝地移植到 Ampere Altra 系列处理器上,并且在其上有着非常出色的性能。OS 发行版和 Adoptium 提供的最新预构建( pre-built)二进制文件的性能与从源代码构建 JDK 一样。也就是说,使用最新的OpenJDK LTS 版本 17 就可以获得更高的性能。像往常一样,我们建议使用更新版本的 GCC 编译器和针对体系架构的选项从源代码构建 OpenJDK。

审核编辑:汤梓红

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分