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 とスループットを測定する場合は、既存のファイル システムの新しいディレクトリに対してベンチマークを行います。
テストの準備をする
依存関係をインストールします。
sudo apt update sudo apt install -y fio
ハイパーディスクがまだフォーマットされていない場合は、ディスクをフォーマットしてマウントします。
ターミナルで、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 ボリュームをテストします。ディスク上に新しいディレクトリ
fiotest
を作成します。この例では、ディスクは/mnt/disks/mnt_dir
にマウントされます。TEST_DIR=/mnt/disks/mnt_dir/fiotest sudo mkdir -p $TEST_DIR
VM で Hyperdisk アタッチメントに NVMe ディスク インターフェースを使用する場合(未加工ディスク名が
nvme
で始まる場合)、VM で使用可能な NUMA ノードの数を取得するには、次の手順を行います。NVMe ディスクのベンチマーク戦略は、NUMA ノードが 1 つしかない VM と複数の NUMA ノードを持つ VM で異なります。NVMe ディスク インターフェースを使用して Hyperdisk のパフォーマンスをテストする場合、キューごとに 256 の NVMe キューサイズのみが割り当てられます。利用可能な NVMe キューサイズは限られており、同じ VM にアタッチされている他のディスクからの競合が発生する可能性があるため、ベンチマーク テストでは 2 つの NVMe ディスクキューを使用して、iodepth 256 を処理できる集約キューサイズを維持します。
NUMA ノードの数を取得します。
lscpu | grep -i 'numa node(s)' | awk '{print $NF}'
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 以上)で順次書き込みを行って書き込みスループットをテストします。
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
Hyperdisk で NVMe インターフェースを使用する場合:
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
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 をテストします。
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
Hyperdisk で NVMe インターフェースを使用する場合:
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
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 以上)で順次読み取りを実行して読み取りスループットをテストします。
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
Hyperdisk で NVMe インターフェースを使用する場合:
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
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 をテストします。
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
Hyperdisk で NVMe インターフェースを使用する場合:
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
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 キューにマッピングされています。このセクションのベンチマーク テストでは、このマッピングが想定されています。
テストの準備をする
新しい Hyperdisk Extreme ディスクを VM に追加し、Hyperdisk のパフォーマンスの上限を参照して、ターゲット パフォーマンスに必要なディスク設定を導き出します。
インスタンスに接続します。
依存関係をインストールします。
sudo apt update sudo apt install -y fio
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
この例では、
nvme0n2
、nvme0n3
、nvme0n4
という名前のデバイスを使用して、3 つの 2,500 GiB Hyperdisk Extreme ボリュームで Google Cloud Hyperdisk のパフォーマンスをテストします。
C3 上の Hyperdisk Extreme のスループットのベンチマーク
このセクションでは、Hyperdisk Extreme ディスクの読み取り / 書き込みスループットの両方のベンチマークを行う方法について説明します。
テストの準備
176 個の vCPU を備えた C3 VM にアタッチされている Hyperdisk Extreme ディスクのパフォーマンスのベンチマークを開始する前に、次の手順を完了します。
オペレーティング システムに新しいディレクトリ
fiotest
を作成します。この例では、ルート ディレクトリは/mnt/disks/mnt_dir
です。TEST_DIR=/mnt/disks/mnt_dir/fiotest sudo mkdir -p $TEST_DIR
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
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
クリーンアップ
テストファイルを削除します。
sudo rm -rf $TEST_DIR/*
RAID ボリュームをマウント解除して停止します。
sudo umount /dev/md0 sudo mdadm --stop /dev/md0
アタッチされた Hyperdisk ボリュームを切断して削除します。
gcloud compute instances detach-disk
コマンドとgcloud compute disks delete
コマンドをご覧ください。
未加工の Hyperdisk のパフォーマンスのベンチマーク
開発環境以外で Hyperdisk 単体のパフォーマンスを測定する場合は、使い捨てのディスクと VM でブロック デバイスの読み取りと書き込みのパフォーマンスをテストします。
次のコマンドは、VM に 3,500 GiB の Hyperdisk Extreme ボリュームがアタッチされていることを前提としています。このディスクサイズは、32 vCPU VM のスループットの上限値を達成するために必要な値です。デバイスサイズが異なる場合は、次のコマンドで --filesize
引数の値を変更します。VM マシンタイプのパフォーマンス上限の詳細については、マシンタイプのサポートをご覧ください。
テストの準備をする
依存関係をインストールします。
sudo apt-get update sudo apt-get install -y fio
RAW ディスクへのパスを取得します。パスを変数に格納します。次の例では、RAW ディスクパスとして
/dev/nvme0n2
を使用します。TEST_DIR=/dev/nvme0n2
ディスクにゼロ以外のデータを入力します。空のブロックからの 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
VM で Hyperdisk アタッチメントに NVMe ディスク インターフェースを使用する場合(未加工ディスク名が
nvme
で始まる場合)、VM で使用可能な NUMA ノードの数を取得するには、次の手順を行います。NVMe ディスクのベンチマーク戦略は、NUMA ノードが 1 つしかない VM と複数の NUMA ノードを持つ VM で異なります。NVMe ディスク インターフェースを使用して Hyperdisk のパフォーマンスをテストする場合、キューごとに 256 の NVMe キューサイズのみが割り当てられます。利用可能な NVMe キューサイズは限られており、同じ VM にアタッチされている他のディスクからの競合が発生する可能性があるため、ベンチマーク テストでは 2 つの NVMe ディスクキューを使用して、iodepth 256 を処理できる集約キューサイズを維持します。
NUMA ノードの数を取得します。
lscpu | grep -i 'numa node(s)' | awk '{print $NF}'
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 以上)で順次書き込みを行い、書き込みスループットをテストします。
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
Hyperdisk で NVMe インターフェースを使用する場合:
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
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 をテストします。
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
Hyperdisk Extreme ボリュームが NVMe インターフェースを使用してアタッチされている場合:
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
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 以上)で順次読み取りを実行して読み取り帯域幅をテストします。
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
Hyperdisk Extreme ボリュームが NVMe インターフェースを使用してアタッチされている場合:
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
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
を指定します。
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
Hyperdisk Extreme ボリュームが NVMe インターフェースを使用してアタッチされている場合:
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
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 を削除する。
次のステップ
- Hyperdisk の料金を確認する。