TL;DR
- mold는 64코어·128스레드 서버에서 Node.js 실행 파일을 링크할 때 GNU ld보다 약 24배, GNU gold보다 약 14배 빠름.
- mold 3.0.0은 128개 스레드로 링크를 0.11초에 마치며, 8개 스레드에서도 0.13초로 대부분의 성능 이점을 얻음.
- 단일 스레드의 mold도 링크에 0.49초가 걸려 GNU ld보다 약 5배 빠름.
-fuse-ld=mold옵션이나mold -run make -j128명령으로 빌드 스크립트를 변경하지 않고 사용할 수 있음.- 파일을 수정하고 하루에도 여러 차례 다시 빌드하는 개발자에게 mold는 반복되는 링크 시간을 거의 없애는 선택지임.
링크 작업과 mold
- 프로그램을 빌드할 때 컴파일러는 각 소스 파일을 오브젝트 파일로 변환하고, 링커(linker)는 오브젝트 파일과 라이브러리를 하나의 실행 파일로 결합함.
- Linux의 기본 링커는 보통 GNU ld이며, bfd라고도 불림. GNU binutils에는 더 빠른 대안으로 설계된 GNU gold도 포함됨.
- Google에서 개발한 gold는 2008년에 처음 공개됨.
- Rui Ueyama(@rui314)가 작성한 mold는 2021년에 처음 공개된 링커로, GNU ld를 대체해 바로 사용할 수 있도록 설계됐으며 속도를 주요 장점으로 내세움. 최신 릴리스는 버전 3임.
Node.js 링크 성능 측정
- 메인 브랜치의 Node.js를 GCC 14.3으로 빌드하고, Linux를 실행하는 Intel Xeon Gold 6548N 서버에서 링크 성능을 측정함.
- 서버는 Emerald Rapids 기반의 듀얼 소켓 시스템이며, 64개 코어와 128개 스레드를 갖춤. 최종
node실행 파일 크기는 약 160MB임. - 실행 파일을 링크하는 명령을 기록한 뒤 각 링커로 여섯 차례 실행하고 중앙값을 보고함.
- GNU ld (bfd): 2.52초
- GNU gold: 1.46초
- mold 3.0.0, 1개 스레드: 0.49초
- mold 3.0.0, 8개 스레드: 0.13초
- mold 3.0.0, 128개 스레드: 0.11초
- 다중 스레드 환경에서 mold는 GNU ld보다 약 24배, GNU gold보다 약 14배 빠름.
- mold를 단일 스레드로 제한해도 Node.js 링크에 약 0.5초가 걸려 GNU ld보다 약 5배 빠르며, 8개 스레드로도 성능 이점의 대부분을 얻음.
mold 사용 방법
- GCC 또는 clang에
-fuse-ld=mold옵션을 전달해 mold를 사용할 수 있음. mold -run make -j128처럼 빌드 명령을 mold로 실행할 수도 있음.-run옵션은 기본 링커를 호출하는 모든 명령을 가로채 mold로 전달하므로 빌드 스크립트를 변경할 필요가 없음.
반복 빌드에서의 효과
- Node.js를 한 번만 빌드한다면 링크에서 절약하는 2초는 큰 차이가 아닐 수 있음.
- 파일을 수정하고 하루에도 수십 차례 다시 빌드하는 개발자는 매번 링크 비용을 부담함. mold를 사용하면 링크 단계가 거의 공짜에 가까워짐.
- 측정에 사용한 스크립트와 원시 결과를 공개함.
댓글 (0)
로그인하면 이 기사에 내 생각을 남길 수 있어요