Docker for Macのmount遅い問題まとめ再

2020-11-28
Docker
Mac

前回、Docker for Macが遅いと思ったのは3年以上前の話で、その後はcachedでお茶を濁しつつUbuntu Desktopを常用するようになったことで、私の中で問題は解決していたが、久しぶりに仕事でMacを使うことになり、この問題に再会した。

https://blog.hanhans.net/2017/05/23/docker-for-mac-slow/

っていうか、3年間経っても改善してないのねというのが正直なところだが…

おさらいをしておくと、Docker for Macが遅い問題は

  • macOSはLinuxじゃない。
  • Linuxじゃないから、xhyveで立ち上げたLinux kitでDockerを動かしている。
  • 開発でvolumeマウントをすると、DockerとホストOS間でファイルをやり取りするが、それが遅い

このとき、Dockerが利用するファイルシステムがosxfsと呼ばれるもので、とにかくこのファイル同期でCPUがぶん回るという状態だった。

さて、現在はどうなっているのかというと、3年前とは以下のような違いがあった。

  • 開発中だったcached, delegatedが使えるようになっている
  • ファイルシステムがgRPC FUSEに変更になっている

FUSEと聞くと、FUSE Driveを思い起こさせるため、こいつはきっとそのうち爆速になる予定なのだろう。予定と書いたのは現在はそうでもなさそうだからなのだが…。

gRPC FUSEはデフォルトだとON

Dockerの更新をかけると問答無用でONになるのは嫌だなぁ。

しかし、文句ばっかり言ってもしょうがない。「推測するな計測せよ」というわけなので、とにかく愚直にベンチマークを取得することにする。ベンチマークは秒単位で記録して、それぞれ10回行う。結果は平均値をとって小数点第三位で四捨五入する。あくまで私のマシン上での実行結果なので、それぞれの結果の相対的な差異で速度差を実感できればと思っている。

ファイル同期回数が多いパターン

ブロックサイズ1kを20000回で、20MBのファイルを作成する
/bin/dd if=/dev/zero of=test bs=1k count=20000

gRPC FUSE OSXFS
12.801 5.788

※単位は秒

ファイル同期回数が少ないパターン

ブロックサイズ1Mを20回で、20MBのファイルを作成する
/bin/dd if=/dev/zero of=test bs=1M count=20

gRPC FUSE OSXFS
0.176 0.120

※単位は秒

まとめ

gRPC FUSEはOFFで行こう!(改善されるまでは)

次はウェブアプリでベンチマークを回してみます。