Hyperdisk のパフォーマンスのベンチマーク


Hyperdisk のパフォーマンスのベンチマークを実施するために、dd などの他のディスク ベンチマーク ツールではなく、フレキシブル I/O テスター(FIO)を使用します。デフォルトでは、dd で使用される I/O キューの深さは非常に浅く、ベンチマークの際に、精度の高いディスク パフォーマンス テストを行ううえで十分なバイト数と I/O オペレーションを生成できません。

また、dd で使用される特殊なデバイスには動作の非常に遅いものが多く、ディスクのパフォーマンスを正確に反映していません。通常は Hyperdisk パフォーマンス ベンチマークで /dev/urandom/dev/random/dev/zero などの特殊なデバイスは使用しないでください。

実行中のインスタンスで使用されているディスクの IOPS とスループットを測定するには、測定用に作られた構成でファイル システムのベンチマークを行います。そうすることにより、既存のディスクの内容を失わずに現実的なワークロードをテストできます。既存のディスクでファイル システムをベンチマークすると、開発環境固有のさまざまな要素がベンチマーク結果に影響を与える可能性があり、その結果、ディスク パフォーマンスの上限に届かないことがある点にご注意ください。

Hyperdisk の純粋なパフォーマンスを測定するには、ブロック デバイスを直接ベンチマークします。この方法を使用して、純粋なディスク パフォーマンスとディスク パフォーマンスの上限を比較します。

以下のコマンドは、apt パッケージ管理システムを使用して Debian または Ubuntu オペレーティング システムで動作します。

実行中のインスタンスのディスクの IOPS とスループットをベンチマークする

ディスクの内容を失うことなく、実行中の VM インスタンスのアクティブなディスクについて、現実的なワークロードの IOPS とスループットを測定する場合は、既存のファイル システムの新しいディレクトリに対してベンチマークを行います。

テストの準備をする

  1. インスタンスに接続します

  2. 依存関係をインストールします。

    sudo apt update
    sudo apt install -y fio
    
  3. ハイパーディスクがまだフォーマットされていない場合は、ディスクをフォーマットしてマウントします。

  4. ターミナルで、VM にアタッチされているディスクを一覧表示し、テストするディスクを見つけます。

    sudo lsblk
    

    このコマンドによって、次のような出力が生成されます。

    NAME         MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
    nvme0n1      259:0    0    10G  0 disk
    ├─nvme0n1p1  259:1    0   9.9G  0 part  /
    ├─nvme0n1p14 259:2    0     4M  0 part
    └─nvme0n1p15 259:3    0   106M  0 part  /boot/efi
    nvme0n2      259:4    0   3.4T  0 disk
    

    この例では、デバイス名が nvme0n2 の 3,500 GiB の Hyperdisk Extreme ボリュームをテストします。

  5. ディスク上に新しいディレクトリ fiotest を作成します。この例では、ディスクは /mnt/disks/mnt_dir にマウントされます。

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  6. VM で Hyperdisk アタッチメントに NVMe ディスク インターフェースを使用する場合(未加工ディスク名が nvme で始まる場合)、VM で使用可能な NUMA ノードの数を取得するには、次の手順を行います。

    NVMe ディスクのベンチマーク戦略は、NUMA ノードが 1 つしかない VM と複数の NUMA ノードを持つ VM で異なります。NVMe ディスク インターフェースを使用して Hyperdisk のパフォーマンスをテストする場合、キューごとに 256 の NVMe キューサイズのみが割り当てられます。利用可能な NVMe キューサイズは限られており、同じ VM にアタッチされている他のディスクからの競合が発生する可能性があるため、ベンチマーク テストでは 2 つの NVMe ディスクキューを使用して、iodepth 256 を処理できる集約キューサイズを維持します。

    1. NUMA ノードの数を取得します。

      lscpu | grep -i 'numa node(s)' | awk '{print $NF}'
      
    2. VM に NUMA ノードが 1 つしかない場合は、CPU から NVMe へのキューのマッピングを取得します。この情報は後で --cpus-allowed パラメータで使用します。

      QUEUE_1_CPUS=$(cat /sys/class/block/nvme0n2/mq/*/cpu_list | sed -n 1p | tr -d " \t")
      QUEUE_2_CPUS=$(cat /sys/class/block/nvme0n2/mq/*/cpu_list | sed -n 2p | tr -d " \t")
      

