前回、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
を思い起こさせるため、こいつはきっとそのうち爆速になる予定なのだろう。予定と書いたのは現在はそうでもなさそうだからなのだが…。
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で行こう!(改善されるまでは)
次はウェブアプリでベンチマークを回してみます。