Dockerコンテナーのデフォルトのストレージは遅いという話をよく聞くので、実際にどれくらい差があるのか調査してみました。Fedora 21でDocker 1.6環境を構築してコンテナーを起動し、コンテナー内でdbenchを実行しました。5/26にFedora 22がリリースされましたが、検証環境の構築をしたのがリリース前だったためFedora 21を使った場合の検証結果です。
Fedora 21はLVM,BTRFS,LVM Thin Provisioning(以下LVM-Thin)モードでパーティションを作り、Dockerコンテナーを起動時に-vでそのディスク上に作ったディレクトリーをマウントしました。
実行したコマンドは次の通りです。-vオプションでDockerホスト上の/opt/volumeをコンテナーの/opt/volumeとしてマウントしています。dbenchの作業データを-Dオプションで/opt/volumeに置くように設定しています。
# docker run --net=host --name=first -v /opt/volume:/opt/volume -it docker.io/fedora:latest /bin/bash # yum install -y dbench && dbench -D /opt/volume 5
Dockerホストでのベンチマーク結果
まずはストレージパーティションの種類ごとの性能を比較するため、Dockerホストでベンチマークをとってみました。次がその結果です。
LVM Throughput 52.5299 MB/sec BTRFS Throughput 37.9817 MB/sec LVM-Thin Throughput 52.3901 MB/sec
LVMとLVM-Thinは性能が変わらないようです。それと比べるとちょっとBTRFSはスループット値が低いです。
Dockerデフォルト(UnionFS)の性能
次はDockerで特になにも意識せずにコンテナーを起動した時のベンチマーク結果の比較です。
LVM Throughput 9.4759 MB/sec BTRFS Throughput 32.3827 MB/sec LVM-Thin Throughput 8.09645 MB/sec
LVMは遅くなったのに対し、BTRFSは性能があまり変わらないという面白い結果が出ました。
-vでボリュームマウントした場合
最後にディスクをマウントした場合の結果です。-vについてはこちら。
LVM Throughput 50.6346 MB/sec BTRFS Throughput 37.5545 MB/sec LVM-Thin Throughput 47.9169 MB/sec
LVMについては-vでマウントしたディスクの読み書きはネイティブの読み書きとほぼ変わらないという結果になりました。BTRFSは-v指定しない場合と比べると、ネイティブと変わらない性能が出ているのがわかりました。
というわけで、Dockerにおける-vオプションの優位性が確認できました。ストレージ読み書きの性能が重要視されるサービスを動かす場合は-vは必須と言えそうです。