書き込みスループットをテストする

I/O ブロックサイズを 1 MB、I/O の深さを 64 以上に指定し、複数の並列ストリーム(16 以上)で順次書き込みを行って書き込みスループットをテストします。

  1. Hyperdisk で SCSI インターフェースを使用する場合:

    sudo fio --directory=$TEST_DIR \
    --numjobs=16 --size=10G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
    --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
    --name=write_throughput
    
  2. Hyperdisk で NVMe インターフェースを使用する場合:

    1. VM に NUMA ノードが 1 つしかない場合は、次のコマンドを使用します。

      sudo fio --directory=$TEST_DIR --numjobs=8 \
      --size=10G --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=write_throughput --cpus_allowed=$QUEUE_1_CPUS \
      --name=write_throughput_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. VM に複数の NUMA ノードがある場合は、次のコマンドを使用します。

      sudo fio --directory=$TEST_DIR --numjobs=8 \
      --size=10G --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --group_reporting \
      --name=write_throughput --numa_cpu_nodes=0 \
      --name=write_throughput_2 --numa_cpu_nodes=1
      

書き込み IOPS をテストする

I/O ブロックサイズを 4 KB、I/O の深さを 256 以上に指定し、ランダムな書き込みを行って書き込み IOPS をテストします。

  1. Hyperdisk が SCSI インターフェースを使用してアタッチされている場合:

    sudo fio --directory=$TEST_DIR \
    --numjobs=16 --size=10G -time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256 \
    --name=write_iops
    
  2. Hyperdisk で NVMe インターフェースを使用する場合:

    1. VM に NUMA ノードが 1 つしかない場合は、次のコマンドを使用します。

      sudo fio --directory=$TEST_DIR --numjobs=8 \
      --size=10G --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=write_iops --cpus_allowed=$QUEUE_1_CPUS \
      --name=write_iops_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. VM に複数の NUMA ノードがある場合は、次のコマンドを使用します。

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --group_reporting \
      --name=write_iops --numa_cpu_nodes=0 \
      --name=write_iops_2 --numa_cpu_nodes=1
      

読み取りスループットをテストする

I/O ブロックサイズを 1 MB、I/O の深さを 64 以上に指定し、複数の並列ストリーム(16 以上)で順次読み取りを実行して読み取りスループットをテストします。

  1. Hyperdisk で SCSI インターフェースを使用する場合:

    sudo fio --directory=$TEST_DIR \
    --numjobs=16 --size=10G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
    --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
    --name=read_throughput
    
  2. Hyperdisk で NVMe インターフェースを使用する場合:

    1. VM に NUMA ノードが 1 つしかない場合は、次のコマンドを使用します。

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=read_throughput --cpus_allowed=$QUEUE_1_CPUS \
      --name=read_throughput_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. VM に複数の NUMA ノードがある場合は、次のコマンドを使用します。

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --group_reporting \
      --name=read_throughput --numa_cpu_nodes=0 \
      --name=read_throughput_2 --numa_cpu_nodes=1
      

読み取り IOPS をテストする

I/O ブロックサイズを 4 KB、I/O の深さを 256 以上に指定し、ランダムな読み取りを行って読み取り IOPS をテストします。

  1. Hyperdisk で SCSI インターフェースを使用する場合:

    sudo fio --directory=$TEST_DIR \
    --numjobs=16 --size=10G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
    --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
    --name=read_iops
    
  2. Hyperdisk で NVMe インターフェースを使用する場合:

    1. VM に NUMA ノードが 1 つしかない場合は、次のコマンドを使用します。

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=read_iops --cpus_allowed=$QUEUE_1_CPUS \
      --name=read_iops_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. VM に複数の NUMA ノードがある場合は、次のコマンドを使用します。

      sudo fio --directory=$TEST_DIR --numjobs=8 --size=10G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --group_reporting \
      --name=read_iops --numa_cpu_nodes=0 \
      --name=read_iops_2 --numa_cpu_nodes=1
      

クリーンアップ

テスト ディレクトリを削除します。

sudo rm $TEST_DIR/write* $TEST_DIR/read*

C3 VM 上の Hyperdisk Extreme の IOPS とスループットのベンチマーク

