注意:

使用 GraalVM Enterprise PGO 最佳化雲端原生 Java 應用系統

簡介

這個實驗室示範如何將 Java Microbenchmark Harness (JMH) 基準以原生可執行檔方式執行,並採用 GraalVM 原生映像檔建置,然後套用設定檔引導式最佳化 (PGO) 以提升效能。

GraalVM 原生影像可讓您將 Java 應用程式編譯成幾乎立即啟動的原生執行檔,所需的記憶體和 CPU 較少。

設定檔引導式最佳化 (PGO) 是 Java 生態系統中常用的技術,可降低遺漏的即時最佳化,並在一次收集執行設定檔,然後使用它們來最佳化後續編譯。使用 PGO 時,您可以收集分析資料,然後將資料饋送至 native-image 工具,這會使用此資訊進一步最佳化產生之執行檔的效能。

使用 JMH 搭配 GraalVM 原生影像的注意事項

在 JVM 上執行時,JMH 會針對每個基準建立新的 JVM,以確保每個基準的測量不會有干擾。使用 GraalVM 原生影像時無法使用此方法,因此在建置要以原生可執行檔執行的 JMH 基準時,請考量下列指導方針:

注意:Oracle Cloud Infrastructure (OCI) 提供 GraalVM Enterprise,無須額外付費。

實驗室目標

在此實驗室中,您將:

預估實驗室時間:30-45 分鐘

附註:如果您在說明中看到膝上型電腦圖示,則表示您需要輸入指令。留意一下吧。

# This is where we you will need to do something

若要複製指令,請將游標停留在欄位上,然後按一下複製到剪貼簿圖示。

若要在終端機視窗中貼上複製的指令,請在右鍵按一下,然後從內容功能表中選取 [ 貼上 ] 選項。如果您比較喜歡鍵盤快速鍵,請使用 CTRL+SHIFT+V

STEP 1 :連線至遠端主機並檢查開發環境

您的開發環境是由遠端主機所提供:OCI 運算執行處理與 Oracle Linux 8、4 CPU 及 32GB 的記憶體。

桌面環境會在遠端主機準備就緒之前顯示,最多可能需要 2 分鐘。

Visual Studio 程式碼 (VS 代碼) 會開啟並自動連線至為您佈建的 VM 執行處理。按一下繼續 (Continue) 以接受機器指紋。

接受 VS 代碼

如果您沒有按一下繼續 (Continue) ,VS Code 將會顯示一個對話方塊,如下所示。按一下重試。VS Code 將要求您接受這台機器的指紋。然後按一下繼續

VS 程式碼重試連線

連線遠端開發環境的問題

若發生任何「VS 程式碼」無法連線至以上未涵蓋的遠端開發環境的問題,請嘗試下列動作:

恭喜,您現在已連線至 Oracle Cloud 的遠端主機!

指令碼將開啟連接您遠端主機的 VS 代碼,並開啟實驗室的原始碼。

接著,在 VS Code 中開啟一個終端機。您可以使用「終端機」與遠端主機互動。可透過功能表以「VS 代碼」開啟終端機:終端機 > 新終端機,如下所示。

VS 代碼終端機

開發環境附註

您將使用 GraalVM Enterprise 作為此實驗室的 Java 程式實際執行環境。GraalVM 是 Oracle 建立在 Oracle Java SE 上的高效能 JDK 發行版。
您的開發環境已預先設定了此實驗室所需的 GraalVM 企業版和原生映像檔工具。您可以在終端機中執行以下指令,檢查:

java -version

native-image --version

您可以繼續下一個步驟。

STEP 2: 在 JVM 上編譯和執行 JMH 基準

應用程式的原始碼 - JMH 基準 - 可在您的遠端主機上使用。JMH 基準源自電腦語言基準遊戲。它會建立二進位樹狀目錄,在收集任何樹狀目錄節點之前 - 最少使用配置數。

此 JMH 基準使用 Java 反射。native-image 工具會以稱為「封閉式世界」的假設運作,且不會在原生可執行檔中包含任何反射存取的元素,除非該工具在建置時提供了必要的組態。因此,若要建立此 JMH 基準的原生執行檔,您必須執行追蹤代理程式,將反映組態提供給 native-image。這已經為您完成以節省時間,可以在 src/main/resources/META-INF/native-image/ 中找到產生的組態。如需有關反映組態的詳細資訊,請參閱 GraalVM 原生影像與反射上的「Luna Lab」。

建置並執行基準作為 Java 應用程式,然後執行下列命令:

mvn clean package exec:exec

