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 ディスクイメージホスト・コンテナ間の共有領域
SierraMac OS Extendedqcow2qcow2 + Mac OS Extended
High SierraAPFSrawraw + 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 Extended73.13 sec.
raw + APFS79.96 sec.

結論

OS とファイルシステムの変更がストレージへの書き込み速度に影響を与えるとは言えなかった.一方で, Docker のイメージファイルを qcow2 から raw に変更することでコンテナへの書き込み速度は有意に向上した.ホスト・コンテナ間の共有領域への書き込み速度については, OS, ファイルシステム,イメージファイルの影響は見られなかった.

コンテナ (ディスクイメージが raw の場合) に書き込む場合とホスト・コンテナ間の共有領域に書き込む場合で速度に違いが出ることがわかった.コンテナに書き込む方が高速であるため,例えば RDB や NoSQL のデータ領域はホストをマウントするのではなくコンテナを利用することで処理を高速化できる可能性がある.