Docker for Macには以前からvolumeをホストにマウントした際にファイル書き込みが遅くなる問題があった。Docker for Mac Edgeにてを解決するアップデートが来たのでどれほど改善したのか実際に自分のパソコン上で試してみた。
TL;DR;
本記事での測定方法では64%ほど改善。(4.5s -> 2.9s)
私が関わっている実際のプロジェクトでは83.4sから61.4sにビルド時間が短縮して12sほどの改善が見られた。
前提
ホストマシン
方法
ホストにマウントしたvolumeに対して
for i in $(seq 1 1000); do dd if=/dev/urandom of=random_file_$i bs=10000 count=1; done
ddを使って1000回ほど書き込みをする。
Mutagen-based cachingを使った場合と使っていない場合の両方で10回ほど計測して速度を比較する。
比較する方法は3つ用意した。
方法 | 説明 |
---|---|
not mount | ホストにマウントしない状態でのvolume化、ネイティヴと同様の速度が出る |
volumed | ホストにマウント |
cached | ホストにマウントする際にcachedフラグを使用 |
実際に計測に使用したファイルはgithub上に公開した。
https://github.com/ginzro/mutagen-speed-test
結果
100kbのファイルを100回書き込み
方法 | 平均(秒) |
---|---|
not mount | 1.5 |
volumed | 1.7 |
cached | 1.7 |
not mount(mutagen) | 1.5 |
volumed(mutagen) | 1.6 |
cached(mutagen) | 1.6 |
10kbのファイルを1000回書き込み
方法 | 平均(秒) |
---|---|
not mount | 2.4 |
volumed | 4.5 |
delegated | 4.5 |
not mount(mutagen) | 2.9 |
volumed(mutagen) | 2.9 |
cached(mutagen) | 3 |
感想
1000回ほどホストとVMをやり取りして初めて差が出てきました。
詳細は載せられませんが実際にホストに対してマウントしているプロジェクトで使ってみたところ12sほどのビルド時間の短縮があったので使っていこうと思います。
ただ、Mutagen-cased caching使う際に指定したディレクトリ以下のファイルが変更されるたびに常にバックグラウンドでファイルの同期が走っている上、これがたまに失敗します…
基本的にはvolumeを使わないようにして安定性を犠牲にしてホストにマウントするという基本姿勢は変わりませんねー。もちろんedge版の話なのでstableにリリースされるとまた変わるかもしれません。
参考
https://github.com/docker/for-mac/issues/2707#issuecomment-631641183
https://qiita.com/nanasess/items/16ab9274c34bdc34e567
リモート勤務のエンジニア。2018新卒入社のエース。就職活動を目の前にして、本当に自分がやりたいことを考えた結果エンジニアの道を選ぶ。