Lightning Ruby VM을 향한 성능 최적화: VM 설계 및 병렬 처리 도입

[28M07-4] Toward Lightning RubyVM (en) / Koichi Sasada (The University of Tokyo)

작성자
RubyKaigi
발행일
2025년 10월 05일

핵심 요약

  • 1 Ruby VM 성능 향상을 위해 복잡한 프레임 구조를 단순화하고, 변수 및 명령어 구조를 재설계하여 마이크로벤치마크의 호출 시간을 단축합니다.
  • 2 매크로벤치마크의 비-VM 실행 시간 및 가비지 컬렉션 문제를 해결하기 위해 CRuby에 병렬 처리 도입을 모색합니다.
  • 3 세분화된 병렬 처리는 C 레벨에서, 거친 병렬 처리는 다중 VM 사용을 통해 지원하며, 병렬 가비지 컬렉션도 고려 중입니다.

도입

도쿄 대학의 Kasada는 "Lightning Ruby VM"을 목표로 Ruby VM의 성능 최적화 방안을 발표합니다. 이 발표는 VM의 속도를 높이고 효율적인 최적화를 달성하기 위한 연구 활동에 초점을 맞추고 있으며, 특히 VM 설계 개선과 병렬 처리 도입이라는 두 가지 핵심 주제를 다룹니다.

1. 마이크로벤치마크 성능 분석 및 VM 설계 개선

피보나치 수열과 같은 마이크로벤치마크 분석 결과, VM 실행 시간과 메서드 호출 시간이 상당 부분을 차지하는 것으로 나타났습니다. 특히, Pentto 벤치마크에서는 블록 및 메서드 호출이 많은 시간을 소모합니다. 이는 현재 제어 흐름 구조(메서드 프레임, 블록 프레임)가 지나치게 복잡하고 많은 값이 스택에 푸시되기 때문입니다.

이러한 문제를 해결하기 위해 다음을 제안합니다:

  • 프레임 구조 단순화: 성능 향상을 위해 프레임 구조를 간소화할 필요가 있습니다.

  • 재설계: 변수 구조, 메서드 데이터 구조, 명령어 시퀀스 구조를 전면적으로 재설계할 예정입니다.

2. 매크로벤치마크 성능 분석 및 병렬 처리 도입

ARDOC 및 RA 벤치마크와 같은 매크로벤치마크 분석에서는 VM 실행 시간 자체는 적은 반면, 가비지 컬렉션 시간(ARDOC)과 가상 머신 외의 실행 시간(비-VM 실행 시간)이 매우 큰 비중을 차지하는 것으로 나타났습니다. 이러한 시간을 줄이기 위해 동시성(concurrency)이 아닌 병렬성(parallelism) 도입이 필요합니다.

CRuby에 병렬성을 도입하기 위한 원칙과 해결책은 다음과 같습니다:

  • CRuby 내 병렬 스레드 지양: 병렬 스레드는 복잡하고 어려운 문제를 야기할 수 있으므로 CRuby 내에서는 병렬 스레드를 사용하지 않습니다.

  • 세분화된 병렬 처리 (Fine-grain parallelism):
    • Ruby 개발자는 병렬성을 직접 고려할 필요 없이, 가상 머신이 자동으로 병렬 처리를 수행해야 합니다.
    • C 레벨에서 병렬 코드를 작성하는 방식으로 구현하며, C 확장 개발자가 겪을 어려움을 덜기 위한 프레임워크를 제공할 예정입니다.
  • 거친 병렬 처리 (Coarse-grain parallelism):
    • 다중 가상 머신(Multi-VM, 일명 Via)을 사용하여 병렬 프로그래밍을 가능하게 합니다.
    • 현재 이 프로젝트를 진행 중이며, 여러 머신이 병렬로 실행될 수 있도록 합니다.
  • 병렬 가비지 컬렉션: 병렬 마킹(marking) 및 병렬 스위핑(sweeping)과 같은 병렬 가비지 컬렉션 기법도 고려하고 있습니다.

결론

발표자는 Ruby VM의 성능 최적화를 위해 VM의 내부 구조를 단순화하고, 병렬 처리를 도입하는 다각적인 접근 방식을 제시했습니다. 특히, 병렬 처리의 경우 CRuby의 안정성을 유지하면서도 성능을 극대화하기 위해 C 레벨에서의 세분화된 병렬 처리 프레임워크와 다중 VM 기반의 거친 병렬 처리 도입을 강조했습니다. 연구 자료로 활용될 느린 Ruby 애플리케이션의 제보를 요청하며, 향후 VM 성능 개선 소식에 대한 기대를 당부했습니다.

댓글 0

댓글 작성

0/1000
정중하고 건설적인 댓글을 작성해 주세요.

아직 댓글이 없습니다

첫 번째 댓글을 작성해보세요!