러스트 컴파일러가 왜 이렇게 느린가?
카테고리
프로그래밍/소프트웨어 개발
서브카테고리
개발 툴
대상자
Rust 개발자, Docker 및 컨테이너 기반 배포를 사용하는 프로젝트 팀, Rust로 웹사이트 개발자
핵심 요약
- LLVM LTO(링크 타임 최적화) 와 LLVM 모듈 최적화 단계가 전체 빌드 시간의 60% 이상을 차지함
- Docker 빌드 환경에서의 전체 재빌드 는 코드 변경 시 발생하며, 의존성 캐싱 도구(
cargo-chef
)를 통해 25%만 의존성 빌드 시간에 소요됨 - LTO 및 디버그 심볼 제거 후에도 LLVM_module_optimize 단계에서 70% 가까운 시간이 소모됨, opt-level 조정을 통해 15초 내외로 빌드 시간 단축 가능
섹션별 세부 요약
1. Docker 빌드 환경에서의 병목 현상
- Rust 프로젝트는 기본적으로 전체 의존성 재빌드 가 발생하며, 4분 이상 소요
cargo-chef
도구를 사용해 의존성 캐싱을 적용하면 25%만 의존성 빌드 시간이 소요됨- 최종 바이너리 빌드 시간은 여전히 2분 50초~3분 소요됨
2. LLVM 최적화 단계의 영향
- LLVM LTO 와 LLVM 모듈 최적화 단계가 전체 빌드 시간의 60% 이상 차지함
- flamegraph 분석 결과, codegen_module_perform_lto 단계에서 80%의 시간 소모 확인
- -Z self-profile 플래그를 통해 LLVM 최적화 단계별 시간 측정 가능
3. 빌드 시간 최적화 방안
- LTO 옵션과 디버그 심볼 설정 변경을 통해 50초 내외로 빌드 시간 단축 가능
- opt-level=0 설정 시 15초 내외로 빌드 시간 단축 가능
- incremental compilation 활용 시 1.25초 내외의 빌드 시간 가능
4. 러스트 빌드 파이프라인 설계 고려사항
- LTO, opt-level, 디버그 심볼, 캐시 전략의 정교한 조합 설계가 필요
- 프로파일링 도구(
-Z time-llvm-passes
,-Z llvm-time-trace
)를 활용해 세부 병목 분석 가능 - LLVM 최적화 단계에 대한 세부 시간 측정을 통해 트레이드오프 분석 가능
결론
- Rust 빌드 속도 병목은 최종 바이너리 빌드 및 LLVM 최적화 단계에서 발생하며, LTO, opt-level, 디버그 심볼 설정 조정을 통해 빌드 시간 대폭 단축 가능
- Docker 및 컨테이너 기반 배포 시 의존성 캐싱, 인크리멘탈 빌드, LLVM 최적화 단계 분석을 활용한 정교한 파이프라인 설계가 필요함
- Rust 빌드 시간 개선을 위해 프로파일링 도구를 적극적으로 활용하고, LLVM 최적화 단계에 대한 세부 분석을 통해 성능 최적화를 도모해야 함