Bundler, **병렬 다운로드**로 속도 개선 가능할까?

by DD
5개월 전
조회수 9

Bundler의 성능 개선을 위해, Python 패키지 관리자 uv의 기술적 특징을 분석하고 RubyGems/Bundler에 적용할 수 있는 방안을 모색함.

핵심 개선 사항으로 병렬 다운로드, 글로벌 캐싱, 그리고 의존성 해결 방식의 개선을 제시하며, Rust로의 재작성 없이도 성능 향상이 가능함을 강조함.

커뮤니티에서는 병렬 다운로드 구현, 글로벌 캐시 도입, 그리고 의존성 해결 방식 개선에 대한 긍정적인 반응과 함께, 기존 코드베이스와의 호환성에 대한 우려를 표명함.

병렬 다운로드 및 설치 파이프라인

Bundler는 현재 병렬 다운로드를 지원하지 않아, gem 설치 시 병목 현상이 발생한다. 구체적으로, gem 다운로드와 설치를 묶어두어, 의존성 트리가 깊어질수록 설치 시간이 증가한다. 따라서, 다운로드설치 단계를 분리하고, 순수 Ruby gem의 경우 병렬 설치를 허용하여 전체적인 설치 시간을 단축할 수 있다. 결과적으로, 사용자 경험을 개선하고, 개발 생산성을 향상시킬 수 있다.

글로벌 캐싱 및 하드 링크

uv는 패키지를 글로벌 캐시에 저장하고, 설치 시 하드 링크를 사용하여 디스크 공간을 절약하고 설치 속도를 높인다. Bundler 역시 Ruby 버전별 캐시 대신 XDG_CACHE_HOME을 활용한 글로벌 캐싱을 구현할 수 있다. 반면, 하드 링크는 파일 시스템 종속성이 있어, 이식성에 제약이 있을 수 있다. 따라서, 글로벌 캐시 구현 후, 하드 링크를 적용하여 성능을 최적화하는 것이 바람직하다.

의존성 해결 및 RubyGems/Bundler 통합

Bundler는 PubGrub 기반의 의존성 해결기를 사용하지만, RubyGems는 다른 해결기를 사용한다. 이러한 불일치는 코드 중복을 야기하고 유지보수를 어렵게 만든다. 구체적으로, RubyGems와 Bundler의 코드베이스를 통합하여 의존성 해결 로직을 통일하고, GemSpec 파싱 효율성을 개선할 수 있다. 결과적으로, 유지보수성을 높이고, 성능 개선을 이룰 수 있다.

Can Bundler be as fast as uv?