참고:
- 이 자습서는 Oracle에서 제공하는 무료 실습 환경에서 사용할 수 있습니다.
- Oracle Cloud Infrastructure 자격 증명, 테넌시 및 구획에 대한 예제 값을 사용합니다. 실습을 마치면 해당 값을 클라우드 환경과 관련된 값으로 대체합니다.
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 벤치마크를 구축할 때 다음 지침을 고려해야 합니다.
- 각 고유 실행 파일에 단일 벤치마크 포함
- 벤치마크가 포크되지 않도록 벤치마크에
@Fork(0)
를 추가합니다.- 벤치마크를 프로파일링하여 최적화된 벤치마크를 생성하려는 경우 프로파일링하는 동안 벤치마크 결과를 무시합니다.
참고: OCI(Oracle Cloud Infrastructure)는 추가 비용 없이 GraalVM 엔터프라이즈를 제공합니다.
실험 목표
이 실습에서는 다음을 수행합니다.
- Oracle Cloud에서 원격 호스트에 접속
- JVM에서 JMH 벤치마크 컴파일 및 실행
- GraalVM Native Image를 사용하여 이 JMH 벤치마크를 고유 실행 파일로 빌드하고 실행합니다.
- PGO를 사용하여 고유 실행 버전을 최적화하고 실행합니다.
예상 실습 시간: 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 Code에 팝업됩니다. 재시도를 클릭하십시오. VS Code에서는 머신 지문을 수락하도록 요청합니다. 그런 다음 계속을 누릅니다.
원격 개발 환경에 연결 관련 문제
위에서 다루지 않는 원격 개발 환경에 VS 코드가 연결되지 않는 다른 문제가 발생할 경우 다음을 시도하십시오.
- VS 코드 닫기
- 바탕 화면에서 "Luna-Lab.html" 아이콘을 두 번 누릅니다.
- Resources 탭에서 "Configure Script"를 복사하여 Luna Desktop Terminal에 다시 붙여 넣습니다.
- 위 지침을 반복하여 원격 개발 환경에 연결합니다.
축하합니다, 이제 Oracle Cloud에서 원격 호스트로 연결되었습니다!
스크립트는 원격 호스트에 연결된 VS Code를 열고 lab 소스 코드를 엽니다.
그런 다음 VS 코드 내에서 터미널을 엽니다. 터미널을 사용하면 원격 호스트와 상호 작용할 수 있습니다. 아래와 같이 Terminal > New Terminal 메뉴를 통해 VS Code에서 터미널을 열 수 있습니다.
개발 환경 참고
이 실습에서는 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분 정도 걸립니다.
mvn package -Pnative
-Pnative
Maven 프로파일은 고유 실행 파일 작성을 설정합니다. target 디렉토리에benchmark-binary-tree
이라는 고유 실행 파일을 생성합니다. -
그런 다음 기본 실행 파일로 벤치마크를 실행합니다.
./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에서 사용할 수 있습니다.
-
-Pinstrumented
Maven 프로파일을 전달하여 계측된 고유 실행 파일을 작성합니다.mvn package -Pinstrumented
target 디렉토리에
benchmark-binary-tree-instr
이라는 이진을 생성합니다. -
다음 메소드를 실행하여 code-execution-frequency 프로파일을 수집합니다.
./target/benchmark-binary-tree-instr
이 실행에서 수집된 프로파일은 다른 프로파일이 지정되지 않은 경우 현재 작업 디렉토리의 default.iprof 파일에 저장됩니다.
주: 런타임 시
-XX:ProfilesDumpFile=YourFileName
옵션을 전달하여 계측된 고유 실행 파일을 실행할 때 프로파일을 수집할 위치를 지정할 수 있습니다. 다른 이름을 지정하여 여러 프로파일 파일을 수집하고 빌드 시native-image
도구로 전달할 수도 있습니다. -
프로파일 파일을 생성했으므로 최적화된 버전을 작성합니다.
mvn package -Poptimized
target
디렉토리에benchmark-binary-tree-opt
이라는 최적화된 이진을 생성합니다. -
마지막으로 최적화된 고유 실행 파일을 실행합니다.
./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를 참조하십시오.
Optimize Cloud Native Java Applications with GraalVM Enterprise PGO
F75977-01
January 2023
Copyright © 2023, Oracle and/or its affiliates.