概述
在過去的十年中,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 和 AmpereAltraMax 處理器從頭開始為云而設計,為云原生應用提供可預測的性能、高可擴展性和出色的電源效率。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)。
表 1:OpenJDK LTS
03如何構建 OPENJDK?
Linux 發行版提供了不同的方式來安裝 OpenJDK,例如 yum 存儲庫用于 RHEL 和 CentOS, apt 存儲庫用于 Ubuntu 或 Debian。
對于自定義構建 OpenJDK,本節列出了如何從源代碼構建 OpenJDK 的推薦步驟。
在構建 OpenJDK 時建議使用 GCC。不同的 GCC 版本有不同的 AArch64 選項,如表 2 所示。
表 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 所示:
表 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 版本。
表 4:JDK Providers and GCC Versions
使用 SPECjbb2015 Composite Max-jOPS 作為性能指標,以 centos 提供的 JDK8 數據作為基線,圖 1 顯示了來自不同來源的 JDK8 和 JDK11 的性能。
圖 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%。
圖 2:Performance Across OpenJDK Versions
表 4 列出并比較了不同 JDK 版本上特定于 aarch64 的 OpenJDK 選項。使用此命令可以獲取這些選項:
java -XX:+PrintFlagsFinal -version
表 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。
審核編輯:湯梓紅
-
處理器
+關注
關注
68文章
19852瀏覽量
234153 -
Linux
+關注
關注
87文章
11496瀏覽量
213230 -
JAVA
+關注
關注
20文章
2988瀏覽量
108257 -
編程語言
+關注
關注
10文章
1955瀏覽量
36384 -
Ampere
+關注
關注
1文章
81瀏覽量
4688
原文標題:安博士講堂 | 優化指南-釋放 Java 更高性能
文章出處:【微信號:AmpereComputing,微信公眾號:安晟培半導體】歡迎添加關注!文章轉載請注明出處。
發布評論請先 登錄
評論