概述
在過去的十年中,Java 已經(jīng)成為最流行的云編程語言之一。Hadoop、Cassandra 和 Kafka 等流行的云應(yīng)用程序都使用 Java 語言和框架。Java 是一種通用的面向?qū)ο笳Z言,被設(shè)計(jì)為 Write Once Run Anywhere,它依賴于一個(gè) Java 虛擬機(jī)(JVM)來將字節(jié)碼轉(zhuǎn)換為特定應(yīng)用程序所運(yùn)行的體系結(jié)構(gòu)的機(jī)器代碼。顯然,JVM 在運(yùn)行時(shí)生成的代碼質(zhì)量對應(yīng)用程序性能至關(guān)重要。
本指南描述了在 Ampere Altra 系列處理器上的 Java 支持狀態(tài),提供了一種構(gòu)建 OpenJDK 的方法,并比較了不同OpenJDK 版本和二進(jìn)制源代碼的性能。
01Ampere Altra 系列處理器和AARCH64架構(gòu)支持 JAVA 嗎?
OpenJDK 是官方的參考 JVM 實(shí)現(xiàn)。OpenJDK 是自由開源軟件(FOSS),被大多數(shù) Java 開發(fā)人員使用,并且是大多數(shù) Linux 發(fā)行版的默認(rèn) JVM。AArch64 移植已經(jīng)是 OpenJDK 項(xiàng)目的一部分了(見下方網(wǎng)址)。今天,從Java Development Kit 8 (JDK8)開始,OpenJDK 在 AArch64 上得到了很好的支持。
Ampere Altra 和 AmpereAltraMax 處理器從頭開始為云而設(shè)計(jì),為云原生應(yīng)用提供可預(yù)測的性能、高可擴(kuò)展性和出色的電源效率。Ampere Altra 計(jì)算核心采用 ARMv8 指令集架構(gòu)(ISA),支持 AArch64 和 AArch32 指令集。目前,各種 Linux 發(fā)行版中包含的 jdk 都支持 Ampere Altra 家族處理器,但 JDK17 等較新的長期支持(LTS)版本可以提供明顯更好的性能。
02從哪里可以獲取 OPENJDK?
用于 Ampere Altra 系列處理器的 OpenJDK 二進(jìn)制文件可以從幾個(gè)來源獲得。Linux 發(fā)行版通過各自的包存儲庫提供 OpenJDK。Adoptium 是預(yù)構(gòu)建 OpenJDK AArch64 二進(jìn)制文件的另一個(gè)來源。
OpenJDK 有許多發(fā)布版本,但只有表 1 中列出的版本具有 LTS 發(fā)布限定符(LTS release qualifier)。不同的 OpenJDK 發(fā)行版可能提供表1所示的生命終止日期(End of Life)。
表 1:OpenJDK LTS
03如何構(gòu)建 OPENJDK?
Linux 發(fā)行版提供了不同的方式來安裝 OpenJDK,例如 yum 存儲庫用于 RHEL 和 CentOS, apt 存儲庫用于 Ubuntu 或 Debian。
對于自定義構(gòu)建 OpenJDK,本節(jié)列出了如何從源代碼構(gòu)建 OpenJDK 的推薦步驟。
在構(gòu)建 OpenJDK 時(shí)建議使用 GCC。不同的 GCC 版本有不同的 AArch64 選項(xiàng),如表 2 所示。
表 2:GCC Options
構(gòu)建 OpenJDK 用到了一下配置和選項(xiàng):
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性能的影響因素
讓我們來評估一些通過基本調(diào)優(yōu)就可能實(shí)現(xiàn)的性能改進(jìn)。我們在基于 Ampere Altra q80 -30 的服務(wù)器上使用 SPECjbb2015,這是一種在復(fù)合模式下流行的標(biāo)準(zhǔn)化 Java 基準(zhǔn)測試。系統(tǒng)配置如表 3 所示:
表 3:System Configuration
評估中使用了如下的 OpenJDK 選項(xiàng):
-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
*注*:我們的測試并不是為了達(dá)到絕對的最佳性能,而是為了研究使用不同的編譯器選項(xiàng)和版本來提高性能。
以下是相同 OpenJDK 版本的三個(gè)源代碼:
CentOS repository
Adoptium prebuilt binary
Self-built binary
使用“如何構(gòu)建 OpenJDK”一節(jié)中描述的方法從 Adoptium 源代碼構(gòu)建自建(self-built)二進(jìn)制文件。表 4 列出了用于這些二進(jìn)制文件的 JDK 提供程序和 GCC 版本。
表 4:JDK Providers and GCC Versions
使用 SPECjbb2015 Composite Max-jOPS 作為性能指標(biāo),以 centos 提供的 JDK8 數(shù)據(jù)作為基線,圖 1 顯示了來自不同來源的 JDK8 和 JDK11 的性能。
圖 1:SPECjbb2015 JDK8 and JDK11 Performance
from Various Sources
對于特定的 OpenJDK 版本,最新的 centos 提供的二進(jìn)制文件、Adoptium 二進(jìn)制文件和自構(gòu)建(self-built)二進(jìn)制文件的性能相似,這表明 OpenJDK 社區(qū)對 AArch64 和 Ampere Altra 系列處理器的支持已經(jīng)非常友好。
比較來自同一源代碼(centos 提供的二進(jìn)制)的不同 OpenJDK 版本,OpenJDK17 是 Ampere Altra 系列處理器上性能最好的版本。圖 2 顯示,從 JDK8 到 JDK11, Max-jOPS 提高了 6%,從 JDK8 到 JDK17 提高了 12%。
圖 2:Performance Across OpenJDK Versions
表 4 列出并比較了不同 JDK 版本上特定于 aarch64 的 OpenJDK 選項(xiàng)。使用此命令可以獲取這些選項(xiàng):
java -XX:+PrintFlagsFinal -version
表 5:OpenJDK AArch64 options
因?yàn)?Ampere Altra 系列處理器功能上已經(jīng)支持了原子操作和 crc32 的實(shí)現(xiàn),在使用 Altra 和 Altra Max 處理器的進(jìn)行性能評估時(shí),UseLSE 和 UseCRC32 選項(xiàng)會自動(dòng)啟用。
這意味著,即使沒有像“-march=armv8.2-a”或“-mcpu=neoverse-n1”這樣的編譯選項(xiàng),OpenJDK 也可以為 Ampere Altra 系列處理器生成優(yōu)化的代碼。
結(jié)論
OpenJDK 是 Java 平臺的自由/開源軟件實(shí)現(xiàn),是云計(jì)算中實(shí)際使用的 JDK。在本文中,我們看到 OpenJDK 可以無縫地移植到 Ampere Altra 系列處理器上,并且在其上有著非常出色的性能。OS 發(fā)行版和 Adoptium 提供的最新預(yù)構(gòu)建( pre-built)二進(jìn)制文件的性能與從源代碼構(gòu)建 JDK 一樣。也就是說,使用最新的OpenJDK LTS 版本 17 就可以獲得更高的性能。像往常一樣,我們建議使用更新版本的 GCC 編譯器和針對體系架構(gòu)的選項(xiàng)從源代碼構(gòu)建 OpenJDK。
審核編輯:湯梓紅
-
處理器
+關(guān)注
關(guān)注
68文章
19740瀏覽量
232872 -
Linux
+關(guān)注
關(guān)注
87文章
11420瀏覽量
212319 -
JAVA
+關(guān)注
關(guān)注
20文章
2983瀏覽量
106499 -
編程語言
+關(guān)注
關(guān)注
10文章
1952瀏覽量
35742 -
Ampere
+關(guān)注
關(guān)注
1文章
80瀏覽量
4638
原文標(biāo)題:安博士講堂 | 優(yōu)化指南-釋放 Java 更高性能
文章出處:【微信號:AmpereComputing,微信公眾號:安晟培半導(dǎo)體】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
TI高性能模擬器件在大學(xué)生創(chuàng)新設(shè)計(jì)中的應(yīng)用及選型指南
詳解java代碼優(yōu)化方法
HBase性能優(yōu)化方法總結(jié)
MSP430FRx MCU如何實(shí)現(xiàn)更高性能
針對于Java的35 個(gè)代碼性能優(yōu)化總結(jié)
嵌入式Java虛擬機(jī)的性能優(yōu)化技術(shù)
關(guān)于java性能優(yōu)化的一些細(xì)節(jié)
AutoKernel高性能算子自動(dòng)優(yōu)化工具
大數(shù)據(jù)Java優(yōu)化
使用Arthas火焰圖工具的Java應(yīng)用性能分析和優(yōu)化經(jīng)驗(yàn)

評論