Docker Desktop for Macのmount遅い問題まとめ - Webアプリ編

2020-12-05
Docker
Mac

3年ぶりにMacでDocker使ったらやっぱり遅いじゃねーかということで色々調べてみている。今回はWebアプリのパフォーマンスについて調査。

ちなみにDocker for Macではなく、正しくはDocker Desktop for Mac ですね。名称が変わってたのね。

Webアプリの代表ということでLaravelを使ってDocker Desktop for Macのパフォーマンスをチェック。方法としてはデフォルトインストール状態のLaravelに対してsiegeを使って10秒間のベンチーマーク負荷をかけてRequest完了できた総数で比較します。小数点以下は四捨五入で切り捨てます。

※例によって、私のMac Book Pro上で実行してますので、相対的なパフォーマンス比較としてご覧ください。

ベンチマーク結果

siege -b -t 10s http://localhost

gRPC FUSE

cached delegated ヒント指定なし volumeマウント無し
512 509 520 1522

osxfs

cached delegated ヒント指定なし volumeマウント無し
682 590 63 1364

Ubuntu上のDocker (Virtualbox)

Ubuntu
2186

まとめ

今回は、Docker社のリリースとか何も見ずにパターン分けしてベンチマークを取ってみたのですが、驚きの結果でした。

gRPC FUSEはvolumeマウントのヒント有無に関わらずパフォーマンスが一定でした。osxfsはヒント有無によるパフォーマンス向上が顕著です。確かに現段階ではosxfscachedを使うのが最も効率が良いのですが、総合的にはgRPC FUSEの方が優れていそうだなという感覚です。

いずれのファイルシステムでも、もちろんvolumeマウント無しが最も速度に優れています。この結果を見ると、MySQLのデータとかはしょうがないですが、Docker Desktop for MacではファイルシステムとしてgRPC FUSEを選択して、アプリケーションのファイル群はvolumeマウント無しでmutagenとかを使って同期するのが一番ストレスが無いかもしれません。

なお、どう頑張ってもVagrantで立ち上げたUbuntu上のDockerの方が断然速いというのも、やはり面白いですね。

というわけで、gRPC FUSEはおそらく有望な次世代ファイルシステムで、現段階ではcachedより若干劣る性能だけど、総合力では有望だなという感じでした。

次回は、Docker社からのリリースや、他の開発者が発表しているベンチマーク等を元にしてgRPC FUSEをもう少し掘り下げてみようと思います。