참고:

GraalVM Enterprise PGO를 사용하여 클라우드 네이티브 Java 애플리케이션 최적화

소개

이 실습에서는 JMH(Java Microbenchmark Harness) 벤치마크를 GraalVM Native Image로 구축된 고유 실행 파일로 실행하고 PGO(프로파일 안내식 최적화)를 적용하여 성능을 향상시키는 방법을 보여줍니다.

GraalVM 네이티브 이미지를 사용하면 Java 애플리케이션을 거의 즉각적으로 시작하여 메모리 및 CPU를 줄이는 네이티브 실행 파일로 컴파일할 수 있습니다.

PGO(Profile-Guided Optimization)는 누락된 적시 최적화를 완화하고 한 번의 실행 프로파일을 수집한 다음 후속 컴파일을 최적화하는 데 사용하기 위해 Java 에코시스템에서 일반적으로 사용되는 기술입니다. PGO를 사용하면 프로파일링 데이터를 수집하여 native-image 도구에 공급할 수 있습니다. 이 도구는 이 정보를 사용하여 결과 실행 파일의 성능을 더욱 최적화합니다.

GraalVM 고유 이미지와 함께 JMH 사용에 대한 참고 사항

JVM에서 실행할 때 JMH는 각 벤치마크에 대한 새로운 JVM을 포크하여 각 벤치마크의 측정에 간섭이 없도록 합니다. 이 접근 방법은 GraalVM 네이티브 이미지를 사용할 때는 불가능하므로 네이티브 실행 파일로 실행될 JMH 벤치마크를 구축할 때 다음 지침을 고려해야 합니다.

참고: OCI(Oracle Cloud Infrastructure)는 추가 비용 없이 GraalVM 엔터프라이즈를 제공합니다.

실험 목표

이 실습에서는 다음을 수행합니다.

예상 실습 시간: 30-45분

참고: 지침에 랩톱 아이콘이 표시되면 명령을 입력해야 합니다. 그것을 위해 눈을 떼십시오.

# This is where we you will need to do something

명령을 복사하려면 필드 위로 마우스를 가져간 다음 클립보드에 복사 아이콘을 누릅니다.

복사된 명령을 터미널 창에 붙여넣으려면 마우스 오른쪽 버튼을 누르고 컨텍스트 메뉴에서 Paste 옵션을 선택합니다. 대신 키보드 단축키를 사용하려면 CTRL+SHIFT+V를 사용합니다.

STEP 1: 원격 호스트에 연결하고 개발 환경을 확인합니다.

개발 환경은 원격 호스트(Oracle Linux 8, 4 CPU 및 32GB 메모리가 있는 OCI 컴퓨트 인스턴스)에서 제공합니다.

원격 호스트가 준비되기 전에 데스크탑 환경이 표시됩니다. 이 작업은 최대 2분이 걸릴 수 있습니다.

VS(Visual Studio Code)가 열리고 프로비전된 VM 인스턴스에 자동으로 접속됩니다. Continue를 눌러 시스템 지문을 수락합니다.

VS 코드 수락

계속을 누르지 않으면 아래 표시된 대화 상자가 VS Code에 팝업됩니다. 재시도를 클릭하십시오. VS Code에서는 머신 지문을 수락하도록 요청합니다. 그런 다음 계속을 누릅니다.

VS 코드 재시도 연결

원격 개발 환경에 연결 관련 문제

위에서 다루지 않는 원격 개발 환경에 VS 코드가 연결되지 않는 다른 문제가 발생할 경우 다음을 시도하십시오.

축하합니다, 이제 Oracle Cloud에서 원격 호스트로 연결되었습니다!

스크립트는 원격 호스트에 연결된 VS Code를 열고 lab 소스 코드를 엽니다.

그런 다음 VS 코드 내에서 터미널을 엽니다. 터미널을 사용하면 원격 호스트와 상호 작용할 수 있습니다. 아래와 같이 Terminal > New Terminal 메뉴를 통해 VS Code에서 터미널을 열 수 있습니다.

VS 코드 터미널

개발 환경 참고

