21
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

Docker Desktop for mac 4.6 がリリースされて、ファイルIOのパフォーマンスが向上したらしいので調べてみた。(virtiofs)

Last updated at Posted at 2022-03-24

Docker Desktop for mac 4.6のアップデート内容

今回のアップデートでは、 virtiofs と呼ばれるファイル共有実装を使用するオプションを利用できるようになったみたいです。
これにより macOS ホストと DockerVM 間でファイルを同期する方法が改善され、パフォーマンスが向上したらしい。

「virtiofs」を使用する際の前提条件

  • macOS 12.2以降 (Apple Siliconの場合)
  • macOS 12.3以降 (Intelの場合)

「virtiofs」を有効にする

  • まずは Docker Desktop for mac を v4.6 にアップグレードする。(こちらからもアップグレード可能です)
  • 「設定」(歯車のアイコン)>「Experimental Features」に移動し、「Use the new Virtualization framework」 と「Enable VirtiofS accelerated directory sharing」にチェックを入れる。
  • 次に「Apply & Restart」をクリックして、Docker Desktopをリスタートする。

スクリーンショット 2022-03-23 10.24.13.png

これで準備は完了です。
あとはdocker環境を起動すれば、virtiofsが適応されているはずです。

実際にファイル同期のパフォーマンスを比較してみる

テストの内容

今回はPHPのフレームワークLaravelのプロジェクトを作成し、docker-composeで適当に立てたコンテナの/var/test/に配置。
コンテナ内の/var/test/から100MBのファイルを作成して、ホスト側と同期されるまでのスピードを計測していきます。

ベンチマーク用の環境準備

  • まずは適当なディレクトリでLaravelの適当なプロジェクトを作成する。
$ curl -s "https://laravel.build/test-app" | bash
  • 次にdocker-compose.ymlをプロジェクト内に作成する。
    ※すでにLaravel sail環境のdocker-compose.ymlが用意されているが、今回はあくまで簡易的なテストなので下記の構成に書き換えています。
docker-compose.yml
version: "2"

services:
  web:
    image: httpd
    container_name: test-web
    volumes:
      - .:/var/test
    ports:
      - 8090:8090
  • Docker環境の起動
$ docker-compose up -d

「virtiofs」 の有無でのパフォーマンスの比較結果

まず、virtiofs無効の場合の結果

# コンテナの中に入る
$ docker exec -it test-web bash
~# cd /var/test

/var/test# time dd if=/dev/zero of=speedtest bs=1024 count=102400
102400+0 records in
102400+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 34.4202 s, 3.0 MB/s

real    0m34.428s ← 結果
user    0m0.186s
sys     0m1.280s

/var/test# ls -lh speedtest
-rw-r--r-- 1 root root 100M Mar 24 01:32 speedtest

100MBファイルの作成に約34秒もかかっており、かなりパフォーマンスが悪いことがわかりますね。。

次に、virtiofs有効にした場合の結果

~# cd /var/test

/var/test# time dd if=/dev/zero of=speedtest bs=1024 count=102400
102400+0 records in
102400+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 8.23497 s, 12.7 MB/s

real    0m8.238s ← 結果
user    0m0.217s
sys     0m3.550s

/var/test# ls -lh speedtest
-rw-r--r-- 1 root root 100M Mar 24 01:39 speedtest

virtiofsを有効にすると、なんと約8秒という結果が出ております!
約4~5倍の高速化が実現されていますね。

他にも、macOSユーザーコミュニティでファイルシステム操作の完了にかかる時間が最大98%短縮された例もあるみたいです。

「mutagen」 vs 「virtiofs」

せっかくなので、先日記事を上げたmutagen-composeとのファイル同期のパフォーマンスの比較もしてみました。

まずはdocker-compose.ymlの設定。

docker-compose.yml
version: "2"

services:
  web:
    image: httpd
    container_name: test-web
    volumes:
      - mutagen-volume:/var/test
    ports:
      - 8090:8090

volumes:
  mutagen-volume:

x-mutagen:
  sync:
    mutagen-volume:
      mode: "two-way-resolved" # 同期モード指定(ホスト ↔ コンテナ 双方を同期)
      alpha: "." # プロジェクトのパス
      beta: "volume://mutagen-volume" # volumeの指定

  • Docker + mutagen環境の起動
$ mutagen-compose up -d
# コンテナの中に入る
$ docker exec -it test-web bash

Docker Desktop for mac + mutagenの結果

~# cd /var/test

/var/test# time dd if=/dev/zero of=speedtest bs=1024 count=102400
102400+0 records in
102400+0 records out
104857600 bytes (105 MB, 100 MiB) copied, 0.301483 s, 348 MB/s

real    0m0.304s ← 結果
user    0m0.055s
sys     0m0.247s

/var/test# ls -lh speedtest
-rw-r--r-- 1 root root 100M Mar 24 01:44 speedtest

結果は、約0.3秒でした。
うん、ダントツで速いですね笑
勝敗は比べるまでもなくmutagenのほうが早かったです。

まとめ

確かに、今回の Docker Desktop for mac 4.6のアップデートで追加されたvirtiofsで、今までかなり遅かったファイル同期が改善された。
ローカル環境にブラウザからアクセスした際のページ読み込みのパフォーマンスもなかなか早くなっていて、使っていてもストレスはないと思った。
ただ、サードパーティーのファイル同期システムmutagenを使ったほうが断然早かったという結果になりました。

ちなみに、volume引数のオプションにdelegatedを設定すればDocker Desktop for mac + virtiofsだけでも十分速いかも。
これはまた今度試してみようと思います。

21
11
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
21
11

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?