このトピックでは、テスト条件を設定し、FIO を使用して raw ディスクとしての ESSD の IOPS をベンチマークする方法について説明します。
前提条件
-
テストツール:FIO を使用します。
説明Fio (Flexible I/O Tester) は、ランダムまたはシーケンシャルの読み書きなど、さまざまなワークロードでストレージデバイスをベンチマークするために使用される、強力なオープンソースの I/O テストツールです。
-
インスタンスタイプ:ecs.g7se.32xlarge の Elastic Compute Service (ECS) インスタンスを推奨します。詳細については、「汎用インスタンスファミリー (gシリーズ)」をご参照ください。
-
イメージ:最新バージョンの Linux パブリックイメージを使用します。このトピックでは、Alibaba Cloud Linux 3 を使用します。
説明テストの結果、一部の Linux ディストリビューションでは期待どおりのパフォーマンスが得られない場合があります。最良の結果を得るには、Alibaba Cloud が提供する公式の Alibaba Cloud Linux 3 イメージを使用することを推奨します。
-
ESSD:
-
raw ディスクをテストすることで、クラウドディスクのより正確なパフォーマンスメトリクスが得られます。FIO を raw ディスク上で直接実行して、そのパフォーマンスをテストすることを推奨します。
-
ESSD PL3 を推奨します。ESSD の詳細については、「ESSD」をご参照ください。
重要raw ディスクをテストすることで、最も正確なブロックストレージのパフォーマンス結果が得られます。ただし、パーティション、ファイルシステム、またはその他のデータが含まれるブロックストレージデバイスに対して Fio を直接実行すると、ファイルシステムエラーやデータ損失が発生する可能性があります。開始する前に、スナップショットを作成してデータをバックアップしてください。詳細については、「手動でスナップショットを作成する」をご参照ください。
データ損失を防ぐため、システムディスクまたはデータを含むデータディスクはテストしないよう強く推奨します。テストには、新規作成した未初期化の空のデータディスクを使用することを推奨します。
パフォーマンステストの結果はテスト環境で取得されたものであり、参考値です。本番環境では、ネットワーク状況や同時アクセスなどの要因により、クラウドディスクのパフォーマンスが変動する場合があります。実際のパフォーマンスとは異なる場合があります。
テスト完了後、新しいクラウドディスクを次のように処理します。
ディスクを保持する場合は、直接使用しないでください。データディスクを再初期化する必要があります。
ディスクが不要な場合は、データディスクをデタッチしてから、クラウドディスクをリリースします。
-
手順
ECS インスタンスに接続します。
詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。
-
次のコマンドを実行して、利用可能なブロックストレージデバイスを一覧表示します。
sudo fdisk -lu次の出力は、
/dev/vdaがシステムディスク、/dev/vdbと/dev/vdcがデータディスクである例です。[ecs-a ]$ sudo fdisk -lu Disk /dev/vda: 40 GiB, 42949672960 bytes, 83886080 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: F51132A7-67B1-4650-806D-FD0DE6E1210C Device Start End Sectors Size Type /dev/vda1 2048 6143 4096 2M BIOS boot /dev/vda2 6144 415743 409600 200M EFI System /dev/vda3 415744 83886046 83470303 39.8G Linux filesystem Disk /dev/vdb: 30 GiB, 32212254720 bytes, 62914560 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes Disklabel type: gpt Disk identifier: C36DF120-8650-4188-8043-AEF9C85F31EF Device Start End Sectors Size Type /dev/vdb1 2048 62912511 62910464 30G Linux filesystem Disk /dev/vdc: 40 GiB, 42949672960 bytes, 83886080 sectors Units: sectors of 1 * 512 = 512 bytes Sector size (logical/physical): 512 bytes / 512 bytes I/O size (minimum/optimal): 512 bytes / 512 bytes上記の出力は、インスタンスに 1 台のシステムディスク /dev/vda と 2 台のデータディスク /dev/vdb および /dev/vdc があることを示しています。
-
次のコマンドを実行して、ブロックストレージデバイスにパーティションまたはファイルシステムがあるかどうかを確認します。
sudo blkid[ecs-a]$ sudo blkid /dev/vdb1: UUID="9c32c24f-d2b8-4aa8-8xxx" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="primary" PARTUUID="4bd66635-f5f4-4dc0-9bdd-664fd5b8d2fb" /dev/vda2: SEC_TYPE="msdos" UUID="7E" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="82a50cd6-9899-41eb-91fe-7027bf257086" /dev/vda3: LABEL="root" UUID="beef9d8d-ba84-46d9-8xxx" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="e0d4fa20-912d-4e86-943e-6b0866xxx" /dev/vda1: PARTUUID="d083a7cd-a7ea-4898-89d5-8e1510bed584"上記のように、ブロックストレージデバイス /dev/vda と /dev/vdb にはパーティションとファイルシステムがあります。/dev/vdc に関しては情報が返されず、パーティションやファイルシステムがないことを示しています。
-
ブロックストレージのパフォーマンスをテストする前に、データ損失を防ぐため、テスト対象のデータがバックアップされていることを確認してください。詳細については、「手動スナップショットの作成」をご参照ください。
説明スナップショットの使用には料金が発生します。詳細については、「スナップショットの料金」をご参照ください。
-
libaio ライブラリと FIO ツールをインストールするには、次のコマンドを実行します。 オペレーティングシステムに応じてコマンドを選択します。
Alibaba Cloud Linux 2/3 および CentOS 6 以降
説明CentOS 6は寿命 (EOL) に達しました。 Linuxコミュニティルールに従って、すべてのコンテンツが次のCentOS 6リポジトリアドレスから削除され http://mirror.centos.org/centos-6/ た。 Alibaba CloudでデフォルトのCentOS 6リポジトリを引き続き使用すると、エラーが報告されます。 CentOS 6の特定のインストールパッケージを使用するには、CentOS 6リポジトリアドレスを変更します。 詳細については、「CentOS 6ソースアドレスの変更」をご参照ください。
sudo yum install libaio libaio-devel fio -yDebian 9 以降および Ubuntu 14 以降
重要Debian 9 および 10 はサポート終了 (EOL) となったため、これらのバージョンを実行している ECS インスタンスでは、まずリポジトリアドレスを変更する必要があります。詳細については、「CentOS/Debian EOLのリポジトリアドレスの変更」をご参照ください。
sudo apt-get update sudo apt-get install libaio* fio -y -
/tmp ディレクトリに移動します。
cd /tmp -
test100w.sh スクリプトを作成します。
sudo vim test100w.sh -
次の内容を test100w.sh ファイルに貼り付けます。 詳細については、「Test100w.sh スクリプト」をご参照ください。
#!/bin/bash DEV_NODE=your_device DEV_NAME=/dev/$DEV_NODE function CheckHasFS { local device=$1 # デバイスのパス。 # デバイスが存在するかどうかを確認します。 if [ ! -b "$device" ]; then echo "Error: Device $device does not exist" exit 1 fi # `blkid` コマンドを使用して、パーティションテーブルとファイルシステムのタイプを確認します。 local pt_type=$(sudo blkid -o value -s PTTYPE "$device") local fs_type=$(sudo blkid -o value -s TYPE "$device") if [ -n "$pt_type" ] || [ -n "$fs_type" ]; then return 1 else return 0 fi } CheckHasFS "$DEV_NAME" if [ $? -eq 1 ]; then echo "$DEV_NAME contains a partition table or a file system. Stop the fio script!" exit 1 fi function RunFio { numjobs=$1 # インスタンス内のテストスレッド数。例:10。 iodepth=$2 # 同時にサブミットできるI/Oリクエストの最大数。例:128。 bs=$3 # 単一I/Oブロックのサイズ。例:4k。 rw=$4 # テストの読み書きポリシー。例:randwrite。 size=$5 # テストのサイズ。例:1024g。 filename=$6 # テストファイルの名前。例:/dev/your_device。 nr_cpus=`cat /proc/cpuinfo |grep "processor" |wc -l` if [ $nr_cpus -lt $numjobs ];then echo "Numjobs is more than cpu cores, exit!" exit -1 fi let nu=$numjobs+1 cpulist="" for ((i=1;i<10;i++)) do list=`cat /sys/block/$DEV_NODE/mq/*/cpu_list | awk '{if(i<=NF) print $i;}' i="$i" | tr -d ',' | tr '\n' ','` if [ -z $list ];then break fi cpulist=${cpulist}${list} done spincpu=`echo $cpulist | cut -d ',' -f 2-${nu}` echo $spincpu fio --ioengine=libaio --runtime=30s --numjobs=${numjobs} --iodepth=${iodepth} --bs=${bs} --size=${size} --rw=${rw} --filename=${filename} --time_based=1 --direct=1 --name=test --group_reporting --cpus_allowed=$spincpu --cpus_allowed_policy=split } echo 2 > /sys/block/$DEV_NODE/queue/rq_affinity sleep 5 RunFio 10 128 4k randwrite 1024g $DEV_NAME -
必要に応じて test100w.sh スクリプトを変更します。
-
すべての
your_deviceパラメーターを、nvme1n1 などの実際のデバイス名に置き換えます。 -
実際の状況に応じて、
RunFio 10 64 4k randwrite /dev/your_deviceコマンドの 10 (numjobs)、64 (iodepth)、4k (bs)、randwrite (rw)、および /dev/your_device の値を設定します。 -
numjobsの値は、CPU コアの数を超えないようにします。CPU コアの数を確認するには、次のコマンドを実行します。cat /proc/cpuinfo |grep "processor" |wc -l
-
-
ESSD のパフォーマンスをテストするために、次のコマンドを実行してください。
sudo sh test100w.sh-
コマンド出力の
IOPS=***を含む行は、ESSD の IOPS を示します。job1: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=128 ... fio-3.7 Starting 6 processes Jobs: 6 (f=6): [w(6)][100.0%][r=0KiB/s,w=3932MiB/s][r=0,w=1007k IOPS][eta 00m:00s] job1: (groupid=0, jobs=6): err= 0: pid=42693: Thu Jun 23 15:32:28 2022 write: IOPS=1005k, BW=3925MiB/s (4116MB/s)(38.4GiB/10015msec) slat (nsec): min=728, max=9562.2k, avg=5157.38, stdev=47881.11 clat (usec): min=82, max=25001, avg=758.61, stdev=843.67 lat (usec): min=86, max=25042, avg=763.86, stdev=844.85 clat percentiles (usec): | 1.00th=[ 190], 5.00th=[ 347], 10.00th=[ 445], 20.00th=[ 537], | 30.00th=[ 586], 40.00th=[ 635], 50.00th=[ 652], 60.00th=[ 676], | 70.00th=[ 693], 80.00th=[ 717], 90.00th=[ 824], 95.00th=[ 1254], | 99.00th=[ 4424], 99.50th=[ 6849], 99.90th=[10814], 99.95th=[15008], | 99.99th=[19530] bw ( KiB/s): min=573448, max=732136, per=16.69%, avg=670799.74, stdev=26159.23, samples=120 iops : min=143362, max=183034, avg=167699.93, stdev=6539.81, samples=120 lat (usec) : 100=0.01%, 250=2.26%, 500=11.66%, 750=71.40%, 1000=8.11% lat (msec) : 2=3.38%, 4=2.02%, 10=1.04%, 20=0.11%, 50=0.01% cpu : usr=14.45%, sys=24.23%, ctx=401609, majf=0, minf=236 IO depths : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=110.0% submit : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0% complete : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1% issued rwts: total=0,10062326,0,0 short=0,0,0,0 dropped=0,0,0,0 latency : target=0, window=0, percentile=100.00%, depth=128 Run status group 0 (all jobs): WRITE: bw=3925MiB/s (4116MB/s), 3925MiB/s-3925MiB/s (4116MB/s-4116MB/s), io=38.4GiB (41.2GB), run=10015-10015msec Disk stats (read/write): nvme1n1: ios=4Z/11063917, merge=0/0, ticks=5/8026436, in_queue=9632482, util=100.00% -
次の出力が表示された場合、テストディスクにはパーティションまたはファイルシステムがあります。FIO スクリプトは、データの安全性を確保するため停止します。テストには、新しい空のデータディスクを使用してください。
[[ecs-user@ecs tmp]$ sudo sh test100w.sh /dev/vdb contains a partition table or a file system. Stop the fio script!警告テスト対象にパーティション、ファイルシステム、またはその他のデータがある場合、FIO をテスト対象上で直接実行すると、ファイルシステムのエラーやデータ損失が発生します。データディスクにパーティションとファイルシステムがある場合は、テスト用に新しい空のデータディスクを作成することを推奨します。
-
同じ設定の従量課金クラウドディスクを作成し、そのディスクをインスタンスにアタッチしてテストできます。詳細については、「データディスクの作成」をご参照ください。
-
テスト完了後、必要に応じてディスクをデタッチしてリリースできます。詳細については、「データディスクのデタッチ」および「クラウドディスクのリリース」をご参照ください。
-
-
test100w.sh スクリプト
-
以下のコマンドは、ブロックデバイスの
rq_affinityパラメーターを 2 に設定します。echo 2 > /sys/block/your_device/queue/rq_affinityrq_affinity の値
値の説明
1
ブロックデバイスが I/O 操作を完了すると、完了イベントはリクエストを発行したのと同じ vCPU グループに送信されます。マルチスレッドおよび同時実行シナリオでは、これがボトルネックとなり、パフォーマンスが制限されます。
2
ブロックデバイスが I/O 操作を完了すると、完了イベントはリクエストを発行した vCPU で処理されます。マルチスレッドおよび同時実行シナリオでは、各 vCPU のパフォーマンスを最大限に活用できます。
-
次のコマンドは、異なる
jobsを異なる CPU コアにバインドします。fio -ioengine=libaio -runtime=30s -numjobs=${numjobs} -iodepth=${iodepth} -bs=${bs} -rw=${rw} -filename=${filename} -time_based=1 -direct=1 -name=test -group_reporting -cpus_allowed=$spincpu -cpus_allowed_policy=split説明通常モードでは、デバイスにはリクエストキューが 1 つしかありません。マルチスレッドおよび同時 I/O シナリオでは、この単一のリクエストキューがパフォーマンスのボトルネックになる可能性があります。マルチキューモードでは、デバイスは複数のリクエストキューを使用して I/O を処理し、バックエンドストレージのパフォーマンスを最大限に引き出すことができます。この機能を効果的に使用するには、異なるリクエストキューに対応する異なる CPU コアに I/O スレッドをバインドする必要があります。
パラメーター
説明
例
numjobsI/O スレッドの数。
10
/dev/your_deviceESSD のデバイス名。
/dev/nvme1n1
cpus_allowed_policyFIO は、vCPU をバインドするために
cpus_allowed_policyとcpus_allowedパラメーターを提供します。split
直前のコマンドは、複数の
jobsを実行し、異なる Queue_Id 値に対応する別々の CPU コアにバインドします。 Queue_Id 値にバインドされている cpu_core_id 値をクエリするには、次のコマンドを実行します。-
ls /sys/block/your_device/mq/コマンドを実行します。 コマンドのyour_deviceは、nvme1n1 などの実際のデバイス名に置き換えます。 このコマンドは、指定されたデバイスのQueue_Id値を照会します。 -
cat /sys/block/your_device/mq/*/cpu_listコマンドを実行します。コマンドのyour_deviceを、nvme1n1 などの実際のデバイス名に置き換えます。このコマンドは、指定されたデバイスの各リクエストキューにどの CPU コアがバインドされているかを示します。
-