X

Java Embedded team blog - Oracle Korea

  • July 9, 2021

Facebook에서의 Graalvm

Hong-Il Kim
Sales Consultant

다음은 아래 블로그를 번역한 내용입니다.

GraalVM at Facebook

Facebook은 GraalVM을 사용하여 Spark 워크로드를 가속화하고 메모리 및 CPU 사용량을 줄이고 있습니다. 마이그레이션 스토리, 성능 개선 결과 및 향후 계획에 대해 알아보려면 계속 읽으십시오.

이 블로그 게시물은 Facebook 엔지니어링 팀의 Chen Li 및 Xiangyang Guo 와 공동으로 작성되었습니다 .

페이스북의 기술

28억 월간 활성 사용자가 있는 Facebook은 세계에서 가장 많이 방문한 플랫폼 중 하나입니다. 이러한 부하에서 안정성과 고성능을 보장하기 위해 엔지니어링 팀은 Java, JavaScript, Flow Hack, PHP, Python, C++ 등을 포함한 광범위한 기술을 사용합니다.

Java는 빅 데이터(Spark, Presto 등), 백엔드 서비스 및 모바일과 같은 몇 가지 핵심 영역에서 Facebook에서 사용됩니다. GraalVM으로 이전하기 전에 팀은 Java 8 및 Java 11용 Oracle JDK 및 OpenJDK를 사용했습니다.

이러한 규모에서 성능 향상은 상당한 가치를 가져옵니다. 사용자 경험을 개선하고 인프라 비용을 절감합니다. 그렇기 때문에 엔지니어링 팀은 항상 애플리케이션의 성능을 개선할 방법을 찾고 있으며 GraalVM을 평가하여 더 빠른 Java 런타임인지 확인하기로 결정했습니다.

왜 GraalVM인가

  • 성능이 주요 고려 사항이었기 때문에 Facebook 팀은 GraalVM을 Java 런타임으로 평가하고 Java 애플리케이션의 성능을 향상시킬 수 있는지 확인하기로 결정했습니다. GraalVM은 부분 이스케이프 분석 및 인라이닝 휴리스틱과 같은 고급 최적화를 제공합니다. 덕분에 많은 Java/JVM 응용 프로그램에서 GraalVM으로 전환하는 것만으로도 즉시 성능 향상을 볼 수 있습니다. Facebook 팀도 관찰했듯이 GraalVM은 SpecJVM2008 및 DaCapo와 같은 벤치 마크에서 C2에 비해 상당한 YoY 개선을 보여줍니다.
  • 또한 GraalVM 컴파일러는 모듈식의 확장 가능한 방식으로 Java를 사용하여 처음부터 작성되었습니다. 이를 통해 유지 관리가 간편할 뿐만 아니라 점진적인 개선 사항을 추가할 수 있습니다. 팀이 GraalVM의 장기 투자를 고려하고 있기 때문에 이것은 Facebook에 중요했습니다.
  • 커뮤니티 . GraalVM 프로젝트에는 많은 조직과 개인이 프로젝트에 기여하고 로드맵을 형성하는 활기찬 오픈 소스 커뮤니티가 있습니다. 또한 커뮤니티에서 도움과 지원을 쉽게 찾을 수 있습니다.

GraalVM에서 Java 및 Spark 실행

Facebook 팀은 OpenJDK의 대체품으로 GraalVM을 사용했습니다. 이 시나리오에서 GraalVM으로의 마이그레이션은 매우 쉽습니다. 애플리케이션 코드를 변경할 필요 없이 런타임만 전환하면 됩니다. 이러한 전환을 통해 수동 조정 없이 GraalVM의 고급 성능 최적화 덕분에 애플리케이션이 더 빠르게 실행됩니다.

Apache Spark는 스트리밍, SQL, 기계 학습 및 그래프 처리를 위한 내장 모듈이 있는 빅 데이터 처리를 위한 통합 분석 엔진입니다. 기본적으로 데이터를 처리하는 속도는 매우 빠르지만 많은 팀에서 성능을 더욱 최적화할 수 있는 방법을 찾고 있습니다. 가장 쉬운 방법 중 하나는 GraalVM에서 Spark 워크로드를 실행하는 것입니다. 잠시 후에 더 자세히 설명할 특정 컴파일러 최적화 세트 덕분에 GraalVM은 Spark 워크로드의 속도를 크게 높일 수 있습니다. 르네상스 벤치 마크 스위트의 아파치 스파크 벤치 마크는 몇 가지 벤치 마크에서는 4.84배로 실행하고, 엔터프라이즈 버전에서는 1.42x의 커뮤니티 버전에서는 1.1 배의 평균 속도 향상을 보여줍니다.

 

