TL;DR
- Docker for Macのディスクスループットを約2倍にする - Qiita
- ちょうど Docker for Mac のストレージアクセスが遅くて困っていたので手元の環境で検証した
- 結論: Docker イメージファイルを qcow2 から raw に変更することで
- コンテナへの書き込み速度が有意に向上した
- コンテナ・ホスト間の共有領域への書き込み速度に有意な差は見られなかった
検証内容
検証用マシン
項目 | 値 |
---|---|
モデル | MacBook Air (13-inch, Early 2014) |
プロセッサ | 1.7 GHz Intel Core i7 |
メモリ | 8 GB 1600 MHz DDR3 |
ストレージ | 256GB PCIe ベースフラッシュストレージ |
比較項目
まず, Sierra (Mac OS Extended) から High Sierra (APFS) に変更することでマシン自体の書き込み速度に差が出るかを検証する.
次に, Docker のディスクイメージの違いで書き込み速度に差が出るかを検証する.これが冒頭の記事に掲載されていた内容となる.
最後に, volume オプションでホスト・コンテナ間でストレージを共有し,共有領域への書き込み速度に差が出るかを検証する.
OS | ファイルシステム | Docker ディスクイメージ | ホスト・コンテナ間の共有領域 |
---|---|---|---|
Sierra | Mac OS Extended | qcow2 | qcow2 + Mac OS Extended |
High Sierra | APFS | raw | raw + APFS |
速度計測方法
冒頭の記事に倣い dd
コマンドで 10 GB のデータを書き込み,処理に要した時間を time
コマンドで計測する.計測結果の比較には real, user, sys のうち real の値を用いる.試行回数は 10 とし,平均値を取得するほかに t 検定 (両側検定) を行い有意差の有無を検証する.
検証結果
OS とファイルシステムの比較
検証用コマンドは以下の通り.
time dd if=/dev/zero of=./test bs=262144 count=40960
結果は以下の通り. t 検定の値は 0.08 であり有意差なし.
環境 | 時間 |
---|---|
Sierra (Mac OS Extended) | 15.71 sec. |
High Sierra (APFS) | 14.98 sec. |
Docker のディスクイメージの比較
検証用コマンドは以下の通り.
docker run -it alpine time dd if=/dev/zero of=/test bs=262144 count=40960
結果は以下の通り. t 検定の値は 0.00 であり有意差あり.ディスクイメージを qcow2 から raw に変更することで書き込み速度が向上した.
環境 | 時間 |
---|---|
Docker (qcow2) | 53.43 sec. |
Docker (raw) | 17.47 sec. |
ホスト・コンテナ間の共有領域
下記の docker-compose.yml に示すようにコンテナからホストのディレクトリをマウントして検証する.
# docker-compose.yml
version: '2'
services:
test:
image: alpine
volumes:
- ./disk-speed-test:/tmp:cached
検証用コマンドは以下の通り.
docker-compose run test \time dd if=/dev/zero of=/tmp/test bs=262144 count=40960
結果は以下の通り. t 検定の値は 0.09 であり有意差なし.
環境 | 時間 |
---|---|
qcow2 + Mac OS Extended | 73.13 sec. |
raw + APFS | 79.96 sec. |
結論
OS とファイルシステムの変更がストレージへの書き込み速度に影響を与えるとは言えなかった.一方で, Docker のイメージファイルを qcow2 から raw に変更することでコンテナへの書き込み速度は有意に向上した.ホスト・コンテナ間の共有領域への書き込み速度については, OS, ファイルシステム,イメージファイルの影響は見られなかった.
コンテナ (ディスクイメージが raw の場合) に書き込む場合とホスト・コンテナ間の共有領域に書き込む場合で速度に違いが出ることがわかった.コンテナに書き込む方が高速であるため,例えば RDB や NoSQL のデータ領域はホストをマウントするのではなくコンテナを利用することで処理を高速化できる可能性がある.