Ruby 3.4의 모듈형 가비지 컬렉터(Modular GC) 및 MMTK 통합

[EN] Modular Garbage Collectors in Ruby / Peter Zhu @peterzhu2118

3줄 요약

  • Ruby 3.4에 실험적인 모듈형 가비지 컬렉터(Modular GC) 기능이 도입되어, 사용자가 필요에 따라 다양한 GC 구현을 선택할 수 있게 되었습니다.
  • 이 기능은 기존 Ruby GC의 한계를 극복하고, MMTK(Memory Management Toolkit)와 같은 외부 GC 프레임워크를 통합하여 성능 향상을 목표로 합니다.
  • MMTK는 다양한 GC 알고리즘과 병렬 처리를 지원하며, 현재 Ruby와의 통합은 초기 단계로 향후 성능 개선이 기대됩니다.

Ruby는 지난 30년간 `Mark-Sweep-Compact` 가비지 컬렉터(GC)를 사용해 왔지만, 현대적 요구사항(병렬 처리, 유연한 메모리 관리)에는 한계가 있었습니다. 이러한 제약을 극복하고 다양한 워크로드에 맞는 GC를 제공하기 위해 Ruby 3.4에 '모듈형 가비지 컬렉터(Modular GC)'가 실험적으로 도입되었습니다. 이 기능은 GC 구현의 유연성을 높이고 외부 GC 프레임워크와의 통합을 목표로 합니다.

모듈형 GC는 Ruby GC를 VM 인터페이스와 실제 구현으로 분리하며, 구현은 공유 라이브러리 형태로 로드됩니다. 이 둘은 GC가 구현할 함수와 Ruby VM이 제공하는 함수로 구성된 ‘모듈형 GC API’를 통해 통신하여 GC 구현의 독립적인 개발을 가능케 합니다. 이 API를 활용한 첫 비-기본 GC 구현은 Rust 기반의 언어 독립적 GC 프레임워크인 MMTK(Memory Management Toolkit)입니다. MMTK는 ‘Mark and Sweep’, ‘Mark and Compact’, ‘Immix’ 등 다양한 GC 알고리즘을 제공하며, ‘작업 패킷(work packets)’을 통한 병렬 처리를 기본적으로 지원합니다. Ruby용 MMTK는 C/Rust 바인딩을 통해 Modular GC API 및 MMTK 코어와 연동됩니다. 현재 Modular GC를 통한 MMTK 통합은 초기 단계로, 비-이동형 GC 계획만 지원하며 기존 Ruby GC보다 성능이 낮습니다. 향후 개선 사항으로는 이동형 GC 계획(예: 객체 이동을 포함한 Immix) 지원, 세대별 GC(generational GC) 지원, 병렬 처리 이점 극대화, 그리고 GC 단계의 스레드 안전성 확보 등이 있습니다.

모듈형 가비지 컬렉터는 Ruby의 미래 성능과 유연성을 위한 중요한 발전입니다. 비록 현재는 실험 단계이지만, 개발자에게 맞춤형 GC 구현 및 다양한 알고리즘 실험 기회를 제공합니다. MMTK와의 통합은 Ruby 생태계에 고성능 및 병렬 GC 옵션을 도입할 잠재력을 보여주며, 지속적인 개발을 통해 Ruby 애플리케이션의 성능과 메모리 효율성을 크게 향상시킬 것으로 기대됩니다.