ローカル SSD のパフォーマンスのベンチマーク


ストレージ オプションを選択するで説明したローカル SSD のパフォーマンス上限は、ローカル SSD インスタンスで特定の設定を使用した場合のものです。推奨のローカル SSD 設定でインスタンスを構成しているときに、仮想マシン(VM)インスタンスのパフォーマンスがこの上限に到達しない場合、Compute Engine チームが使用している設定を複製することで、パフォーマンスの実際の上限と公表されている上限を比較できます。

以下の手順では、apt パッケージ マネージャーがインストールされた Linux オペレーティングシステムを使用していることを前提としています。

1 台のローカル SSD デバイスを接続した VM を作成する

VM が接続できるローカル SSD の数は、VM の作成に使用するマシンタイプによって異なります。詳細については、有効な数のローカル SSD を選択するをご覧ください。

  1. ワークロードに応じて、デバイスごとに 4 基または 8 基の vCPU を備えるローカル SSD インスタンスを作成します。

    たとえば、次のコマンドは、4 基の vCPU と 1 台のローカル SSD を備えた C3 VM を作成します。

    gcloud compute instances create c3-ssd-test-instance \
        --machine-type "c3-standard-4-lssd"
    

    第 2 世代以前のマシンタイプでは、--local-ssd フラグを使用して VM に接続するローカル SSD の数を指定します。次のコマンドは、8 個の vCPU と 1 個のローカル SSD を備え、NVMe ディスク インターフェースを使用する N2 VM を作成します。

    gcloud compute instances create ssd-test-instance \
        --machine-type "n2-standard-8" \
        --local-ssd interface=nvme
    
  2. VM で次のスクリプトを実行します。このスクリプトは、パフォーマンスのセクションで説明した SSD パフォーマンスの数値を達成するために必要な設定を複製します。ここで、--bs パラメータはブロックサイズを定義します。ブロックサイズは、異なるタイプの読み取り / 書き込みオペレーションの結果に影響を与えます。

    # install tools
    sudo apt-get -y update
    sudo apt-get install -y fio util-linux
    
    # discard Local SSD sectors
    sudo blkdiscard /dev/disk/by-id/google-local-nvme-ssd-0
    
    # full write pass - measures write bandwidth with 1M blocksize
    sudo fio --name=writefile \
    --filename=/dev/disk/by-id/google-local-nvme-ssd-0 --bs=1M --nrfiles=1 \
    --direct=1 --sync=0 --randrepeat=0 --rw=write --end_fsync=1 \
    --iodepth=128 --ioengine=libaio
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --time_based --name=readbenchmark --runtime=30 --ioengine=libaio \
    --filename=/dev/disk/by-id/google-local-nvme-ssd-0  --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=4 --rw=randread --blocksize=4k --group_reporting
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --time_based --name=writebenchmark  --runtime=30 --ioengine=libaio \
    --filename=/dev/disk/by-id/google-local-nvme-ssd-0 --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=4 --rw=randwrite --blocksize=4k --group_reporting
    