Spark performance on GraalVM

GraalVM의 Spark 성능

Facebook의 경우 Spark는 집계된 컴퓨팅 스토리지 클러스터에서 실행되는 데이터 웨어하우스에서 가장 큰 SQL 쿼리 엔진입니다. 방대한 양의 데이터로 인해 효율성과 비용 절감이 최우선 과제입니다.

그들은 2020년 초에 평가를 시작했습니다. 초기 벤치마크에서 좋은 결과가 나왔을 때 팀은 GraalVM을 프로덕션에 출시하고 성능과 안정성을 계속 모니터링했습니다.

 

GraalVM을 사용한 Spark CPU 사용량

 

성능 면에서 그들은 CPU 사용량 이 약 10% 감소하는 것을 관찰했으며 이 CPU 감소는 출시 이후로 일관되었습니다.

GraalVM이 Spark 워크로드를 가속화하는 방법

Spark 성능 향상에 가장 크게 기여한 몇 가지 최적화는 다음과 같습니다.

  • 다형성 인라인 . 전통적인 인라인은 컴파일러가 메서드 호출이 대상으로 하는 정확한 메서드를 결정할 수 있는 경우에만 작동합니다. GraalVM은 추상 메서드도 인라인 될 수 있는 추가 프로파일 링 정보를 수집하여 이 지점을 넘어 인라인을 가능하게 합니다.
  • 부분 탈출 분석 . 부분 이스케이프 분석의 개념은 개체가 탈출하지 않는 분기에서 스칼라 교체를 수행하여 불필요한 개체 할당을 제거하고 개체가 탈출해야 하는 분기의 힙에 존재하는지 확인하는 것입니다. 이렇게 하면 애플리케이션의 메모리 공간과 GC에서 발생하는 CPU 로드가 모두 줄어듭니다. 이러한 최적화는 Spark와 같이 데이터가 많은 애플리케이션에서 훨씬 더 중요합니다. 특히 Facebook에서 관찰한 바와 같이 GraalVM 은 java/lang/Double.valueOf 와 같은 메서드들에서 CPU 소비를 5 배까지 줄였습니다.
  • GraalVM의 고급 추측 최적화는 동적 런타임 피드백을 활용하여 더 빠른 기계 코드를 생성합니다. 프로그램의 특정 부분이 프로그램 실행 중에 실행되지 않을 것이라고 추측함으로써 GraalVM 컴파일러는 코드를 전문화하고 더 효율적으로 만들 수 있습니다. Spark의 경우 이 최적화는 분기(예: 긴 if-then-else체인)를 제거하고, 제어 흐름을 단순화하고, 루프 본문에서 동적 검사의 양을 줄이고, 추가 최적화를 가능하게 하는 앨리어싱 제약 조건을 설정함으로써 특히 잘 작동 합니다.

평가 결과, Facebook 팀은 CPU 집약적 빅데이터 서비스 대부분을 GraalVM으로 마이그레이션했습니다. 또한 GraalVM으로 전환한 후 Presto의 CPU 및 GC 일시 중지가 5% 이상 개선되는 것을 관찰했습니다. 다음으로 팀은 탈출 분석 최적화의 이점을 얻기 위해 GraalVM을 다른 메모리 바인딩 서비스로 푸시 할 계획입니다. 팀은 또한 프로젝트와 커뮤니티에 기여할 계획입니다.

또한 Native Image 및 Truffle Framework와 같은 다른 GraalVM 기능을 사용할 수 있는 기회를 모색하고 있습니다.

결론

GraalVM은 고급 컴파일러 최적화 덕분에 많은 Java 및 Scala 워크로드의 속도를 크게 높일 수 있습니다. 특히 Spark 워크로드는 JDK 배포판으로 GraalVM으로 전환하는 것만으로 약 10%-42%의 속도 향상을 기대할 수 있습니다.

흥미로운 점은 다른 인기 소셜 미디어 플랫폼 인 Twitter의 엔지니어가 유사한 여정과 유사한 관찰 내용을 공유했습니다. Scala 워크로드를 GraalVM으로 이동한 후 GraalVM 컴파일러 덕분에 P99 대기 시간을 19.9% ​​줄이는 등 상당한 성능 향상을 관찰했습니다. Twitter 또는 Facebook과 같은 플랫폼의 경우 이러한 성능 향상은 플랫폼 규모에 따라 훨씬 더 배가됩니다.

애플리케이션용 GraalVM을 시작하려면 graalvm.org/docs/getting-started/로 이동 하십시오 .

 

Be the first to comment

Comments ( 0 )
Please enter your name.Please provide a valid email address.Please enter a comment.CAPTCHA challenge response provided was incorrect. Please try again.