
러스트 빌드 병렬화를 위한 실험 프로젝트 Headstart가 공개됐다. 개발자 문서에 따르면 16코어 환경에서 rust-analyzer 검사 시간이 54%, 빌드 시간이 42% 줄었다. 정식 기능은 아니며 최신 패치 재측정과 검토가 남아 있다.
PowderworksCode가 공개한 프로젝트 문서에 따르면 Headstart는 러스트 컴파일러 rustc와 빌드 도구 Cargo를 함께 수정한다. 선행 라이브러리의 함수 본문 검사가 끝나기 전에 다른 라이브러리가 필요한 인터페이스 정보를 먼저 제공해, 의존 관계가 긴 프로젝트의 작업을 겹쳐 실행하는 방식이다.
러스트의 컴파일 단위인 크레이트는 자신이 의존하는 크레이트의 정보를 바탕으로 타입을 검사한다. Headstart는 인터페이스 검사와 함수 본문 검사를 분리하고, 인터페이스 검사가 끝난 시점에 조기 메타데이터 파일을 기록한다. Cargo는 이 신호를 받아 후속 크레이트의 작업을 시작한다.
실행 파일을 만들지 않는 cargo check는 조기 메타데이터로 후속 검사를 마칠 수 있다. cargo build는 분석 작업을 먼저 진행하되 코드 생성에 들어가기 전 완전한 메타데이터를 기다린다. 대기 중인 작업의 실행 슬롯은 다른 컴파일 작업에 넘겨준다.
개발자가 공개한 16코어 환경의 클린 빌드 측정에서 rust-analyzer의 cargo check 중앙값은 90.1초에서 41.5초로, cargo build는 137.9초에서 79.9초로 줄었다. Linux와 AMD EPYC 9554P 환경에서 병렬 작업 수를 16으로 설정하고, 동일한 패치 버전의 기능을 끈 경우와 켠 경우를 번갈아 세 차례 측정한 결과다. 독립 기관의 성능 검증이 아니라 프로젝트 측이 공개한 수치다.
최신 패치의 4코어 재측정에서는 효과가 더 작았다. rust-analyzer 검사 시간은 93.20초에서 70.81초로 약 24%, 빌드 시간은 153.54초에서 130.50초로 약 15% 감소했다. 의존 관계 때문에 쉬는 코어가 많을수록 효과가 크고, 이미 모든 코어를 활용하는 프로젝트에서는 이득이 제한된다는 설명이다.
개발자는 오류가 있는 의존성 때문에 빌드가 성공 처리되는 것은 아니라고 설명했다. 후속 크레이트의 출력은 의존성 검사가 정상적으로 끝난 뒤에만 내보내며, 선행 작업이 실패하면 폐기한다. 다만 먼저 진행한 작업이 낭비될 수 있고, 일부 오류 전달이 늦어지거나 동시에 메모리에 남는 컴파일러가 늘어날 수 있다.
현재 구현은 rustc 패치 6개와 Cargo 패치 3개로 구성된다. 사용하려면 수정한 컴파일러와 Cargo를 직접 빌드하고 불안정 옵션인 -Zheadstart를 켜야 한다. 일반 러스트 업데이트로 바로 사용할 수 있는 기능은 아니다.
프로젝트의 준비 상태 문서는 설계 논의와 초안 풀 리퀘스트를 제시할 단계이지만 아직 병합할 준비는 되지 않았다고 평가한다. 최대 54%를 포함한 16코어 수치는 마지막 수정과 정리 이전의 결과라 최신 패치로 다시 측정해야 한다. 8코어 환경 측정, 현재 구현의 메모리 사용량, 작업 수 제한과 다른 빌드 도구의 호환성도 남은 검토 과제다.
출처: Headstart 개발자 GitHub 프로젝트 문서
https://github.com/PowderworksCode/headstart/blob/e965689829e768827bd65cebb43a484f5c2693bb/README.md
Headstart 개발자 성능 측정 결과
https://github.com/PowderworksCode/headstart/blob/e965689829e768827bd65cebb43a484f5c2693bb/docs/results.md
Headstart 개발자 설계 문서
https://github.com/PowderworksCode/headstart/blob/e965689829e768827bd65cebb43a484f5c2693bb/docs/design.md
Headstart 개발자 준비 상태 평가
https://github.com/PowderworksCode/headstart/blob/e965689829e768827bd65cebb43a484f5c2693bb/docs/readiness.md
Headstart 개발자 패치 구성 문서
https://github.com/PowderworksCode/headstart/blob/e965689829e768827bd65cebb43a484f5c2693bb/patches/README.md