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はヒント有無によるパフォーマンス向上が顕著です。確かに現段階ではosxfsでcachedを使うのが最も効率が良いのですが、総合的にはgRPC FUSEの方が優れていそうだなという感覚です。
いずれのファイルシステムでも、もちろんvolumeマウント無しが最も速度に優れています。この結果を見ると、MySQLのデータとかはしょうがないですが、Docker Desktop for MacではファイルシステムとしてgRPC FUSEを選択して、アプリケーションのファイル群はvolumeマウント無しでmutagenとかを使って同期するのが一番ストレスが無いかもしれません。
なお、どう頑張ってもVagrantで立ち上げたUbuntu上のDockerの方が断然速いというのも、やはり面白いですね。
というわけで、gRPC FUSEはおそらく有望な次世代ファイルシステムで、現段階ではcachedより若干劣る性能だけど、総合力では有望だなという感じでした。
次回は、Docker社からのリリースや、他の開発者が発表しているベンチマーク等を元にしてgRPC FUSEをもう少し掘り下げてみようと思います。