Alibaba Cloud Enterprise SSD (ESSD) は、25ギガビットイーサネットおよびリモートダイレクトメモリアクセス (RDMA) テクノロジーを使用して、ディスクあたり最大1,000,000のランダムな読み取り /書き込みIOPSを提供し、一方向のレイテンシを削減します。 このトピックでは、次のセクションで説明するテスト条件に基づいて、生のESSDのIOPSパフォーマンスをテストする方法について説明します。
テスト条件
テストツール: フレキシブルI/Oテスター (fio) を使用します。
説明fioはオープンソースの強力なI/Oパフォーマンスベンチマークツールで、ランダムな読み書き操作やシーケンシャルな読み書き操作など、ブロックストレージデバイスのパフォーマンス指標をテストできます。
インスタンスタイプ: ecs.g7se.32xlargeインスタンスタイプを使用することを推奨します。 インスタンスタイプの詳細については、「汎用インスタンスファミリー (gシリーズ) 」をご参照ください。
イメージ: Alibaba Cloudが提供する新しいバージョンのLinuxパブリックイメージを使用します。 次の例では、Alibaba Cloud Linux 3が使用されています。
説明テスト結果によると、ESSDは特定のLinuxディストリビューションイメージで期待されるIOPSパフォーマンスを達成できない可能性があります。 Alibaba Cloud Linux 3イメージを使用するElastic Compute Service (ECS) インスタンスにESSDをアタッチすることを推奨します。
ESSD:
rawディスクでのテストは、実際のディスクパフォーマンスを得るのに役立ちます。 fioツールを使用して、生のディスクのIOPSパフォーマンスをテストすることをお勧めします。
パフォーマンスレベル3のESSD (PL3 ESSD) を使用することを推奨します。 ESSDの詳細については、「ESSD」をご参照ください。
重要rawディスクでのテストは、実ブロックストレージのパフォーマンスを得るのに役立ちます。 ブロックストレージデバイスにパーティション、ファイルシステム、およびデータが含まれている場合、fioツールを直接使用すると、ファイルシステムで例外が発生し、データが失われる可能性があります。 上記の問題を防ぐために、fioツールを使用してデバイスをテストする前に、テストするブロックストレージデバイスのスナップショットを作成してディスクデータをバックアップすることをお勧めします。 詳細については「スナップショットの作成」をご参照ください。
データの損失を防ぐために、オペレーティングシステムが存在するシステムディスクまたはデータを含むデータディスクをテストオブジェクトとして使用しないことをお勧めします。 fioツールを使用して、新しい空のデータディスクのパフォーマンスをテストすることをお勧めします。
パフォーマンステストの結果はテスト環境で得られ、参照用です。 本番環境では、ネットワーク環境や同時実行アクセスなどの要因により、クラウドディスクのパフォーマンスが異なる場合があります。
手順
ECS インスタンスに接続します。
詳細については、「Workbenchを使用したSSH経由のLinuxインスタンスへの接続」をご参照ください。
次のコマンドを実行して、ブロックストレージデバイスの名前を照会します。
sudo fdisk -lu
前の図は、インスタンスに /dev/vdaという名前のシステムディスクと、/dev/vdbおよび /dev/vdcという名前の2つのデータディスクの3つのブロックストレージデバイスがあることを示しています。
次のコマンドを実行して、パーティションとファイルシステムがブロックストレージデバイスに存在するかどうかを照会します。
sudo blkid
上の図は、/dev/vdaおよび /dev/vdbという名前のブロックストレージデバイスにパーティションとファイルシステムがあることを示しています。 コマンド出力には、/dev/vdcという名前のブロックストレージデバイスに関する情報は含まれていません。これは、ブロックストレージデバイスにパーティションやファイルシステムがないことを示しています。
ブロックストレージデバイスのパフォーマンスをテストする前に、データの損失を防ぐために、デバイスに保存されているデータをバックアップしていることを確認してください。 詳細については「スナップショットの作成」をご参照ください。
説明スナップショットに対して課金されます。 スナップショットの課金については、「スナップショット」をご参照ください。
オペレーティングシステムに基づいて、次のいずれかのコマンドを実行してlibaioライブラリとfioツールをインストールします。
Alibaba Cloud Linux 2、Alibaba Cloud Linux 3、またはCentOS 6以降
重要CentOS 6とCentOS 8は、寿命 (EOL) に達しました。 インスタンスがCentOS 6またはCentOS 8を実行している場合は、オペレーティングシステムのリポジトリアドレスを変更します。 詳細については、「」をご参照ください。CentOS 6リポジトリアドレスを変更するにはどうすればよいですか? CentOS 8リポジトリアドレスの変更
sudo yum install libaio libaio-devel fio -y
Debian 9以降、またはUbuntu 14以降
重要Debian9とDebian10はEOLに到達しました。 インスタンスがDebian 9またはDebian 10を実行している場合は、オペレーティングシステムのリポジトリアドレスを変更します。 詳細については、「」をご参照ください。Debian 9またはDebian 10リポジトリのアドレスを変更するにはどうすればよいですか。
sudo apt-get update sudo apt-get install libaio* fio -y
次のコマンドを実行して、パスを変更します。
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 # The device path. # Check whether the device exists. if [ ! -b "$device" ]; then echo "Error: The $device device does not exist." exit 1 fi # Run the blkid command to check the partition table and file system type. 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 "The $DEV_NAME device contains a partition table or a file system. The fio script is stopped." exit 1 fi function RunFio { numjobs=$1 # The number of test threads. In this example, the value is 10. iodepth=$2 # The maximum number of concurrent I/O requests. In this example, the value is 64. bs=$3 # The data block size per I/O. In this example, the value is 4k. rw=$4 # The read and write policy. In this example, the value is randwrite. size=$5 filename=$6 # The name of the test file. In this example, the value is /dev/your_device. nr_cpus=`cat /proc/cpuinfo |grep "processor" |wc -l` if [ $nr_cpus -lt $numjobs ];then echo "The value of the numjobs parameter is greater than the number of CPU cores. The test is stopped." 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実際のビジネスシナリオに基づいたスクリプト。
_device
を、テストするESSDの実際のデバイス名に置き換えます。 例: nvme1n1.10 (numjobs) 、64 (iodepth) 、4k (bs) 、randwrite (rw) 、および
RunFio 10 64 4k randwrite /dev/your_device
行の /dev/your_deviceを実際の値に置き換えます。numjobsパラメーターの値は、CPUコアの数を超えることはできません。 次のコマンドを実行して、CPUコアの数を照会できます。
cat /proc/cpuinfo |grep "processor" |wc -l
次のコマンドを実行して、ESSDのパフォーマンスをテストします。
sudo sh test100w.sh
次の図は、コマンド出力のサンプルを示しています。
IOPS=***
パラメーターは、ESSDのIOPSを示します。次のサンプルコードに示す結果が返された場合、テストオブジェクトにはパーティションまたはファイルシステムが含まれます。 データのセキュリティを確保するために、fioスクリプトは停止されます。 テストを実行するには、空のデータディスクを作成することを推奨します。
[[ecs-user@ecs tmp]$ sudo sh test100w.sh The /dev/vdb device contains a partition table or a file system. The fio script is stopped.
警告テストオブジェクトにパーティション、ファイルシステム、およびデータが含まれている場合、fioツールを直接使用すると、ファイルシステムで例外が発生し、データが失われる可能性があります。 データディスクにパーティションとファイルシステムがある場合は、空のデータディスクを作成し、新しいディスクをテストすることをお勧めします。
データディスクと同じ仕様の従量課金ディスクを作成し、テスト用に新しいディスクをインスタンスに接続できます。 詳細については、「空のデータディスクの作成」をご参照ください。
テストが完了したら、ビジネス要件に基づいて従量課金ディスクをデタッチしてリリースできます。 詳細については、「データディスクのデタッチ」および「ディスクのリリース」をご参照ください。
test100w.shスクリプトの詳細
test100w.shスクリプトで、次のコマンドは
rq_affinity
パラメーターを2に設定します。echo 2 > /sys/block/your_device/queue/rq_affinity
rq_affinityの値
説明
1
ブロックデバイスが、受け取ったI/O完了イベントを、対応するI/O要求を送信するvCPUのグループに配信することを示します。 複数のスレッドが同時に実行されるシナリオでは、I/O完了イベントが1つのvCPUにのみ配信され、パフォーマンスのボトルネックを引き起こす可能性があります。
2
ブロックデバイスが受け取ったI/O完了イベントを、対応するI/O要求を送信するvCPUに配信することを示します。 複数のスレッドが同時に実行されるシナリオでは、各vCPUが最大のパフォーマンスを発揮できます。
次のコマンドは、
ジョブ
を実行してキューを異なる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
説明通常モードでは、デバイスは単一の要求キューを有する。 複数のスレッドがI/O要求を同時に処理すると、要求キューはパフォーマンスのボトルネックになります。 マルチキューモードでは、デバイスは複数のリクエストキューを使用してI/Oリクエストを処理し、最大のバックエンドストレージパフォーマンスを提供できます。 たとえば、4つのI/Oスレッドがあるとします。 マルチキューモードを最大限に活用し、ストレージパフォーマンスを向上させるには、I/Oスレッドを、異なるリクエストキューに対応するCPUコアにバインドする必要があります。
パラメーター
説明
値の例
numjobs
I/O スレッドの数。
10
/dev/your_device
ESSDのデバイス名。
/dev/nvme1n1
cpus_allowed_ポリシー
fioツールがvCPUをバインドするために提供するパラメーター。 fioツールは、vCPUをバインドするための
cpus_allowed_policy
およびcpus_allowed
パラメーターを提供します。split
上記のコマンドは、異なるキューIDを持つキューを異なるCPUコアにバインドする
ジョブ
を実行します。 キューがバインドされているCPUコアのIDを表示するには、次のコマンドを実行します。ls /sys/block/your_device/mq/
コマンドを実行します。 コマンドで、_device
パラメーターを実際のデバイス名に置き換えます。 例: nvme1n1. このコマンドは、デバイス名が /dev/vd * 形式のESSDのキューのIDを返します。cat /sys/block/your_device/mq/cpu_listコマンドを実行します。
コマンドで、
_device
のパラメーターを実際のデバイス名に置き換えます。 例: nvme1n1. コマンドは、ESSDのキューがバインドされているCPUコアのIDを返します。 ESSDのデバイス名は /dev/vd * 形式です。