brunch

You can make anything
by writing

C.S.Lewis

by GTPlus Dec 09. 2024

Oracle GraalVM으로 더 빠른 서비스 구현하기

안녕하세요. 지티플러스입니다.

GraalVM의 특징과 성능 개선 사례를 함께 살펴보겠습니다.




GraalVM이란?

GraalVM은 Java 및 JVM 기반 어플리케이션의 성능을 향상시켜주는 고성능 JDK입니다. 새롭게 개발된 컴파일러를 통해 보다 적은 리소스를 사용하면서도 더욱 빠른 서비스를 구현할 수 있도록 돕는 강력한 도구입니다.



GraalVM 버전

GraalVM에는 두 가지 버전이 있습니다.


1. GraalVM Community Edition





첫 번째는 OpenJDK 기반의 오픈소스 버전인 GraalVM Community Edition입니다.

GitHub 프로젝트 페이지에서 다운로드 받아 사용할 수 있습니다.



2. Oracle GraalVM

두 번째는 OracleJDK 기반의 상용 버전인 Oracle GraalVM입니다.

Oracle의 공식적인 지원을 받을 수 있는 제품이며, Community Edition 대비 더 많은 GC 최적화 및 코드 최적화 옵션을 지원하여 더 우수한 성능을 제공합니다.








Oracle 공식 홈페이지에서 다운로드 받아 사용할 수 있습니다.





Oracle GraalVM의 특징
  1. 고성능 컴파일러
 2. Polyglot 기능




Oracle GraalVM의 고성능 컴파일러


GraalVM의 첫 번째 특징은 서비스 속도와 성능을 향상시키는 고성능 컴파일러입니다.


기존 JVM의 JIT 컴파일러는 C++로 개발되었으나, Oracle은 JIT 컴파일러를 Java 기반으로 다시 작성하여 더욱 성능을 향상시키고자 하였습니다. 그렇게 JIT 컴파일러 내의 C2 컴파일러를 대체하는 새로운 Graal 컴파일러가 개발되었습니다.


Graal 컴파일러는 C++가 아닌 Java로 개발되어 유지 보수와 확장성이 뛰어나며, C2 컴파일러보다 향상된 최적화 성능을 제공합니다. 복잡한 계산과 대규모 데이터를 처리하는 서비스에서 특히 큰 속도 향상을 보였습니다.



서비스 속도 향상뿐만 아니라 리소스 사용률 개선 효과도 얻을 수 있습니다. 동일한 환경에서 동일한 어플리케이션으로 동일한 부하를 주어 성능 테스트 시, GraalVM은 기존 JVM에 비해 안정적인 heap memory 사용률을 보였습니다.



기존 JVM은 memory 부족으로 인한 부하로 GC가 다량으로 발생하는 한편, GraalVM은 동일한 memory 용량으로도 안정적인 GC Activity를 보였습니다.



아무런 튜닝 없이 GraalVM으로의 교체만으로 서비스 속도 향상과 리소스 사용률 개선 효과를 얻을 수 있다는 점은 충분히 눈여겨볼 만한 점입니다.



GraalVM은 Graal 컴파일러 외에도 AOT(Ahead-Of-Time) 컴파일러를 지원합니다.


AOT 컴파일은 어플리케이션을 미리 컴파일하여 JVM 없이 독립적으로 실행 가능한 Binary 파일을 생성하는 방식입니다.


어플리케이션 startup 시에 별도 컴파일 과정이 없기 때문에 시작 속도가 크게 향상되는 점이 장점입니다. Native 언어인 C와 비등할 정도로 시작 속도가 빨라지는 점을 확인할 수 있습니다.


 

또한 기존 JVM 대비 적은 memory 할당으로도 서비스 운영이 가능해지기 때문에, 경량화가 중요한 마이크로 서비스와 컨테이너 환경에서 유용하게 활용될 수 있습니다.



Spring Boot 3.* 버전부터 GraalVM AOT 컴파일러를 공식 지원하며, JDK17 이상이 필요합니다. 따라서 JDK17 이상의 개발 환경이라면 GraalVM AOT 컴파일러를 활용해 Spring Boot의 초기화 시간 단축과 리소스 사용량 감소 효과를 기대할 수 있습니다.



내부 테스트 시, Spring Boot 초기화 시간이 4.4초에서 0.1초로 크게 단축되는 것을 확인할 수 있었습니다.





GraalVM의 다중 언어 지원 (Polyglot)


GraalVM의 두 번째 특징은 개발 속도와 생산성을 향상시키는 Polyglot 기능입니다. 


Polyglot은 다양한 언어를 하나의 JVM 런타임에서 실행할 수 있는 기능으로, Java 코드에서 Python 클래스를 호출하거나, 반대로 Python 코드에서 Java 메서드를 호출하는 것이 가능합니다. 


기존 Java 기반의 운영 플랫폼은 유지하면서 다른 언어의 장점을 적재적소에 활용해, 이를 통해 언어에 구애받지 않는 유연한 플랫폼을 창출하면서 개발 속도와 생산성을 향상시킬 수 있습니다.






GraalVM 적용 사례

여러 기업들이 GraalVM을 도입하여 다양한 성과를 거두었습니다. 


Facebook: Apache Spark 성능 개선을 위해 GraalVM을 도입하여 Spark 성능이 1.42배 향상되고, CPU 부하가 10% 감소했습니다.  

X(Twitter): 서비스 내 거의 모든 마이크로 서비스가 Scala 언어로 작성되었으며, GraalVM 도입 후 Scala 성능이 20% 향상되고, CPU 부하가 8~11% 감소했으며, 운영 장비 수가 18% 감소했습니다.          

Standard Chartered Bank: GraalVM AOT 컴파일러를 활용하여 애플리케이션 시작 시간이 90% 단축되고, 메모리 사용률이 17% 감소했으며, Docker 이미지 사이즈가 1/8로 축소되었습니다.          

Nvidia: 성능 향상보다는 개발자 편의성을 위해 GraalVM을 도입하여 GraalVM의 Polyglot 기능을 GPU 프로그래밍에 활용할 수 있도록 하는 grCUDA를 출시했습니다.          

브런치는 최신 브라우저에 최적화 되어있습니다. IE chrome safari