最大数のローカル SSD を接続した VM を作成する

  1. 1 つのインスタンスに 24 台以上のローカル SSD デバイスを接続する場合は、32 基以上の vCPU を備えたマシンタイプを使用します。

    次のコマンドは、NVMe インターフェースを使用して最大許容数の ローカル SSD ディスクを接続した VM を作成します。

    ローカル SSD を VM に接続する

    gcloud compute instances create ssd-test-instance \
        --machine-type "n1-standard-32" \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme \
        --local-ssd interface=nvme
    

    -lssd マシンタイプを使用する

    新しいマシンシリーズでは、事前定義された数のローカル SSD ディスクを備えた -lssd マシンタイプが提供されます。たとえば、32 台のローカル SSD(容量は 12 TiB)を備えた VM のベンチマークを行うには、次のコマンドを使用します。

    gcloud compute instances create ssd-test-instance \
        --machine-type "c3-standard-176-lssd"
    
  2. mdadm ツールをインストールします。mdadm のインストール プロセスには、スクリプトを停止するユーザー プロンプトが含まれているため、このプロセスは手動で実行してください。

    Debian と Ubuntu

    sudo apt update && sudo apt install mdadm --no-install-recommends
    

    CentOS と RHEL

    sudo yum install mdadm -y
    

    SLES と openSUSE

    sudo zypper install -y mdadm
    
  3. find コマンドを使用して、一緒にマウントするすべてのローカル SSD を特定します。

    find /dev/ | grep google-local-nvme-ssd
    

    出力は次のようになります。

    /dev/disk/by-id/google-local-nvme-ssd-23
    /dev/disk/by-id/google-local-nvme-ssd-22
    /dev/disk/by-id/google-local-nvme-ssd-21
    /dev/disk/by-id/google-local-nvme-ssd-20
    /dev/disk/by-id/google-local-nvme-ssd-19
    /dev/disk/by-id/google-local-nvme-ssd-18
    /dev/disk/by-id/google-local-nvme-ssd-17
    /dev/disk/by-id/google-local-nvme-ssd-16
    /dev/disk/by-id/google-local-nvme-ssd-15
    /dev/disk/by-id/google-local-nvme-ssd-14
    /dev/disk/by-id/google-local-nvme-ssd-13
    /dev/disk/by-id/google-local-nvme-ssd-12
    /dev/disk/by-id/google-local-nvme-ssd-11
    /dev/disk/by-id/google-local-nvme-ssd-10
    /dev/disk/by-id/google-local-nvme-ssd-9
    /dev/disk/by-id/google-local-nvme-ssd-8
    /dev/disk/by-id/google-local-nvme-ssd-7
    /dev/disk/by-id/google-local-nvme-ssd-6
    /dev/disk/by-id/google-local-nvme-ssd-5
    /dev/disk/by-id/google-local-nvme-ssd-4
    /dev/disk/by-id/google-local-nvme-ssd-3
    /dev/disk/by-id/google-local-nvme-ssd-2
    /dev/disk/by-id/google-local-nvme-ssd-1
    /dev/disk/by-id/google-local-nvme-ssd-0
    

    find は順序を保証するものではありません。出力行の数が予想される SSD パーティションの数と一致している限り、デバイスが異なる順序で表示されていても問題ありません。

    SCSI デバイスを使用している場合は、次の find コマンドを使用します。

    find /dev/ | grep google-local-ssd
    

    NVMe デバイスはすべて google-local-nvme-ssd-# の形式、SCSI デバイスはすべて google-local-ssd-# の形式にする必要があります。

  4. mdadm ツールを使用して、複数のローカル SSD デバイスを /dev/md0 という名前の 1 つの配列に結合します。次の例では、NVMe インターフェースを使用する 24 台のローカル SSD デバイスを結合します。SCSI を使用するローカル SSD デバイスについては、手順 3 で find コマンドから返されたデバイス名を使用します。

    sudo mdadm --create /dev/md0 --level=0 --raid-devices=24 \
    /dev/disk/by-id/google-local-nvme-ssd-0 \
    /dev/disk/by-id/google-local-nvme-ssd-1 \
    /dev/disk/by-id/google-local-nvme-ssd-2 \
    /dev/disk/by-id/google-local-nvme-ssd-3 \
    /dev/disk/by-id/google-local-nvme-ssd-4 \
    /dev/disk/by-id/google-local-nvme-ssd-5 \
    /dev/disk/by-id/google-local-nvme-ssd-6 \
    /dev/disk/by-id/google-local-nvme-ssd-7 \
    /dev/disk/by-id/google-local-nvme-ssd-8 \
    /dev/disk/by-id/google-local-nvme-ssd-9 \
    /dev/disk/by-id/google-local-nvme-ssd-10 \
    /dev/disk/by-id/google-local-nvme-ssd-11 \
    /dev/disk/by-id/google-local-nvme-ssd-12 \
    /dev/disk/by-id/google-local-nvme-ssd-13 \
    /dev/disk/by-id/google-local-nvme-ssd-14 \
    /dev/disk/by-id/google-local-nvme-ssd-15 \
    /dev/disk/by-id/google-local-nvme-ssd-16 \
    /dev/disk/by-id/google-local-nvme-ssd-17 \
    /dev/disk/by-id/google-local-nvme-ssd-18 \
    /dev/disk/by-id/google-local-nvme-ssd-19 \
    /dev/disk/by-id/google-local-nvme-ssd-20 \
    /dev/disk/by-id/google-local-nvme-ssd-21 \
    /dev/disk/by-id/google-local-nvme-ssd-22 \
    /dev/disk/by-id/google-local-nvme-ssd-23
    

    レスポンスは次の例のようになります。

    mdadm: Defaulting to version 1.2 metadata
    mdadm: array /dev/md0 started.
    

    配列の詳細は mdadm --detail で確認できます。--prefer=by-id フラグを追加すると、/dev/disk/by-id パスを使用するデバイスが一覧表示されます。

     sudo mdadm --detail --prefer=by-id /dev/md0
    

    出力は、配列内のデバイスごとに次のように表示されます。

     ...
     Number   Major   Minor   RaidDevice State
     0     259        0        0      active sync   /dev/disk/by-id/google-local-nvme-ssd-0
     ...
    
  5. VM で次のスクリプトを実行します。このスクリプトは、パフォーマンスのセクションで説明した SSD パフォーマンスの数値を達成するために必要な設定を複製します。ここで、--bs パラメータはブロックサイズを定義します。さまざまなタイプの読み取りオペレーションと書き込みオペレーションの結果に影響を与えます。

    # install tools
    sudo apt-get -y update
    sudo apt-get install -y fio util-linux
    
    # full write pass - measures write bandwidth with 1M blocksize
    sudo fio --name=writefile \
    --filename=/dev/md0 --bs=1M --nrfiles=1 \
    --direct=1 --sync=0 --randrepeat=0 --rw=write --end_fsync=1 \
    --iodepth=128 --ioengine=libaio
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --time_based --name=benchmark  --runtime=30 \
    --filename=/dev/md0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=32 --rw=randread --blocksize=4k --group_reporting --norandommap
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --time_based --name=benchmark  --runtime=30 \
    --filename=/dev/md0 --ioengine=libaio --randrepeat=0 \
    --iodepth=128 --direct=1 --invalidate=1 --verify=0 --verify_fatal=0 \
    --numjobs=32 --rw=randwrite --blocksize=4k --group_reporting --norandommap
    

