Alibaba Cloud Enterprise SSD (ESSD) は、25ギガビットイーサネットおよびリモートダイレクトメモリアクセス (RDMA) テクノロジーを使用して、ディスクあたり最大1,000,000のランダムな読み取り /書き込みIOPSを提供し、一方向のレイテンシを削減します。 このトピックでは、ESSDのIOPSパフォーマンスをテストする方法について説明します。 次の例で説明するように、テスト条件を設定できます。
テスト条件
テストツール: フレキシブルI/Oテスター (fio) を使用します。
説明fioはオープンソースの強力なI/Oパフォーマンスベンチマークツールで、ランダムな読み書き操作やシーケンシャルな読み書き操作など、ブロックストレージデバイスのパフォーマンス指標をテストできます。
インスタンスタイプ: ecs.g7se.32xlargeインスタンスタイプを使用することを推奨します。 詳細については、「汎用インスタンスファミリー」トピックの「g7se, storage-enhanced general-purpose instance family」セクションをご参照ください。
イメージ: Alibaba Cloudが提供する最新バージョンのLinuxパブリックイメージを使用します。 この例では、Alibaba Cloud Linux 3が使用されています。
説明テスト結果によると、ESSDは特定のLinuxディストリビューションイメージで期待されるIOPSパフォーマンスを達成できない可能性があります。 Alibaba Cloudによって管理されているAlibaba Cloud Linux 3イメージを使用することを推奨します。
ESSD:
生ディスクをテストすると、実際のディスクパフォーマンスが得られます。 fioツールを使用して、生のディスクのIOPSパフォーマンスをテストすることをお勧めします。
パフォーマンスレベル3のESSD (PL3 ESSD) を使用することを推奨します。 ESSDの詳細については、「ESSD」をご参照ください。
重要生ディスクをテストすると、正確なテスト結果が得られますが、生ディスクのファイルシステム構造が破壊される可能性があります。 上記の問題を防ぐために、ディスクのスナップショットを作成してディスクデータをバックアップすることを推奨します。 詳細については「スナップショットの作成」をご参照ください。
データの損失を防ぐために、オペレーティングシステムが存在するシステムディスクまたは重要なデータを含むディスクをテストオブジェクトとして使用しないことを強くお勧めします。 ツールを使用して、重要なデータがない新しいデータディスクまたは一時ディスクのブロックストレージパフォーマンスをテストすることをお勧めします。
システムディスクに対して生のディスクストレステストを実行する場合は、サービスを展開する前に、ストレステストを完了してオペレーティングシステムをリセットすることをお勧めします。 これはストレステストによって引き起こされる潜在的な問題を防ぎ、システムの長期安定した操作を保障するのを助けます。
パフォーマンステストの結果はテスト環境で得られ、参照用です。 実際の本番環境では、ネットワーク環境や同時実行アクセスなどの要因により、クラウドディスクのパフォーマンスが異なる場合があります。
手順
ECS インスタンスに接続します。
詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。
次のコマンドを実行して、libaioライブラリとfioツールをインストールします。
sudo yum install libaio libaio-devel fio -y
次のコマンドを実行して、パスを変更します。
cd /tmp
次のコマンドを実行して、test100w.shスクリプトを作成します。
sudo vim test100w.sh
次のコンテンツをtest100w.shスクリプトに貼り付けます。
スクリプトの内容については、このトピックの「test100w.shスクリプトの詳細」をご参照ください。
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 "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/your_device/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/your_device/queue/rq_affinity sleep 5 RunFio 10 128 4k randwrite 1024g /dev/your_device
実際のビジネスシナリオに基づいたtest100w.shスクリプトのパラメーターを変更します。。
_device
パラメーターをESSDの実際のデバイス名に置き換えます。 例: nvme1n1.RunFio 10 64 randwrite /dev/your_device
行の10、4k、randwrite、および /dev/your_deviceを実際の値に置き換えます。ESSDのデータ損失がビジネスに影響しない場合は、
filename
パラメーターをデバイス名に設定できます。 例: filename=/dev/vdb。 それ以外の場合は、filename
パラメーターをfileディレクトリに設定します。 例: filename=/mnt/test.image
次のコマンドを実行して、ESSDのパフォーマンスをテストします。
sudo sh test100w.sh
次の図は、コマンド出力のサンプルを示しています。
IOPS=***
パラメーターは、ESSDのIOPSを示します。
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 * 形式です。