이 실습에서는 GraalVM Enterprise를 Java 런타임 환경으로 사용합니다. GraalVM는 Oracle Java SE를 기반으로 구축된 Oracle의 고성능 JDK 배포판입니다.
개발 환경은 GraalVM Enterprise 및 이 실습에 필요한 네이티브 이미지 툴로 사전 구성되어 있습니다. 터미널에서 다음 명령을 실행하여 확인할 수 있습니다.

java -version

native-image --version

다음 단계를 계속할 수 있습니다.

STEP 2: JVM에서 JMH 벤치마크 컴파일 및 실행

응용 프로그램의 소스 코드인 JMH 벤치마크는 원격 호스트에서 사용할 수 있습니다. JMH 벤치마크는 컴퓨터 언어 벤치마크 게임에서 비롯됩니다. 트리 노드가 불필요하게 수집되기 전에 최소 할당 수를 사용하여 이진 트리를 생성합니다.

이 JMH 벤치마크는 Java 리플렉션을 사용합니다. native-image 도구는 "닫힌 세계" 가정으로 작동하며 빌드 시 필요한 구성이 도구에 제공되지 않는 한 기본 실행 파일에 반사적으로 액세스된 요소를 포함하지 않습니다. 따라서 이 JMH 벤치마크의 고유 실행 파일을 빌드하려면 Tracing Agent를 실행하여 리플렉션 구성을 native-image에 제공해야 합니다. 이 작업은 시간을 절약하기 위해 이미 수행되었으며 생성된 구성은 src/main/resources/META-INF/native-image/에서 찾을 수 있습니다. 리플렉션 구성에 대한 자세한 내용은 Luna Lab on GraalVM Native Image and Reflection을 참조하십시오.

다음 명령을 실행하여 벤치마크를 Java 응용 프로그램으로 빌드하고 실행합니다.

mvn clean package exec:exec

pom.xml 파일에는 -XX:-UseJVMCICompiler 옵션을 사용하여 GraalVM JIT 컴파일러를 명시적으로 해제하기 위한 지침이 있습니다. 즉, 벤치마크는 C2 JIT 컴파일러를 사용하여 실행됩니다.

응용 프로그램은 세 번 반복하여 벤치마크를 실행하고 터미널에 결과를 표시합니다. 실행을 완료하는 데 4분 미만이 걸립니다. 최종 결과는 가장 중요합니다. 다음과 같은 결과가 표시됩니다.

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으로 빌드되고 Maven plugin for GraalVM Native Image building(native-maven-plugin 플러그인 등록을 보려면 pom.xml 열기)을 적용합니다. 플러그인은 native-image에 전달해야 하는 JAR 파일과 실행 가능한 기본 클래스가 무엇인지 알아냅니다.

  1. 고유 실행 파일을 작성합니다. 빌드는 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(프로파일 안내식 최적화)를 사용하여 고유 실행 파일을 최적화합니다. 2단계 프로세스입니다. 먼저 고유 실행 파일의 계측 버전을 작성하고 실행하여 해당 실행을 추적하고 성능 프로파일을 수집합니다. 실행이 완료되면 프로젝트의 루트 디렉토리에 프로파일 파일 default.iprof가 생성됩니다. 그런 다음 벤치마크에 대한 프로파일 데이터를 포함하는 최적화된 실행 파일을 빌드하고 실행합니다.

PGO(프로파일 안내식 최적화) 기능은 GraalVM Enterprise Edition에서 사용할 수 있습니다.

  1. -Pinstrumented Maven 프로파일을 전달하여 계측된 고유 실행 파일을 작성합니다.

    mvn package -Pinstrumented
    

    target 디렉토리에 benchmark-binary-tree-instr이라는 이진을 생성합니다.

  2. 다음 메소드를 실행하여 code-execution-frequency 프로파일을 수집합니다.

    ./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 채널에서 더 많은 무료 학습 콘텐츠에 액세스하십시오. 또한 Oracle Learning Explorer가 되려면 education.oracle.com/learning-explorer을 방문하십시오.

제품 설명서는 Oracle Help Center를 참조하십시오.