Google Cloud Hyperdisk Extreme は、176 個の vCPU を備えた C3 VM で高いパフォーマンスを提供します。高いパフォーマンス上限を達成するには、複数の Hyperdisk Extreme ボリュームを VM にアタッチする必要があります。

既存のデータディスクの内容を失わずに、実行中の C3 VM におけるアクティブ ディスク上の現実的なワークロードの 1 秒あたりの I/O(IOPS)またはスループットを測定するには、既存のファイル システムの新しいディレクトリに対してベンチマークを行い、ベンチマーク タスクのために新しい Hyperdisk Extreme ボリュームを VM にアタッチします。

NVMe インターフェースにアタッチされたディスクの場合は、VM で使用可能なすべての NVMe キューに I/O ワークロードを分散することを推奨します。これにより、Hyperdisk のパフォーマンスが最大化されます。176 個の vCPU を備えた C3 VM には、4 つの NUMA ノードが 1 対 1 で 4 つの NVMe キューにマッピングされています。このセクションのベンチマーク テストでは、このマッピングが想定されています。

テストの準備をする

  1. 新しい Hyperdisk Extreme ディスクを VM に追加し、Hyperdisk のパフォーマンスの上限を参照して、ターゲット パフォーマンスに必要なディスク設定を導き出します。

  2. インスタンスに接続します。

  3. 依存関係をインストールします。

    sudo apt update
    sudo apt install -y fio
    
  4. VM にアタッチされているディスクを一覧表示し、テストするディスクを探します。

    sudo lsblk
    

    このコマンドによって、次のような出力が生成されます。

    NAME         MAJ:MIN RM   SIZE RO TYPE  MOUNTPOINT
    nvme0n1      259:0    0    10G  0 disk
    ├─nvme0n1p1  259:1    0   9.9G  0 part  /
    ├─nvme0n1p14 259:2    0     4M  0 part
    └─nvme0n1p15 259:3    0   106M  0 part  /boot/efi
    nvme0n2      259:4    0   2.5T  0 disk
    nvme0n3      259:5    0   2.5T  0 disk
    nvme0n4      259:6    0   2.5T  0 disk
    

    この例では、nvme0n2nvme0n3nvme0n4 という名前のデバイスを使用して、3 つの 2,500 GiB Hyperdisk Extreme ボリュームで Google Cloud Hyperdisk のパフォーマンスをテストします。

C3 上の Hyperdisk Extreme のスループットのベンチマーク

このセクションでは、Hyperdisk Extreme ディスクの読み取り / 書き込みスループットの両方のベンチマークを行う方法について説明します。

テストの準備

176 個の vCPU を備えた C3 VM にアタッチされている Hyperdisk Extreme ディスクのパフォーマンスのベンチマークを開始する前に、次の手順を完了します。

  1. オペレーティング システムに新しいディレクトリ fiotest を作成します。この例では、ルート ディレクトリは /mnt/disks/mnt_dir です。

    TEST_DIR=/mnt/disks/mnt_dir/fiotest
    sudo mkdir -p $TEST_DIR
    
  2. VM が最高のパフォーマンス レベルを達成するには複数のディスクが必要なため、わかりやすくするために、アタッチされているすべての Hyperdisk ボリュームで RAID 0 を実行します。これにより、複数の Hyperdisk ボリューム間でデータを均等に分散することが容易になります。

    この例の RAID 0 は、C3 VM にアタッチされている 3 つの Hyperdisk Extreme ボリュームのパフォーマンスです。

    sudo mdadm --create /dev/md0 --level=0 --raid-devices=3 /dev/nvme0n2 /dev/nvme0n3 /dev/nvme0n4
    
  3. RAID ボリューム /dev/md0フォーマットしてマウントします。

書き込みスループットをテストする

I/O ブロックサイズを 1 MiB、NVMe キューごとに合計 I/O の深さを 32 以上で使用し、複数の並列ストリーム(16 以上)で順次書き込みを実行して書き込みスループットをテストします。

# Running this command causes data loss on the targeted file on the device.
# We strongly recommend using a throwaway disk.

