TL;DR

  • mold 3.0.0은 64코어·128스레드 서버에서 Node.js를 링크할 때 GNU ld보다 약 24배, GNU gold보다 약 14배 빠름.
  • 약 160MB 크기의 Node.js 실행 파일을 빌드해 링커별 링크 시간을 비교함.
  • GNU ld 2.41은 2.52초, GNU gold 2.41은 1.46초, mold 3.0.0은 스레드 1개에서 0.49초, 8개에서 0.13초, 128개에서 0.11초를 기록함.
  • mold는 스레드 1개만 사용해도 GNU ld보다 5배 빠르며, 8개 스레드로 거의 모든 성능 이점을 얻음.
  • -fuse-ld=mold 옵션이나 mold -run make -j128 명령으로 빌드 스크립트를 수정하지 않고 사용할 수 있음.

링크 과정과 mold

  • 컴파일러는 각 소스 파일을 오브젝트 파일로 변환하고, 링커는 오브젝트 파일과 라이브러리를 결합해 실행 파일을 만듦.
  • 리눅스의 기본 링커는 대개 GNU ld(bfd)이며, GNU binutils에는 속도를 높이도록 설계된 대안 링커 gold도 포함됨. gold는 Google이 만들었으며 2008년에 처음 공개됨.
  • Rui Ueyama가 작성한 mold는 2021년에 처음 출시된 최신 링커로, GNU ld를 대체해 사용할 수 있으며 주요 장점은 속도임. 최신 릴리스는 버전 3임.

Node.js 링크 시간 비교

  • 메인 브랜치의 Node.js를 GCC 14.3과 리눅스를 사용하는 Intel Xeon Gold 6548N 서버에서 빌드함. 서버는 Emerald Rapids 기반의 2소켓 구성으로, 64코어와 128스레드를 갖춤. 최종 node 실행 파일 크기는 약 160MB임.
  • 실행 파일을 링크하는 명령을 기록해 링커별로 여섯 차례 실행하고, 중앙값을 보고함.

| 링커 | Node.js 링크 시간 |

|---|---:|

| GNU ld (bfd) 2.41 | 2.52초 |

| GNU gold 2.41 | 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배, gold보다 약 14배 빠름.
  • mold가 스레드 1개만 사용해도 Node.js 링크에 0.5초가량 걸리며, GNU ld보다 5배 빠름. 스레드 8개만으로도 거의 모든 성능 이점을 얻음.

mold 사용 방법과 빌드 영향

  • GCC 또는 clang에 -fuse-ld=mold를 전달해 사용할 수 있음.
  • mold -run make -j128처럼 실행하면 -run 옵션이 기본 링커를 호출하는 모든 명령을 가로채 mold로 전달하므로 빌드 스크립트를 변경할 필요가 없음.
  • Node.js를 한 번만 빌드한다면 링크 시간 2초 절약은 큰 차이가 아니지만, 하루에도 여러 번 파일을 수정하고 다시 빌드하는 경우 링크 비용을 매번 부담하게 됨. mold를 사용하면 링크 단계의 시간이 거의 들지 않음.
  • 스크립트와 원시 결과를 확인할 수 있음.

출처