請注意,在 pom.xml 檔案中,您可以使用選項 -XX:-UseJVMCICompiler 明確關閉 GraalVM JIT 編譯器的指示。這表示基準將會使用 C2 JIT 編譯器執行。

應用程式會以三個反覆方式執行基準,並在終端機中顯示結果。執行需要不到四分鐘的時間才能完成。最終結果是最重要的。您應該會看到一些像:

Benchmark          (binaryTreesN)   Mode  Cnt    Score   Error  Units
BinaryTrees.bench              14  thrpt    3  180.819 ± 8.301  ops/s

您現在可以繼續進行下一個步驟。

STEP 3:建置 JMH 基準並執行原始執行檔

現在,使用 GraalVM Enterprise Native Image 建置原生執行檔。

JMH 基準是以 Maven 建立,並套用 GraalVM 原生映像檔建置版本的 Maven Plugin (開啟 pom.xml 以查看 native-maven-plugin Plugin 註冊)。外掛程式顯示需要將哪些 JAR 檔案傳送到 native-image,以及可執行的主要類別。

  1. 建立原生執行檔。組建需要大約一分鐘的時間:

    mvn package -Pnative
    

    -Pnative Maven 設定檔開啟了建立原生執行檔。它會在 target 目錄中產生名為 benchmark-binary-tree 的原生執行檔。

  2. 然後將基準作為原生執行檔來執行:

    ./target/benchmark-binary-tree
    

    這些是使用 GraalVM Enterprise Native Image 22.2.0 取得的結果:

    Benchmark          (binaryTreesN)   Mode  Cnt    Score    Error  Units
    BinaryTrees.bench              14  thrpt    3  174.135 ± 10.020  ops/s
    

    相較於先前的 (非原生) 選項,原生的可執行檔編號可能類似或更佳。其結果將根據您執行相同基準的硬體而有所不同。

您現在可以繼續進行下一個步驟。

STEP 4 :使用 PGO 最佳化原生執行檔並執行

現在使用設定檔引導式最佳化 (PGO) 將您的原生執行檔最佳化。這是兩個步驟的程序。首先,建立原生執行檔的工具版本,然後執行該版本以追蹤執行並收集效能設定檔。執行完成後,會在專案的根目錄中產生設定檔 default.iprof 。接著建立一個包含基準設定檔資料的最佳化執行檔,然後執行它。

GraalVM Enterprise Edition 提供設定檔導引式最佳化 (PGO) 功能。

  1. 通過 -Pinstrumented Maven 設定檔建立儀表的原生執行檔:

    mvn package -Pinstrumented
    

    它會在 target 目錄中產生一個名為 benchmark-binary-tree-instr 的二進位檔案。

  2. 執行此程式可收集程式碼執行頻率設定檔:

    ./target/benchmark-binary-tree-instr
    

    如果沒有另外指定,從此執行收集到的設定檔會儲存在目前工作目錄中的 default.iprof 檔案中。

    注意:您可以在程式實際執行時傳送 -XX:ProfilesDumpFile=YourFileName 選項,指定在執行工具原生執行檔時收集設定檔的位置。您也可以指定不同的名稱來收集多個設定檔,並在建立時將它們傳送至 native-image 工具。

  3. 現在您已產生設定檔,請建置最佳化版本:

    mvn package -Poptimized
    

    它會在 target 目錄中產生最佳化的二進位檔,稱為 benchmark-binary-tree-opt

  4. 最後,執行最佳化原生執行檔:

    ./target/benchmark-binary-tree-opt
    

這些是在主機機器上使用 GraalVM Enterprise Native Image 22.2.0 取得的結果:

Benchmark          (binaryTreesN)   Mode  Cnt    Score   Error  Units
BinaryTrees.bench              14  thrpt    3  223.241 ± 3.578  ops/s

每秒平均作業分數從以 Java 應用程式形式執行的 180 增加到以最佳化原生執行檔形式執行的 223。其結果將根據您執行相同基準的硬體而有所不同。

摘要

此實驗室顯示如何使用「設定檔引導式最佳化 (PGO)」將原生執行檔最佳化,以取得與 Java 版本比較的更高傳輸量,同時仍保留其他優點:即時啟動、較低的 CPU 和記憶體使用量。有了 PGO,您便可以針對特定工作負載「訓練」您的應用系統,然後將其轉換成最佳化的二進位檔,而無須影響任何效能。

深入瞭解

恭喜!您已成功完成此實驗室。

其他學習資源

探索 docs.oracle.com/learn 的其他實驗室,或者存取更多 Oracle Learning YouTube 頻道上的免費學習內容。此外,請瀏覽 education.oracle.com/learning-explorer 以成為 Oracle Learning 檔案總管。

如需產品文件,請造訪 Oracle Help Center