tom__bo’s Blog

MySQL!! MySQL!! @tom__bo

MySQL 8.3.0でmoldリンカがサポートされてたので試した

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)

実験

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のフルビルドはコンパイル全体に対してリンク処理の占める割合が少ないので、劇的な効果は見られなかった。