sudo fio --name=global --group_reporting=1 --filesize=1024G \
--filename=$TEST_DIR/fiotestfile --numjobs=4 --size=64G \
--offset_increment=64G --time_based --runtime=5m \
--ramp_time=10s --ioengine=libaio --direct=1 --verify=0 \
--bs=1M --iodepth=8 --rw=write \
--name=write_throughput --numa_cpu_nodes=0 \
--name=write_throughput_1 --numa_cpu_nodes=1 \
--name=write_throughput_2 --numa_cpu_nodes=2 \
--name=write_throughput_3 --numa_cpu_nodes=3

読み取りスループットをテストする

I/O ブロックサイズを 1 MiB、NVMe キューごとに合計 I/O の深さを 32 以上で使用し、複数の並列ストリーム(16 以上)で順次読み取りを実行して読み取りスループットをテストします。

sudo fio --name=global --group_reporting=1 --filesize=1024G \
--filename=$TEST_DIR/fiotestfile --numjobs=4 --size=64G \
--offset_increment=64G --time_based --runtime=5m \
--ramp_time=10s --ioengine=libaio --direct=1 \
--verify=0 --bs=1M --iodepth=8 --rw=read \
--name=read_throughput --numa_cpu_nodes=0 \
--name=read_throughput_1 --numa_cpu_nodes=1 \
--name=read_throughput_2 --numa_cpu_nodes=2 \
--name=read_throughput_3 --numa_cpu_nodes=3

C3 上の Hyperdisk Extreme の IOPS のベンチマーク

1 秒あたりの I/O(IOPS)パフォーマンスのベンチマークを行うには、(RAID を使用しない)素のディスクに直接、または素のディスクから並列の小規模 I/O オペレーションを実行することを推奨します。

書き込み IOPS をテストする

I/O ブロックサイズを 4 KiB、I/O の深さを 256 以上で使用し、少なくとも 2 つの NVMe キューを活用して、ランダムな書き込みを行って書き込み IOPS をテストします。

# Running this command causes data loss on the targeted device.
# We strongly recommend using a throwaway disk.

sudo fio --name=global --group_reporting=1 \
--directory=/ --bs=4K --direct=1 \
--filesize=512G --iodepth=256 \
--iodepth_batch_complete_max=256 --iodepth_batch_submit=256 \
--ioengine=libaio --numjobs=5 --ramp_time=10s \
--randrepeat=0 --runtime=5m --rw=randwrite \
--time_based=1 --verify=0 \
--name=write_iops_test --filename=/dev/nvme0n2 --numa_cpu_nodes=0 \
--name=write_iops_test_1 --filename=/dev/nvme0n3  --numa_cpu_nodes=1 \
--name=write_iops_test_2 --filename=/dev/nvme0n4 --numa_cpu_nodes=2

読み取り IOPS をテストする

I/O ブロックサイズを 4 KiB、I/O の深さを 256 以上で使用し、少なくとも 2 つの NVMe キューを使用して、ランダム読み取りを実行して読み取り IOPS をテストします。

sudo fio --name=global --group_reporting=1 --directory=/ \
--bs=4K --direct=1 --filesize=512G --iodepth=256 \
--iodepth_batch_complete_max=256 --iodepth_batch_submit=256 \
--ioengine=libaio --numjobs=5 --ramp_time=10s \
--randrepeat=0 --runtime=5m --rw=randread \
--time_based=1 --verify=0 \
--name=read_iops_test --filename=/dev/nvme0n2 --numa_cpu_nodes=0 \
--name=read_iops_test_1 --filename=/dev/nvme0n3  --numa_cpu_nodes=1 \
--name=read_iops_test_2 --filename=/dev/nvme0n4 --numa_cpu_nodes=2

C3 上の Hyperdisk Extreme のレイテンシのベンチマーク

I/O レイテンシをテストしている間、VM が帯域幅の制限または IOPS の上限に達しないようにします。その場合、レイテンシに実際の Hyperdisk I/O レイテンシが反映されません。たとえば、I/O の深さ 30 で VM が IOPS の上限に達するときに fio コマンドでその 2 倍を指定した場合、合計 IOPS は変わらず、報告される I/O レイテンシは 2 倍になります。

現実的な I/O レイテンシを得るには、1 つの素のディスク デバイスを直接ターゲットにするだけで十分です。

書き込みレイテンシをテストする

I/O ブロックサイズを 4 KiB、I/O の深さを 4 で使用して、ランダムな書き込みを行って書き込みレイテンシをテストします。

