MySQL 8.3.0がmoldリンカをサポートしていたので、フルビルドがどれくらい早くなるか試してみました。
MySQL :: MySQL 8.3 Reference Manual :: 2.8.7 MySQL Source-Configuration Options
先に結果
8.3.0 フルビルドにかかった時間(リンクだけではなくコンパイル全体にかかる時間)。 環境やオプションは後述。
リンカ | make時間(秒) |
---|---|
lld | 139 |
mold | 137 |
MySQLはコンパイル全体に対してリンク処理の時間は少ないので、フルビルドだとほぼ誤差に見えてしまう。
cmakeオプションについて
MySQL 8.3.0からmoldリンカーがサポートされた。
On Linux, added mold (version 2 and higher) linker support. This adds a new -DWITH_LD=mold|lld option; by default, this is empty, which causes the standard linker to be used. This option is not supported on Enterprise Linux, which must use the ld linker.
https://dev.mysql.com/doc/relnotes/mysql/8.3/en/news-8-3-0.html
これに伴って追加された-DWITH_LDオプションではmoldかlldしか指定できない。
8.3のドキュメントを見ると8.0であった、USE_LD_GOLD
, USE_LD_LLD
オプションはなくなっていた。
ドキュメントにあるリンカだけで比較するなら8.3ではmoldとlldで比較するしかなさそう。
ld
,gold
,lld
,mold
で全体のコンパイル時間を比較したかったが、USE_LD_GOLD
は8.0.31で削除されているので、ld
, gold
, lld
の比較は8.0.30を使うことにする。
ビルド環境
- OS: Ubuntu 22.04
- CPU:
AMD Ryzen 9 7950X
(16core 32thread) - リンカ
- ld:
GNU ld (GNU Binutils for Ubuntu) 2.38
- gold:
GNU gold (GNU Binutils for Ubuntu 2.38) 1.16
- lld:
Ubuntu LLD 14.0.0 (compatible with GNU linkers)
- mold:
mold 2.4.0 (3d9b4d5c05250fa7c507b0c74038915929f990f1; compatible with GNU ld)
- ld:
実験
8.0.30, 8.3.0でデバッグビルドしてtimeで時間計測。
開発用サーバとして稼働していて、ノイズは殆どないはずで、それぞれ1回しか計測していません。
メモリは64GBあって、実験前にもビルドしているのでファイルキャシュは温まっているはず。
とはいえ割と雑です。
cmake
# 8.0.30 ## ld cmake .. -DWITH_BOOST=../boost_1_77_0 -DUSE_LD_GOLD=OFF -DUSE_LD_LLD=OFF -DWITH_DEBUG=ON -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++ ## gold cmake .. -DWITH_BOOST=../boost_1_77_0 -DUSE_LD_GOLD=ON -DUSE_LD_LLD=OFF -DWITH_DEBUG=ON -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++ ## lld cmake .. -DWITH_BOOST=../boost_1_77_0 -DUSE_LD_GOLD=OFF -DUSE_LD_LLD=ON -DWITH_DEBUG=ON -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++ # 8.3.0 ## lld cmake .. -DWITH_LD=lld -DWITH_DEBUG=ON -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++ ## mold cmake .. -DWITH_LD=mold -DWITH_DEBUG=ON -DCMAKE_C_COMPILER=/usr/bin/clang -DCMAKE_CXX_COMPILER=/usr/bin/clang++
make (mysqldのみ)
time make -j 30 mysqld
結果
8.0.30
リンカ | 時間(秒) |
---|---|
ld | 104 |
gold | 97 |
lld | 94 |
8.3.0
リンカ | make時間(秒) |
---|---|
lld | 139 |
mold | 137 |
まとめ
ld > gold > lld > moldの順でコンパイル時間が短縮出来た。
mysqldのフルビルドはコンパイル全体に対してリンク処理の占める割合が少ないので、劇的な効果は見られなかった。