virtioFSでMacのdevcontainer環境が爆速化した件

## はじめに
この記事は[私とあなたの Advent Calendar 2022](https://qiita.com/advent-calendar/2022/trade_eco)の記事として投稿する
**Mac上でdocker(今回はdevcontainer)動かすのは初心者の実験記事です。**
もっと簡単に、Macで快適にdevcontainer環境使えるソリューションご存じの方は教えてください。。敬具

## きっかけ
開発新規メンバが、ほぼ例外なく開発環境の構築にハマっているので、なんとかならんかなー、と思いつつも余裕がない状態でした。
が、PC置き換えに伴い、自分も開発環境を再構築しないといけない当事者になってしまったので、ちゃんと向き合ってみようかと。

## なぜdevcontainer？
最初は、前々から気になっていたvscode for webを試してみたんですが、使いたい拡張機能がWeb版では使えない状況で早々に諦めました。。
(特にフロントエンド開発系の拡張機能はほぼ使えない)

https://code.visualstudio.com/docs/editor/vscode-web

次に、イマドキ(?)のコンテナに開発環境を、、となると、
なんか色々面倒なイメージあったんですが、devcontainerだとvscodeの拡張機能で、かなりお手軽にできそうってことで、これはいいぞと(楽したいだけ)

https://code.visualstudio.com/docs/devcontainers/containers

devcontainer自体の環境構築とかは、windowsの場合は、wsl+docker使うことになるんですが、docker上で動いているとは感じないくらいに快適につかえました。
(wsl設定とかは、ちょっと癖あるんですが、だいぶマシになってきてる感)
何より、**Dockerfileで自動構築できるのはもちろん、vscodeの拡張機能や設定定義も含めて構成管理(&共有)できる点が素晴らしい**です。

が、**この記事の本題はそこではないので、詳細は省略します。**

## Macのdevcontainer環境が、、遅い、遅すぎる、、

ここからが本題。
まあ、コンテナなんだし、当然Macも同じように使えるよね、、ってことで個人的に試した結果、、
え゛、、、あれ？？？なんで？？？
### **遅い、遅すぎる、、**

職場のMacPCにはライセンスの関係で、docker環境には[rancherDeskTop](https://rancherdesktop.io/)使ってたんですが、Windows+wsl(with docker)の環境と比べ物にならないくらいに遅い。。
※ちなみにMacBookPro2018年モデル(IntelCPU：メモリ16G)です

まあ、職場では色々あって**MacPC→WinowsPCに置き換えとなっちゃたので、いいっちゃいい(これはこれで悲劇)**　なんですが、
今までdoker上でDB動かしたりして特に性能が気になることもなく、色々納得できないので、勉強ネタとして調べてみた。


## devcontainer環境はホスト環境とファイル同期する
いきなり結論なんですが、最もでかい遅い理由は、**「コンテナとホストマシン間のファイル同期が遅い」**　から。
これはdevcontainerのメリットでもあるんですが、コンテナ停止しても開発コードが消えないように、ホストマシンとディレクトリ共有して同期する仕組みがあるんですよね。
ビルド中に中間成果物とがガンガンできるので、その都度同期に一々時間をとられる、、そりゃ遅くなるわな、、と。
で、**Macの場合、ファイルシステムの相性(?)の問題で、この遅さが顕著に現れるっぽい**。。ナンテコッタ
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188136/9bf47176-af69-fb67-0cc5-3ed567b70a23.png)

同期対象(マウント)ディレクトリを制限するとか、同期対象そのものを減らすことでも改善しそうな気はしますが、
せっかくvscodeのdevcontainer拡張がそのあたりを隠蔽してくれているのに、ゴニョゴニョするのが悔しいので、他に楽して改善できないか試してみた。


## 施行1:マウントの同期オプションを変えてみる
まず、同期遅延してもいいから早くする設定ってないの？って考えにいきつきますが、ありました。
vscodeのコマンドパレットで
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188136/8b726d1c-2816-3a9d-c121-1843332c4b1a.png)
で、Devcontainerのデータ同期の一貫性レベルを変更できます。デフォルトはcached。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188136/a58a3dfb-05d2-b279-bea2-7e48cb9e7cba.png)
こいつを、delegatedにすると、同期遅延とのトレードオフにはなりそうですが、改善が期待できそうです。
が、、

結果、、、**あんまり変わんない。**

確かに、気持ち早くはなった感はあるので、まあ我慢すれば使えるレベルって感じです。
が、Windows+wsl環境より遅いなんて納得できない。


## 施行2:virtioFSを試してみる
というわけで、もう少し調べてみたところ、virtioFSという救世主がいるらしいとこのこと。

https://virtio-fs.gitlab.io/


ざっくりいうと、「ホストとVM間でディレクトリを共有するための新しいファイルシステム」ということで、
現時点ではDockerDesktopだとExperimentalオプションで有効にできるようです。
色んな方が、その効果を検証されているので、これは期待できそう。

というわけで、お試しでDockerDesktop for Macを入れて、virtioFSを有効にしてみた。（簡単。ぽちっとな
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/188136/da2123e3-e09b-aff6-b5f8-3b02bdb2e01c.png)

結果、、、**めっちゃ早くなった！**
ここに至るまでに、散々遅くてストレスためていた反動もありますが、少なくともwindows+wsl環境と同等以上のサクサク状態になりました。


## まとめ
Macにおけるdevcontainer上のビルド時間の相対比較は以下の通りとなりました。

| 一貫性レベル(vscode設定) | virtioFS-OFF | virtioFS-ON |
| - | - | - |
| consistent | 2分12秒 | 1分5秒 |
| cashed | 2分1秒 | 1分2秒 |
| delegated    | 1分49秒 | 54秒 |

一貫性レベル設定も多少は効きますが、virtioFSの効果は絶大で、これなら、一貫性レベルはデフォルトのcashedのままでも快適に使えそうです。

Macでdevcontainerを快適に使いたい場合は、
DockerDesktopのライセンス買って、virtioFSをONにする　もしくは  RancherDesktopとかでvirtioFS使えるようになるのを待つのがいいんじゃないでしょうか？