💨

Rancher Desktop のデフォルト設定は遅い?

に公開

先日、Docker Desktop から Rancher Desktop へそのまま移行できるか試してみた という記事を書きましたが、その際に細かい設定はデフォルトのままで使い始めました。

少し使ってみて気づいたのは、ストレージ書き込み速度が遅いように感じることでした。そこで、仮想化エンジンとボリュームマウントの設定を見直してみました。

環境

  • Apple M2 MacBook Air(24GB RAM)
  • OS: Sonoma

まずは最適設定から掲載

Docker Desktop と同じ構成が選択できるので、基本的にはこれを適用します。

エミュレーションの設定

Rancher Desktop はデフォルトで QEMU が選択されていますが、VZ を選択しましょう。
Preferences -> Virtual Machine -> Emulation から設定できます。

VZ は macOS が提供する仮想化エミュレーターで、Linuxベースの仮想マシンを起動するためのAPIを提供しています。後述の Virtual I/O Deviceをサポートしています。

一方、QEMU は macOS はもちろん、Windows や Linux をホストOSとしても利用できるオープンソースの仮想化エミュレータです。

マウントタイプの設定

デフォルトでは reverse-sshfs が選択されていますが、virtiofs を選択しましょう。
Preferences -> Virtual Machine -> Volumes から設定できます。

reverse-sshfs は、ホストOS側のファイルシステムをSFTPサーバを経由して仮想マシンにマウントします。
一方、virtiofs は、Docker Desktop でも利用されているファイルシステムで、従来型のネットワークファイルシステムよりもオーバーヘッドを減らし高速化を実現しています。

ベンチマーク

念の為、ローカル、Docker Desktop のデフォルト設定、Rancher Desktop で設定できるいくつかの組み合わせでストレージ書き込み速度を計測してみました。

tl;dr

  • Rancher Desktop のデフォルト設定よりも、VZvirtiofs を選択した場合の方が書き込み速度が速い
  • デフォルトの QEMU & sshfs と比較すると 10倍近い性能が出ることもある

検証方法

以下の Python スクリプトを使って、ストレージ書き込み速度を計測しました。
500MB のランダムデータを生成し、5回書き込みを行い、その平均速度を計算しています。
毎回ランダムデータを生成する必要はないので、実行時の1回目だけキャッシュとしてメモリに保持しています。

こちらのリポジトリで公開しています: container-vol-performance-check

import os
import time
import random
import string
from datetime import datetime


class StoragePerformanceTest:
    def __init__(self, test_dir="./test_data"):
        self.test_dir = test_dir
        self.ensure_directory()

    def ensure_directory(self):
        """テストディレクトリが存在することを確認"""
        os.makedirs(self.test_dir, exist_ok=True)

    def generate_random_data(self, size_mb):
        """指定サイズのランダムデータを生成"""
        chars = string.ascii_letters + string.digits
        return ''.join(random.choice(chars) for _ in range(size_mb * 1024 * 1024)).encode()

    def write_test(self, file_size_mb, num_files, cache_random_data=True):
        """書き込みパフォーマンステスト"""
        total_time = 0
        total_size = 0

        print(f"\n=== 書き込みパフォーマンステスト ===")
        print(f"ファイルサイズ: {file_size_mb}MB")
        print(f"ファイル数: {num_files}")

        for i in range(num_files):
            if not cache_random_data or i == 0:
                print("Start generating random data")
                data = self.generate_random_data(file_size_mb)
                print("Random data generated")

            file_path = os.path.join(self.test_dir, f'test_file_{i}.dat')

            start_time = time.time()
            with open(file_path, 'wb') as f:
                f.write(data)
            end_time = time.time()

            write_time = end_time - start_time
            total_time += write_time
            total_size += file_size_mb

            print(f"ファイル {i + 1}: {file_size_mb}MB 書き込み完了 - {write_time:.2f}秒")

        avg_speed = (total_size / total_time) if total_time > 0 else 0
        print(f"\n=== 結果 ===")
        print(f"総書き込みサイズ: {total_size}MB")
        print(f"総書き込み時間: {total_time:.2f}秒")
        print(f"平均書き込み速度: {avg_speed:.2f}MB/秒")

        return {
            'total_size': total_size,
            'total_time': total_time,
            'avg_speed': avg_speed
        }

    def cleanup(self):
        """テストファイルの削除"""
        for file in os.listdir(self.test_dir):
            if file.startswith('test_file_'):
                os.remove(os.path.join(self.test_dir, file))


def main():
    # テストパラメータ
    FILE_SIZE_MB = 100  # 各ファイルのサイズ
    NUM_FILES = 5  # テストするファイル数

    # テストの実行
    test = StoragePerformanceTest()
    try:
        print(f"ストレージパフォーマンステスト開始: {datetime.now()}")
        results = test.write_test(FILE_SIZE_MB, NUM_FILES)
        print(f"\nテスト完了: {datetime.now()}")
    finally:
        test.cleanup()


if __name__ == "__main__":
    main()

Local

試行 書き込み時間 (秒) 書き込み速度 (MB/秒)
1 0.12 4321.94

サマリ

構成 書き込み時間 (秒) 書き込み速度 (MB/秒)
QEMU / 9p 128kb 11.10 45.11
QEMU / 9p 512kb 10.82 46.21
QEMU / reverse-sshfs 3.21 156.01
vz / reverse-sshfs 1.41 354.48
vz / virtiofs 0.48 1096.65
Docker Desktop デフォルト (vz / virtiofs) 0.40 1242.61

QEMU / 9p 128kb

9p を選択したときの初期設定のまま実行したパターンです。

試行 書き込み時間 (秒) 書き込み速度 (MB/秒)
1 10.66 46.90
2 10.90 45.89
3 11.75 42.55
平均 11.10 45.11

QEMU / 9p 512kb

こちらはブロックサイズを 128kb -> 512kb に変更したパターンです。
特に大きな改善は見られませんでした。

試行 書き込み時間 (秒) 書き込み速度 (MB/秒)
1 10.69 46.76
2 10.97 45.57
3 10.80 46.30
平均 10.82 46.21

QEMU / reverse-sshfs

Rancher Desktop のデフォルト設定です。

試行 書き込み時間 (秒) 書き込み速度 (MB/秒)
1 3.21 155.98
2 3.46 144.35
3 2.98 167.71
平均 3.21 156.01

vz / reverse-sshfs

仮想化エミュレーションを変更しただけのパターンです。まだ遅いですが、QEMUよりも早いことがわかります。

試行 書き込み時間 (秒) 書き込み速度 (MB/秒)
1 1.56 321.19
2 1.32 377.52
3 1.37 364.75
平均 1.41 354.48

vz / virtiofs

個人的推奨設定です。大幅に改善しています。

試行 書き込み時間 (秒) 書き込み速度 (MB/秒)
1 0.68 733.15
2 0.41 1213.59
3 0.37 1343.21
平均 0.48 1096.65

Docker Desktop デフォルト (vz / virtiofs)

おそらく誤差の範囲だと思いますが、 Rancher Desktop の vz / virtiofs よりも Docker Desktop の vz / virtiofs の方が速いようです。

試行 書き込み時間 (秒) 書き込み速度 (MB/秒)
1 0.40 1239.89
2 0.42 1191.05
3 0.39 1296.89
平均 0.40 1242.61

まとめ

macOS の場合、Rancher Desktop はデフォルト設定だとストレージ書き込み速度が遅いです。その場合、仮想化エミュレーションを VZ に、マウントタイプを virtiofs に変更することで改善できました。

/以上

GitHubで編集を提案

Discussion