참고:
- 이 사용지침서에서는 Oracle Cloud에 접근해야 합니다. 무료 계정에 등록하려면 Oracle Cloud Infrastructure 무료 계층 시작하기를 참조하십시오.
- Oracle Cloud Infrastructure 인증서, 테넌시 및 구획에 대한 예제 값이 사용됩니다. 랩을 완료한 후에는 이러한 값을 클라우드 환경과 관련된 값으로 대체하십시오.
Oracle Cloud Infrastructure상에서 GraalVM on Ampere A1 시작하기
이 사용지침서에서는 OCI(Oracle Cloud Infrastructure)의 A1 컴퓨트 플랫폼에서 GraalVM을 시작하는 방법에 대해 설명합니다. 먼저 JVM 모드에서 Spring Boot 응용 프로그램을 실행한 다음 Micronaut.io 응용 프로그램을 고유 이진으로 구축하고 실행합니다. GraalVM을 사용하여 기존 애플리케이션의 성능을 향상하고 클라우드용 경량 다언어 애플리케이션을 구축할 수 있습니다. 이는 선형 확장성 및 난공불락의 가격 대비 성능 비율을 제공하는 Ampere A1 컴퓨트 구성에 이상적입니다.
Ampere Altra CPU 기반의 Ampere A1 컴퓨팅 플랫폼은 에지 장치에서 클라우드 데이터 센터까지 확장할 수 있는 워크로드를 개발하는 기업 및 애플리케이션 개발자를 위한 세대별 변화를 나타냅니다. 이 플랫폼의 고유한 설계는 컴퓨트 코어 내에서 리소스 경합이 없으므로 일관되고 예측 가능한 성능을 제공하며 격리 및 보안을 개선합니다. Oracle Cloud Infrastructure의 새로운 컴퓨트 구성은 Altra CPU의 강력한 성능과 OCI 기반의 보안, 확장성, 서비스 시스템을 결합하는 탁월한 플랫폼을 제공합니다.
소개
GraalVM이란?
GraalVM은 Java, JavaScript, LLVM 기반 언어(예: C 및 C++) 및 기타 동적 언어로 작성된 애플리케이션을 위한 고성능 런타임입니다. 상당히 개선된 애플리케이션 성능과 효율성으로, 클라우드 플랫폼에서 기존 애플리케이션을 더 효율적으로 실행할 수 있도록 지원합니다.
GraalVM은 기존 JVM 기반 애플리케이션에 대한 네이티브 실행 바이너리 이미지도 구축합니다. 결과 고유 이미지는 즉시 실행을 위한 머신 코드 형식으로 전체 프로그램을 포함하고 JVM 자체의 시작 및 메모리 공간을 방지합니다. 이 기능을 사용하면 GraalVM이 클라우드 전용 애플리케이션을 구축하는 데 이상적이며, 현재 JVM 언어에 따른 여러 마이크로서비스 프레임워크가 포함되어 있습니다.
목표
이 자습서에서는 다음을 수행합니다.
- Ampere A1 컴퓨팅 인스턴스 생성
- GraalVM Enterprise Edition 설치
- JVM 모드에서 GraalVM을 사용하여 인기 있는 Spring Boot 샘플 애플리케이션 Pet Clinic 실행
- GraalVM 네이티브 이미지로 Micronaut 애플리케이션 구축 및 실행
- Ampere A1에서 GraalVM 사용의 적합성 평가
- 배치 정리
필요 조건
- 유료 Oracle Free Tier(Trial), LiveLabs 클라우드 계정
- OCI 콘솔에 대한 이해
- 네트워킹 개요
- 구획에 대한 기본적인 이해
- 컨테이너 및 Podman에 대한 기본 개념 지식
클라우드 환경 설정
먼저 Java EE 애플리케이션을 생성 및 배치하는 데 사용할 Oracle 클라우드 환경을 시작합니다. 이 환경은 클라우드 구획 내에 포함되어 있으며, 구획 내의 통신은 VCN(가상 클라우드 네트워크)을 통해 이루어집니다. 구획과 VCN은 전체 환경을 격리하고 보호합니다. Ampere A1 컴퓨트 인스턴스를 생성하여 GraalVM Enterprise Edition을 사용하여 애플리케이션을 설치하고 실행합니다.
기본 OCI 인프라 설정
-
탐색 메뉴를 엽니다. 거버넌스 및 관리에서 ID로 이동하고 구획을 누릅니다. 이 화면에서 구획 목록이 표시됩니다. 구획 생성을 누릅니다.
-
다음을 입력합니다.
- 이름: "AppDev"를 입력합니다.
- 설명: (필수) 설명을 입력합니다(예: "시작하기 자습서용 AppDev 구획"). 기밀 정보를 입력하지 마십시오.
- 상위 구획: 이 구획이 상주할 구획을 선택합니다. 기본값은 루트 구획(또는 테넌시)입니다.
- 구획 생성을 누릅니다.
- 구획이 목록에 표시됩니다.
Ampere A1 컴퓨트 인스턴스 생성
-
Ampere A1 컴퓨트 인스턴스를 생성하려면 콘솔의 왼쪽 상단 모서리에 있는 탐색 메뉴를 사용하고 컴퓨트 > 인스턴스로 이동합니다.
-
인스턴스 생성 플로우를 엽니다.
- AppDev 구획에 있는지 확인합니다.
- 인스턴스 생성을 누릅니다.
-
인스턴스 생성 페이지에서 VCN(가상 클라우드 네트워크), IG(인터넷 게이트웨이) 등과 같은 새 네트워크 리소스와 함께 새 인스턴스를 생성합니다.
- 인스턴스 이름을 GraalVMApp로 지정합니다.
- Oracle Linux 7.9를 사용하도록 이미지 선택을 업데이트합니다.
- 사용 가능한 컴퓨트 구성을 보려면 구성 변경 단추를 누릅니다.
-
인스턴스에 대한 이미지를 구성합니다.
- 사용 가능한 OS 이미지를 보려면 이미지 변경 단추를 누릅니다.
- Oracle Linux 7.9를 선택합니다.
-
인스턴스에 대한 리소스를 구성합니다.
- 모양 계열에 대해 선택한 Ampere Arm 기반 프로세서를 선택합니다.
- Ampere Arm 기반 프로세서가 있는 구성 목록에서
VM.Standard.A1.Flex
구성을 선택합니다. A1 구성은 유연하며 코어 수 및 메모리 양을 수정할 수 있습니다. VM용 코어 1개 및 6GB 메모리를 선택합니다.
-
네트워킹 옵션을 선택합니다. 다음 클라우드 배치에 필요한 새 VCN 및 서브넷을 생성합니다. 인스턴스에 대해 공용 IP 주소를 지정하도록 선택해야 합니다.
-
SSH 키 쌍을 생성하고 다운로드합니다. 이 단계는 선택 사항이지만 나중에 유지 관리 및 업그레이드할 것을 권장합니다. 사용하려는 키 쌍이 이미 있는 경우 공개 키를 가져올 수도 있습니다. SSH 키를 생성하는 방법을 알고 싶으면 SSH 키 생성 자습서의 지침을 따릅니다.
-
네트워킹 리소스를 생성하고 컴퓨트 인스턴스를 실행하려면 생성을 누릅니다.
그림 실행 인스턴스에 대한 설명
사용자에게 애플리케이션 포트 노출
인터넷에서 응용 프로그램에 액세스할 수 있으려면 응용 프로그램에서 사용할 포트를 열어야 합니다. 이 섹션에서는 애플리케이션이 트래픽을 보내고 받을 수 있도록 클라우드 네트워크 및 컴퓨트 인스턴스의 방화벽 규칙에 보안 목록을 구성합니다.
VCN(가상 클라우드 네트워크) 구성
보안 목록은 인스턴스에 대한 가상 방화벽으로 작동하며, 수신 및 송신 규칙은 허용되는 트래픽 유형을 지정합니다. 서브넷 레벨에서 구성된 보안 목록으로, 보안 규칙을 해당 서브넷의 모든 네트워크 요소에 적용합니다. 네트워크에는 초기 규칙 세트를 포함하는 기본 보안 목록이 제공됩니다. 기본 보안 목록을 사용하면 SSH를 사용하여 인스턴스에 접속하고 인스턴스에서 모든 대상에 대해 아웃바운드 네트워크 호출을 수행할 수 있습니다.
애플리케이션 포트를 노출하도록 보안 목록 구성
-
생성한 인스턴스에 대한 인스턴스 세부정보 페이지로 이동합니다. 컴퓨트 > 인스턴스 > 생성한 인스턴스를 누르십시오.
-
서브넷을 눌러 인스턴스가 연결된 서브넷으로 이동합니다.
서브넷 선택 설명
-
서브넷 페이지에서 기본 보안 목록을 눌러 세부정보를 확인하고 구성합니다.
-
"수신 규칙 추가"를 눌러 규칙과 일치하는 수신 트래픽을 허용하는 새 규칙을 추가합니다.
-
포트 8080에서 수신 트래픽을 허용하는 수신 규칙을 추가합니다.
- 소스 CIDR을
0.0.0.0/0
으로 설정합니다. 이렇게 하면 모든 소스의 수신 트래픽이 허용됩니다. - Destination Port Range를
8080
로 설정합니다. 그러면 대상이 포트8080
로만 설정됩니다. 이제 모든 소스의 트래픽이 포트8080
를 사용할 수 있습니다. 이는 우리가 필요로 하는 요소이므로 어디에서나 어플리케이션에 도달할 수 있습니다. - 설명 제공
그림 추가 수신 규칙 설명
- 소스 CIDR을
인스턴스 구성
방화벽 규칙은 인스턴스의 패킷 레벨 트래픽을 제어합니다. 인스턴스 자체에 방화벽 규칙을 직접 구성하고 추가 보안 레벨을 제공합니다.
- 생성한 인스턴스에 대한 인스턴스 세부정보 페이지로 이동합니다. 컴퓨트 > 인스턴스 > 생성한 인스턴스를 누르십시오.
- 인스턴스의 공용 IP 주소를 복사합니다.
- SSH를 사용하여 인스턴스에 연결합니다. 사용자가 생성하거나 인스턴스 생성 단계 중에 제공한 키를 사용합니다. Oracle Linux 운영 체제를 사용하는 인스턴스의 기본 사용자 이름은
opc
입니다. -
방화벽 구성 명령을 실행합니다. 그러면 인스턴스 자체의 방화벽이
8080
포트를 표시하고 수신 트래픽을 수락하도록 수정됩니다.sudo firewall-cmd --zone=public --permanent --add-port=8080/tcp sudo firewall-cmd --reload
GraalVM Enterprise Edition on Ampere A1 설치 및 사용
OCI는 고객에게 무료로 Oracle GraalVM Enterprise Edition을 제공합니다. GraalVM Enterprise 지원이 Oracle Cloud 구독에 포함되어 있습니다. OCI에서 고성능 Arm 기반 컴퓨트 구성과 GraalVM Enterprise가 결합된 이 조합은 기존 및 새 엔터프라이즈 애플리케이션을 위한 강력한 플랫폼을 제공합니다.
- 생성한 인스턴스에 대한 인스턴스 세부정보 페이지로 이동합니다. 컴퓨트 > 인스턴스 > 생성한 인스턴스를 누릅니다.
- 인스턴스의 공용 IP 주소를 복사합니다.
- SSH를 사용하여 인스턴스에 로그인합니다. 인스턴스 생성 단계에서 생성하거나 제공한 키를 사용합니다. Oracle Linux 운영 체제를 사용하는 인스턴스의 기본 사용자 이름은
opc
입니다.
OCI에 GraalVM 및 Git을 설치하려면 다음 명령을 실행하십시오.
sudo yum install graalvm21-ee-11 git
설치 후 GraalVM은 /usr/lib64/graalvm
디렉토리에서 사용할 수 있습니다.
GraalVM에서 기존 Java 애플리케이션 실행
GraalVM에는 JDK가 포함되어 있으며 기본적으로 최상위 계층 Java JIT 컴파일러를 GraalVM 컴파일러로 대체합니다. 새롭고 혁신적인 GraalVM 컴파일러는 기존 JVM 언어 응용 프로그램의 성능을 향상시킬 수 있습니다. GraalVM을 설치한 후 시스템에서 java
런타임을 사용할 수 있으며 다음 명령을 사용하여 버전을 확인할 수 있습니다.
java -version
java version "11.0.10" 2021-01-19 LTS
Java(TM) SE Runtime Environment GraalVM EE 21.0.0.2 (build 11.0.10+8-LTS-jvmci-21.0-b06)
Java HotSpot(TM) 64-Bit Server VM GraalVM EE 21.0.0.2 (build 11.0.10+8-LTS-jvmci-21.0-b06, mixed mode, sharing)
기존 Java 응용 프로그램의 예로 Spring Boot를 사용하여 빌드된 Spring PetClinic 샘플 응용 프로그램을 실행할 수 있습니다.
-
시작하려면 저장소를 복제하십시오.
git clone https://github.com/spring-projects/spring-petclinic.git
-
응용 프로그램을 빌드하고 실행합니다.
cd spring-petclinic ./mvnw spring-boot:run
응용 프로그램을 처음 실행하면 Maven이 종속성을 다운로드합니다. 다운로드가 완료되기까지 몇 분 정도 걸릴 수 있습니다. 다음 예와 유사한 출력이 표시됩니다.
2021-03-05 18:11:28.447 INFO 3704 --- [ main] o.s.s.petclinic.PetClinicApplication : No active profile set, falling back to default profiles: default 2021-03-05 18:11:31.531 INFO 3704 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Bootstrapping Spring Data JPA repositories in DEFAULT mode. 2021-03-05 18:11:31.697 INFO 3704 --- [ main] .s.d.r.c.RepositoryConfigurationDelegate : Finished Spring Data repository scanning in 144 ms. Found 4 JPA repository interfaces. 2021-03-05 18:11:33.436 INFO 3704 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat initialized with port(s): 8080 (http) 2021-03-05 18:11:33.720 INFO 3704 --- [ main] o.a.c.c.C.[Tomcat].[localhost].[/] : Initializing Spring embedded WebApplicationContext 2021-03-05 18:11:33.721 INFO 3704 --- [ main] w.s.c.ServletWebServerApplicationContext : Root WebApplicationContext: initialization completed in 5133 ms 2021-03-05 18:11:34.797 INFO 3704 --- [ main] o.hibernate.jpa.internal.util.LogHelper : HHH000204: Processing PersistenceUnitInfo [name: default] 2021-03-05 18:11:34.902 INFO 3704 --- [ main] org.hibernate.Version : HHH000412: Hibernate ORM core version 5.4.28.Final 2021-03-05 18:11:34.983 INFO 3704 --- [ main] o.hibernate.annotations.common.Version : HCANN000001: Hibernate Commons Annotations {5.1.2.Final} 2021-03-05 18:11:35.266 INFO 3704 --- [ main] org.hibernate.dialect.Dialect : HHH000400: Using dialect: org.hibernate.dialect.MySQLDialect 2021-03-05 18:11:36.838 INFO 3704 --- [ main] o.h.tuple.entity.EntityMetamodel : HHH000157: Lazy property fetching available for: org.springframework.samples.petclinic.owner.Owner 2021-03-05 18:11:37.094 INFO 3704 --- [ main] o.h.e.t.j.p.i.JtaPlatformInitiator : HHH000490: Using JtaPlatform implementation: [org.hibernate.engine.transaction.jta.platform.internal.NoJtaPlatform] 2021-03-05 18:11:37.112 INFO 3704 --- [ main] j.LocalContainerEntityManagerFactoryBean : Initialized JPA EntityManagerFactory for persistence unit 'default' 2021-03-05 18:11:38.696 INFO 3704 --- [ main] o.s.s.concurrent.ThreadPoolTaskExecutor : Initializing ExecutorService 'applicationTaskExecutor' 2021-03-05 18:11:40.604 INFO 3704 --- [ main] o.s.b.a.e.web.EndpointLinksResolver : Exposing 13 endpoint(s) beneath base path '/actuator' 2021-03-05 18:11:40.758 INFO 3704 --- [ main] o.s.b.w.embedded.tomcat.TomcatWebServer : Tomcat started on port(s): 8080 (http) with context path '' 2021-03-05 18:11:40.783 INFO 3704 --- [ main] o.s.s.petclinic.PetClinicApplication : Started PetClinicApplication in 13.846 seconds (JVM running for 14.906)
응용 프로그램은 약 14초 후에 시작됩니다. 표시된 대로 GraalVM은 전체 JDK를 포함하고 기존 JVM에 대한 드롭인 대체일 수 있습니다.
GraalVM에서 사용할 수 있는 최적화 플래그에 대한 자세한 내용은 여기에서 문서를 참조하십시오.
매우 빠른 네이티브 이미지 구축
GraalVM은 Java 애플리케이션에서 자체 포함된 실행 이진을 생성할 수 있으며, 이를 통해 매우 빠르게 실행할 수 있습니다. Java 코드의 사전 컴파일인 GraalVM은 모든 애플리케이션 클래스, 종속성 및 런타임 라이브러리를 처리하고 JVM 자체의 오버헤드 및 점유 공간을 제거합니다. 그러나 런타임 프록시 및 반사와 같은 일부 고급 언어 기능을 사용하려면 추가 구성이 필요합니다. Micronaut, Helidon 및 Quarkus와 같은 여러 마이크로서비스 Java 프레임워크는 네이티브 이미지를 즉시 구축할 수 있도록 지원합니다.
-
시작하려면 고유 이미지 도구를 설치합니다. 이러한 패키지는 OCI용 yum 저장소에서 사용할 수 있지만 기본적으로 설치되지 않습니다.
cd ~ sudo yum install graalvm21-ee-11-native-image
Micronaut에서는 반사가 사용되지 않는 종속성 주입 및 화면 지향 런타임을 사용하므로 이 자습서에서는 Micronaut을 사용하여 애플리케이션을 구축합니다.
-
아래 명령을 사용하여 micronaut.io/launch를 사용할 때 새 프로젝트를 생성합니다.
curl --location --request GET 'https://launch.micronaut.io/create/default/com.example.graal-on-arm?lang=JAVA&build=MAVEN&test=JUNIT&javaVersion=JDK_11&features=graalvm' --output graal-on-arm.zip unzip graal-on-arm.zip -d graal-on-arm cd graal-on-arm
-
응용 프로그램을 실행하여 JVM에서 응용 프로그램을 시작하는 데 걸리는 시간을 확인합니다.
./mvnw mn:run
다음 예와 유사한 출력이 표시됩니다.
__ __ _ _ | \/ (_) ___ _ __ ___ _ __ __ _ _ _| |_ | |\/| | |/ __| '__/ _ \| '_ \ / _` | | | | __| | | | | | (__| | | (_) | | | | (_| | |_| | |_ |_| |_|_|\___|_| \___/|_| |_|\__,_|\__,_|\__| Micronaut (v2.5.3) 09:59:34.504 [main] INFO io.micronaut.runtime.Micronaut - Startup completed in 755ms. Server Running: http://localhost:8080
응용 프로그램은 755밀리초로 시작하며 이는 인상적입니다.
-
이제 응용 프로그램에 대한 고유 이미지를 작성하고 시작 시간을 비교합니다.
./mvnw package -Dpackaging=native-image
네이티브 이미지를 구축하는 데는 5분 정도 걸립니다. 구축 후 고유 이미지는
target
디렉토리에 배치되고 프로젝트 이름으로 이름이 지정됩니다. -
고유 이미지를 실행합니다.
./target/graal-on-arm
다음 예와 유사한 출력이 표시됩니다.
__ __ _ _ | | \/ (_) ___ _ __ ___ _ __ __ _ _ _| |_ | |\/| | |/ __| '__/ _ \| '_ \ / _` | | | | __| | | | | | (__| | | (_) | | | | (_| | |_| | |_ |_| |_|_|\___|_| \___/|_| |_|\__,_|\__,_|\__| Micronaut (v2.5.3) 09:59:18.558 [main] INFO io.micronaut.runtime.Micronaut - Startup completed in 18ms. Server Running: http://localhost:8080
연속 이미지는 18밀리초에서 시작하여 40배 더 빠릅니다.
애플리케이션의 단순성 또는 복잡성에 상관없이 GraalVM 네이티브 이미지를 통해 즉각적인 성능 향상을 실현할 수 있다는 점에 유의해야 합니다. 최신 Arm 기반 컴퓨트 구성 및 GraalVM Enterprise와 결합된 Oracle Cloud Infrastructure는 엔터프라이즈 워크로드를 개발 및 개선할 수 있는 독보적인 플랫폼을 제공합니다.
감사의 글
작성자 - Jeevan Joseph
추가 학습 자원
docs.oracle.com/learn에서 다른 실습을 찾아보거나 Oracle Learning YouTube channel에서 무료 학습 콘텐츠에 액세스할 수 있습니다. 또한 education.oracle.com/learning-explorer를 방문하여 Oracle Learning Explorer로 변경하십시오.
제품 설명서는 Oracle Help Center를 참조하십시오.
Get started with GraalVM on Ampere A1 in Oracle Cloud Infrastructure
F51446-01
December 2021
Copyright © 2021, Oracle and/or its affiliates.