# Running this command causes data loss on the targeted device.
# We strongly recommend using a throwaway disk.

sudo fio --filename=/dev/nvme0n2  \
--filesize=512G --time_based \
--runtime=5m --ramp_time=10s --ioengine=libaio \
--direct=1 --verify=0 --bs=4K --iodepth=4 --rw=randwrite \
--iodepth_batch_submit=4 --iodepth_batch_complete_max=4 \
--name=write_latency

読み取りレイテンシをテストする

I/O ブロックサイズを 4 KiB、I/O の深さを 4 で使用して、ランダム読み取りを実行して読み取りレイテンシをテストします。

sudo fio --filename=/dev/nvme0n2  \
--filesize=512G --time_based \
--runtime=5m --ramp_time=10s --ioengine=libaio \
--direct=1 --verify=0 --bs=4K --iodepth=4 --rw=randread \
--iodepth_batch_submit=4 --iodepth_batch_complete_max=4 \
--name=read_latency

クリーンアップ

  1. テストファイルを削除します。

    sudo rm -rf $TEST_DIR/*
    
  2. RAID ボリュームをマウント解除して停止します。

    sudo umount /dev/md0
    sudo mdadm --stop /dev/md0
    
  3. アタッチされた Hyperdisk ボリュームを切断して削除します。gcloud compute instances detach-disk コマンドと gcloud compute disks delete コマンドをご覧ください。

未加工の Hyperdisk のパフォーマンスのベンチマーク

開発環境以外で Hyperdisk 単体のパフォーマンスを測定する場合は、使い捨てのディスクと VM でブロック デバイスの読み取りと書き込みのパフォーマンスをテストします。

次のコマンドは、VM に 3,500 GiB の Hyperdisk Extreme ボリュームがアタッチされていることを前提としています。このディスクサイズは、32 vCPU VM のスループットの上限値を達成するために必要な値です。デバイスサイズが異なる場合は、次のコマンドで --filesize 引数の値を変更します。VM マシンタイプのパフォーマンス上限の詳細については、マシンタイプのサポートをご覧ください。

テストの準備をする

  1. インスタンスに接続します

  2. 依存関係をインストールします。

    sudo apt-get update
    sudo apt-get install -y fio
    
  3. RAW ディスクへのパスを取得します。パスを変数に格納します。次の例では、RAW ディスクパスとして /dev/nvme0n2 を使用します。

    TEST_DIR=/dev/nvme0n2
    
  4. ディスクにゼロ以外のデータを入力します。空のブロックからの Hyperdisk 読み取りには、データを含むブロックとは異なるレイテンシ プロファイルがあります。読み取りレイテンシのベンチマークを実施する前に、データをディスクに入力しておくことをおすすめします。

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    
    sudo fio --name=fill_disk \
    --filename=$TEST_DIR --filesize=2500G \
    --ioengine=libaio --direct=1 --verify=0 --randrepeat=0 \
    --bs=128K --iodepth=64 --rw=randwrite \
    --iodepth_batch_submit=64  --iodepth_batch_complete_max=64
    
  5. VM で Hyperdisk アタッチメントに NVMe ディスク インターフェースを使用する場合(未加工ディスク名が nvme で始まる場合)、VM で使用可能な NUMA ノードの数を取得するには、次の手順を行います。

    NVMe ディスクのベンチマーク戦略は、NUMA ノードが 1 つしかない VM と複数の NUMA ノードを持つ VM で異なります。NVMe ディスク インターフェースを使用して Hyperdisk のパフォーマンスをテストする場合、キューごとに 256 の NVMe キューサイズのみが割り当てられます。利用可能な NVMe キューサイズは限られており、同じ VM にアタッチされている他のディスクからの競合が発生する可能性があるため、ベンチマーク テストでは 2 つの NVMe ディスクキューを使用して、iodepth 256 を処理できる集約キューサイズを維持します。

    1. NUMA ノードの数を取得します。

      lscpu | grep -i 'numa node(s)' | awk '{print $NF}'
      
    2. VM に NUMA ノードが 1 つしかない場合は、CPU から NVMe へのキューのマッピングを取得します。この情報は後で --cpus-allowed パラメータで使用します。

      QUEUE_1_CPUS=$(cat /sys/class/block/nvme0n2/mq/*/cpu_list | sed -n 1p | tr -d " \t")
      QUEUE_2_CPUS=$(cat /sys/class/block/nvme0n2/mq/*/cpu_list | sed -n 2p | tr -d " \t")
      

書き込みスループットをテストする

I/O サイズを 1 MB、I/O の深さを 64 以上で使用して、複数の並列ストリーム(16 以上)で順次書き込みを行い、書き込みスループットをテストします。

  1. Hyperdisk が SCSI インターフェースを使用してアタッチされている場合:

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    
    sudo fio --filename=$TEST_DIR \
    --numjobs=16 --size=500G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
    --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
    --offset_increment=20G \
    --name=write_throughput
    
  2. Hyperdisk で NVMe インターフェースを使用する場合:

    1. VM に NUMA ノードが 1 つしかない場合は、次のコマンドを使用します。

      # Running this command causes data loss on the second device.
      # We strongly recommend using a throwaway VM and disk.
      
      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --cpus_allowed_policy=split \
      --offset_increment=20G --group_reporting \
      --name=write_throughput --cpus_allowed=$QUEUE_1_CPUS \
      --name=write_throughput_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. VM に複数の NUMA ノードがある場合は、次のコマンドを使用します。

      # Running this command causes data loss on the second device.
      # We strongly recommend using a throwaway VM and disk.
      
      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=write \
      --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
      --offset_increment=20G --group_reporting \
      --name=write_throughput --numa_cpu_nodes=0 \
      --name=write_throughput_2 --numa_cpu_nodes=1
      

書き込み IOPS をテストする

Hyperdisk IOPS を最大にするには、I/O キューを深くする必要があります。たとえば、書き込みレイテンシが 1 ミリ秒の場合、VM は処理中の各 I/O に対して最大 1,000 IOPS を達成できます。15,000 の書き込み IOPS を達成するには、VM は少なくとも 15 の処理中の I/O オペレーションを維持する必要があります。ディスクと VM が 30,000 の書き込み IOPS を達成するには、処理中の I/O オペレーションの数は 30 以上である必要があります。I/O サイズが 4 KB より大きい場合、VM は IOPS の上限に達する前に帯域幅の制限に達することがあります。

I/O ブロックサイズを 4 KB、I/O の深さを 256 以上に指定し、ランダムな書き込みを行って書き込み IOPS をテストします。

  1. Hyperdisk Extreme ボリュームが SCSI インターフェースを使用してアタッチされている場合:

    # Running this command causes data loss on the second device.
    # We strongly recommend using a throwaway VM and disk.
    
    sudo fio --filename=$TEST_DIR \
    --numjobs=16 --size=500G -time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
    --iodepth_batch_submit=256  --iodepth_batch_complete_max=256 \
    --name=write_iops
    
  2. Hyperdisk Extreme ボリュームが NVMe インターフェースを使用してアタッチされている場合:

    1. VM に NUMA ノードが 1 つしかない場合は、次のコマンドを使用します。

      # Running this command causes data loss on the second device.
      # We strongly recommend using a throwaway VM and disk.
      
      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=write_write_iops --cpus_allowed=$QUEUE_1_CPUS \
      --name=write_write_iops_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. VM に複数の NUMA ノードがある場合は、次のコマンドを使用します。

      # Running this command causes data loss on the second device.
      # We strongly recommend using a throwaway VM and disk.
      
      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randwrite \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --group_reporting \
      --name=write_iops --numa_cpu_nodes=0 \
      --name=write_iops_2 --numa_cpu_nodes=1
      

書き込みレイテンシをテストする

I/O レイテンシをテストしている間、VM が帯域幅の制限または IOPS の上限に達しないようにします。そうしないと、レイテンシに実際の Hyperdisk の I/O レイテンシが反映されません。たとえば、I/O の深さ 30 で IOPS の上限に達するときに fio コマンドでその 2 倍を指定した場合、合計 IOPS は変わらず、報告される I/O レイテンシは 2 倍になります。

# Running this command causes data loss on the second device.
# We strongly recommend using a throwaway VM and disk.
sudo fio --filename=$TEST_DIR \
--filesize=500G --time_based \
--runtime=5m --ramp_time=10s --ioengine=libaio \
--direct=1 --verify=0 --bs=4K --iodepth=4 --rw=randwrite \
--iodepth_batch_submit=4 --iodepth_batch_complete_max=4 \
--name=write_latency

読み取り帯域幅をテストする

I/O サイズを 1 MB、I/O の深さを 64 以上で使用し、複数の並列ストリーム(16 以上)で順次読み取りを実行して読み取り帯域幅をテストします。

  1. Hyperdisk Extreme ボリュームが SCSI インターフェースを使用してアタッチされている場合:

     sudo fio --filename=$TEST_DIR \
     --numjobs=16 --size=500G --time_based \
     --runtime=5m --ramp_time=10s --ioengine=libaio \
     --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
     --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
     --offset_increment=20G --name=read_bandwidth
  2. Hyperdisk Extreme ボリュームが NVMe インターフェースを使用してアタッチされている場合:

    1. VM に NUMA ノードが 1 つしかない場合は、次のコマンドを使用します。

        sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
        --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
        --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
        --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
        --cpus_allowed_policy=split \
        --offset_increment=20G --group_reporting \
        --name=read_bandwidth --cpus_allowed=$QUEUE_1_CPUS \
        --name=read_bandwidth_2 --cpus_allowed=$QUEUE_2_CPUS
    2. VM に複数の NUMA ノードがある場合は、次のコマンドを使用します。

        sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
        --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
        --direct=1 --verify=0 --bs=1M --iodepth=64 --rw=read \
        --iodepth_batch_submit=64 --iodepth_batch_complete_max=64 \
        --offset_increment=20G --group_reporting \
        --name=read_bandwidth --numa_cpu_nodes=0 \
        --name=read_bandwidth_2 --numa_cpu_nodes=1

読み取り IOPS をテストする

Hyperdisk IOPS を最大にするには、I/O キューを深くする必要があります。たとえば、I/O サイズが 4 KB より大きい場合、VM は IOPS の上限に達する前に帯域幅の制限に達することがあります。マシンタイプで使用可能な最大読み取り IOPS を達成するには、このテストに --iodepth=256 を指定します。

  1. Hyperdisk Extreme ボリュームが SCSI インターフェースを使用してアタッチされている場合:

    sudo fio --filename=$TEST_DIR \
    --numjobs=16 --size=500G --time_based \
    --runtime=5m --ramp_time=10s --ioengine=libaio \
    --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
    --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
    --name=read_iops
    
  2. Hyperdisk Extreme ボリュームが NVMe インターフェースを使用してアタッチされている場合:

    1. VM に NUMA ノードが 1 つしかない場合は、次のコマンドを使用します。

      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --cpus_allowed_policy=split \
      --group_reporting \
      --name=read_iops --cpus_allowed=$QUEUE_1_CPUS \
      --name=read_iops_2 --cpus_allowed=$QUEUE_2_CPUS
      
    2. VM に複数の NUMA ノードがある場合は、次のコマンドを使用します。

      sudo fio --filename=$TEST_DIR --numjobs=8 --size=500G \
      --time_based --runtime=5m --ramp_time=10s --ioengine=libaio \
      --direct=1 --verify=0 --bs=4K --iodepth=256 --rw=randread \
      --iodepth_batch_submit=256 --iodepth_batch_complete_max=256 \
      --group_reporting \
      --name=read_iops --numa_cpu_nodes=0 \
      --name=read_iops_2 --numa_cpu_nodes=1
      

読み取りレイテンシをテストする

現実的なレイテンシ測定を行うには、ディスクにデータを書き込む必要があります。このテスト中は、VM が IOPS やスループットの上限に達しないことが重要です。Hyperdisk ボリュームが飽和限度に達すると、受信 I/O オペレーションを差し戻します。この差し戻しが I/O レイテンシの「見せかけ」の増加として反映されます。

 sudo fio --filename=$TEST_DIR \
 --filesize=500G --time_based \
 --runtime=5m --ramp_time=10s --ioengine=libaio \
 --direct=1 --verify=0 --bs=4K --iodepth=4 --rw=randread \
 --iodepth_batch_submit=4 --iodepth_batch_complete_max=4 \
 --name=read_latency

クリーンアップ

使い捨てのディスクと VM を推奨どおりに使用した場合、ベンチマーク テスト完了後に次のことができます。

  • ディスクを切断して削除する。
  • VM を削除する。

次のステップ