背景
...とにかくGatsbyのビルドが遅い!(●`ε´●)プンスカ
明らかに遅すぎてもはやコンテナ環境が悪いのでは?といろいろ調べた結果そのとおりでした。
まぁ、使ってるコンピュータもそんなにいいものではないですし、
なにせ爆熱でサーマルスロットリング起きてる説濃厚なので...
↓あがいた跡
たしかにgRPC FUSEからVirtioFSにしたら早くなった気がする!
— クワイン·ゆき·まくらすきぃ (@yukimakura86) June 29, 2023
...けどGatsbyあきらかにビルド遅すぎんか
Gatsbyが遅いのか、i7 8650が遅いのか...
ファイッッ!! pic.twitter.com/bNYD8N7boO
やったこと
とりあえず、Docker Desktopの設定を変える
gRPC FUSE からVirtioFSに変更→あまり変わらず...
node_modulesのみをVolumeMountにする
爆速!!!
↑今回の本題です
※当たり前ですが、ネイティブよりは早くなりませんよ
これでネイティブより早いと言うことは、
「いやーやっぱり生音声よりハイレゾ音源のほうが良い音質だな〜」
って言ってるのと似てると思います。
(おさらい)VolumeMountとBindMountってなぁに?
BindMountとVolumeMountは、Dockerコンテナ内にデータを永続化するための2つの異なる方法です。
BindMountは、ホストマシン上の特定のファイルやディレクトリをコンテナ内に直接マウントすることができます。
これにより、コンテナ内からホストマシン上のファイルやディレクトリにアクセスすることができます。
ただし、ホストマシンのファイルシステムに依存しており、可搬性が低いという欠点があります。
一方、VolumeMountはDockerによって完全に管理される独立したストレージ領域です。
ホストマシン上のディレクトリ構造やOSに依存せず、複数のコンテナ間で安全に共有することができます。
また、ボリュームはDocker CLIコマンドやDocker APIを使用して管理することができます。
...とBingAI先生が申しております(`・ω・´)
パフォーマンスに関しては全然まっっったく違います!
BindMountは引くほど遅いです
(すくなくともWSL2とmacに関しては。Linuxはまだ未検証)
2019年ごろからIssueに上がっていますが未だにOpenのままのようです
簡易ベンチマーク
計測環境
ホスト
- ThinkPad X1 Carbon Gen6
- Hardware
- Core i7 8650u
- RAM 16GB (LPDDR3 2133MHz)
- SUNEAST SE900NVG3-01TB
- Broadcom BCM94360NG
- Software
- macOS 12.6.3 (Monterey)
- Docker Desktop 4.16.2 (95914)
- Hardware
コンテナ
node:18-bullseye
結果
Pure : シンプルなBindMount
(ex) -v $(pwd)/tmp:/ws
Delegated : Delegatedオプション付きのBindMount
(ex) -v &(pwd)/tmp:/ws:delegated
VolumeMountNM : node_modulesのみVolumeMount
(ex) -v node_module_volume:/ws/node_modules
npm install
マウント条件 | real | user | sys |
---|---|---|---|
Delegated | 6m46.746s | 5m25.364s | 3m47.648s |
Pure | 8m15.052s | 6m38.064s | 3m50.435s |
Delegated & VolumeMountNM | 1m50.672s | 2m6.004s | 1m15.796s |
Pure & VolumeMountNM | 1m46.771s | 2m0.373s | 1m1.540s |
gatsby build
マウント条件 | real | user | sys |
---|---|---|---|
Delegated | 8m32.072s | 8m26.974s | 4m0.114s |
Pure | 7m7.828s | 6m42.795s | 1m39.654s |
Delegated & VolumeMountNM | 1m13.318s | 2m19.687s | 0m13.755s |
Pure & VolumeMountNM | 2m13.731s | 8m21.418s | 1m1.227s |
〆
当方も積極的にDockerを使ってきたつもりでしたが、
お恥ずかしいことにこのことに今まで気づきませんでした...
でもまさか、こんなに差があるとは...恐ろしや...
今回の例はGatsbyでしたが、Gatsbyに限らず全てに共通することと思っています。
コンテナ仮想化はめちゃくちゃ便利ですが、
罠もいろいろありそうなのでしっかり学んだ上で活用していきたいですなぁ
WSL2の環境でも試しましたが、この記事の結果と似た傾向を示していたので、
ぜひお試しあれ。
小ネタですが、BingAI先生にBindMountとVolumeMountのパフォーマンスについて
聞いたところ、全く正反対のことを答えて来やがりました...
みなさんも用法用量を守って活用しましょうね(^_^;)
では(^^)ノシ