🐬Docker for Mac without qcow2
Docker for MacのファイルIOが遅い。VirtualBox上で動いているDockerと比較しても遅い。
これにはいくつかの原因があるが、その1つとしてディスクイメージのフォーマットとしてqcow2を用いていることがあげられる。
qcow2は書き込み時に必要な容量を確保するcopy on write方式のディスクイメージだが、これを事前に必要な容量をすべて確保するrawファーマットに差し替えたところ、パフォーマンスが改善した。
使い方
既存のDockerイメージは消えます
https://github.com/mzp/docker.img
curl https://raw.githubusercontent.com/mzp/Docker.img/master/install.sh | bash
ベンチマーク
fioを用いてベンチマークを行なったところ、Docker Machine(VirtualBox)と同程度のパフォーマンスはでるようになった。*1
読み込み
Average(MiB/s) | Min(MiB/s) | Max(MiB/s) | |
---|---|---|---|
native | 361 | 361 | 361 |
docker machine | 105 | 105 | 105 |
qcow2 | 46 | 46 | 46 |
raw | 147 | 147 | 147 |
書き込み
Average(MiB/s) | Min(MiB/s) | Max(MiB/s) | |
---|---|---|---|
native | 487 | 487 | 487 |
docker machine | 51 | 51 | 51 |
qcow2 | 29 | 29 | 29 |
raw | 45 | 45 | 45 |
やっていること
Docker for Macはhyperkitを使い、macOS上でLinuxを動かし、その上でDockerを動かしている。
hyperkitはrawフォーマットのイメージに対応しているので、Docker for Macが起動する際にhyperkitに渡す引数を変更することで、ディスクイメージをqcow2からrawに差し替えている。
ただ起動時に渡す引数を設定で変更することができないので、hyperkitのバイナリをシェルスクリプトに差し替えて、無理矢理変更している。
*1:実行したコマンド等は https://github.com/mzp/docker.img に書いた