Bundler는 uv만큼 빨라질 수 있을까? 성능 개선을 위한 탐색

Can Bundler Be as Fast as Uv?

작성자
HackerNews
발행일
2025년 12월 29일

핵심 요약

  • 1 Bundler는 uv의 성능 최적화 기법(병렬 다운로드, 전역 캐시, 버전 표현 최적화 등)을 도입하여 속도를 크게 개선할 수 있습니다.
  • 2 uv의 속도는 Rust 재작성보다는 설계 결정과 현대적 표준 채택에 기인하며, Bundler도 Ruby 코드베이스 내에서 99%의 성능 향상을 달성 가능합니다.
  • 3 현재 Bundler의 설치 과정은 다운로드와 설치가 결합되어 병렬 처리가 제한되며, 이를 분리하고 전역 캐시를 도입하는 등 아키텍처 개선이 필요합니다.

도입

올해 RailsWorld에서 Bundler의 성능이 `uv`만큼 빨라질 수 있는지에 대한 질문을 받았습니다. 이는 저에게 Bundler 성능 문제에 대한 깊은 탐구를 시작하게 된 계기가 되었습니다. Andrew Nesbitt의 "uv가 어떻게 그렇게 빨라졌는가"라는 글을 참고하여, `uv`에 적용된 기술들이 Bundler/RubyGems에 어떻게 적용될 수 있는지, 그리고 Bundler의 기존 병목 현상을 해결할 방안을 모색하고자 합니다. 저는 Bundler가 `uv`만큼 빨라질 수 있다고 굳게 믿습니다.

uv의 교훈과 Rust 재작성 논의

uv의 속도 비결은 Rust 언어 자체보다는 백워드 호환성 제약 없는 새로운 설계 채택에 있습니다. Bundler는 Rust 재작성 없이 기존 Ruby 코드베이스 내에서 병목을 제거하여 uv에 준하는 성능 향상을 목표로 합니다. RubyGems는 젬 메타데이터를 즉시 파싱할 수 있으며, uv처럼 Ruby 버전 상한 검사를 최적화할 여지가 있습니다.

Bundler/RubyGems 성능 개선 핵심 방안

  • 병렬 다운로드 및 설치 과정 분리:
    • 현재 Bundler는 젬 다운로드와 설치가 결합되어 의존성 체인에서 순차 처리됩니다. 이를 다운로드, 압축 해제, 컴파일, 설치의 4단계로 분리하여 다운로드 및 압축 해제를 병렬로 수행합니다. 순수 Ruby 젬은 의존성 순서 제약을 완화하여 병렬화를 극대화하고, 네이티브 확장 젬은 의존성 설치 후 컴파일합니다.
  • 전역 캐시 및 하드링크 도입:
    • Ruby 버전별로 분리된 캐시 대신 $XDG_CACHE_HOME에 통합된 전역 캐시를 구축하고, 젬 설치 시 하드링크를 활용하여 중복 복사를 방지합니다.
  • PubGrub 리졸버 통일:
    • Bundler와 RubyGems가 다른 리졸버를 사용하는 이원화를 해소하고, 코드베이스 통합을 통해 단일 리졸버를 사용해야 합니다.

Ruby GVL과 버전 표현 최적화

Ruby의 GVL은 IO 바운드 작업 및 GVL을 해제하는 네이티브 확장 코드의 병렬 실행을 허용하므로, 젬 설치 과정에서 큰 문제가 되지 않습니다. uv가 버전을 u64 정수로 압축하여 비교 속도를 높이듯이, Ruby에서도 버전을 정수 즉치로 인코딩하여 리졸버 성능을 향상시킬 수 있으며, YJIT/ZJIT를 통해 Rust 구현체와의 성능 격차를 줄일 수 있습니다.

결론

`uv`의 빠른 속도는 언어적 특성보다는 현대적 표준과 설계 결정, 그리고 레거시 호환성 제약이 없는 새로운 시작에서 비롯되었습니다. Bundler와 RubyGems는 이미 빠른 패키지 매니저를 위한 인프라를 갖추고 있으므로, 백워드 호환성을 유지하면서도 기존 코드베이스를 개선하여 `uv`에 버금가는 성능을 달성할 수 있을 것이라 낙관합니다. Rust로 재작성하는 것은 1%의 추가 성능 향상을 가져올 수 있겠지만, 그 가치는 크지 않다고 판단됩니다. 이 글은 Bundler가 `uv`처럼 될 수 있는지에 대한 가능성을 탐색했으며, 다음 글에서는 Bundler/RubyGems가 실제 환경에서 느려지는 구체적인 원인과 해결 방안을 다룰 예정입니다.

댓글 0

댓글 작성

댓글 삭제 시 비밀번호가 필요합니다.

이미 계정이 있으신가요? 로그인 후 댓글을 작성하세요.

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

아직 댓글이 없습니다

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