Storage Optimized VM のベンチマーク

  1. ストレージ最適化 VM(Z3 ファミリーなど)は、デバイス パーティションに対して直接ベンチマークする必要があります。パーティション名は lsblk で取得できます。

    lsblk -o name,size -lpn | grep 2.9T | awk '{print $1}'
    

    出力は次のようになります。

    /dev/nvme1n1
    /dev/nvme2n1
    /dev/nvme3n1
    /dev/nvme4n1
    /dev/nvme5n1
    /dev/nvme6n1
    /dev/nvme7n1
    /dev/nvme8n1
    /dev/nvme9n1
    /dev/nvme10n1
    /dev/nvme11n1
    /dev/nvme12n1
    
  2. コロンで区切ってローカル SSD パーティションに対してベンチマークを直接実行します。

    # install benchmarking tools
    sudo apt-get -y update
    sudo apt-get install -y fio util-linux
    
    # Full Write Pass.
    # SOVM achieves max read performance on previously written/discarded ranges.
    sudo  fio --readwrite=write --blocksize=1m --iodepth=4 --ioengine=libaio \
    --direct=1 --group_reporting \
    --name=job1 --filename=/dev/nvme1n1 --name=job2 --filename=/dev/nvme2n1 \
    --name=job3 --filename=/dev/nvme3n1 --name=job4 --filename=/dev/nvme4n1 \
    --name=job5 --filename=/dev/nvme5n1 --name=job6 --filename=/dev/nvme6n1 \
    --name=job7 --filename=/dev/nvme7n1 --name=job8 --filename=/dev/nvme8n1 \
    --name=job9 --filename=/dev/nvme9n1 --name=job10 --filename=/dev/nvme10n1 \
    --name=job11  --filename=/dev/nvme11n1 --name=job12 --filename=/dev/nvme12n1
    
    # rand read - measures max read IOPS with 4k blocks
    sudo fio --readwrite=randread --blocksize=4k --iodepth=128  \
    --numjobs=4 --direct=1 --runtime=30 --group_reporting  --ioengine=libaio \
    --name=job1 --filename=/dev/nvme1n1 --name=job2 --filename=/dev/nvme2n1 \
    --name=job3 --filename=/dev/nvme3n1 --name=job4 --filename=/dev/nvme4n1 \
    --name=job5 --filename=/dev/nvme5n1 --name=job6 --filename=/dev/nvme6n1 \
    --name=job7 --filename=/dev/nvme7n1 --name=job8 --filename=/dev/nvme8n1 \
    --name=job9 --filename=/dev/nvme9n1 --name=job10 --filename=/dev/nvme10n1 \
    --name=job11  --filename=/dev/nvme11n1 --name=job12 --filename=/dev/nvme12n1
    
    # rand write - measures max write IOPS with 4k blocks
    sudo fio --readwrite=randwrite --blocksize=4k --iodepth=128 \
    --numjobs=4 --direct=1 --runtime=30 --group_reporting --ioengine=libaio \
    --name=job1 --filename=/dev/nvme1n1 --name=job2 --filename=/dev/nvme2n1 \
    --name=job3 --filename=/dev/nvme3n1 --name=job4 --filename=/dev/nvme4n1 \
    --name=job5 --filename=/dev/nvme5n1 --name=job6 --filename=/dev/nvme6n1 \
    --name=job7 --filename=/dev/nvme7n1 --name=job8 --filename=/dev/nvme8n1 \
    --name=job9 --filename=/dev/nvme9n1 --name=job10 --filename=/dev/nvme10n1 \
    --name=job11  --filename=/dev/nvme11n1 --name=job12 --filename=/dev/nvme12n1
    

次のステップ