Alibaba Cloud エンタープライズ SSD(ESSD)は、25 ギガビットイーサネットとリモートダイレクトメモリアクセス(RDMA)テクノロジーを使用して、ディスクあたり最大 1,000,000 ランダム読み取り/書き込み IOPS を実現し、片方向のレイテンシを削減します。このトピックでは、次のセクションで説明するテスト条件に基づいて、Raw ESSD の IOPS パフォーマンスをテストする方法について説明します。
テスト条件
テストツール:flexible I/O tester(fio)を使用します。
説明fio は、ランダム読み取りおよび書き込み操作やシーケンシャル読み取りおよび書き込み操作など、ブロックストレージデバイスのパフォーマンスメトリックをテストできる、オープンソースの強力な I/O パフォーマンスベンチマークツールです。
インスタンスタイプ:ecs.g7se.32xlarge インスタンスタイプを使用することをお勧めします。インスタンスタイプの詳細については、「汎用インスタンスファミリ(g シリーズ)」をご参照ください。
イメージ:Alibaba Cloud が提供する Linux パブリックイメージの新しいバージョンを使用します。以下の例では、Alibaba Cloud Linux 3 を使用しています。
説明テスト結果によると、特定の Linux ディストリビューションイメージでは、ESSD が期待される IOPS パフォーマンスを達成できない場合があります。Alibaba Cloud Linux 3 イメージを使用する Elastic Compute Service(ECS)インスタンスに ESSD をアタッチすることをお勧めします。
ESSD:
Raw ディスクでのテストは、実際のディスクパフォーマンスを取得するのに役立ちます。fio ツールを使用して Raw ディスクの IOPS パフォーマンスをテストすることをお勧めします。
パフォーマンスレベル 3(PL3 ESSD)の ESSD を使用することをお勧めします。ESSD の詳細については、「ESSD」をご参照ください。
重要Raw ディスクでのテストは、実際のブロックストレージパフォーマンスを取得するのに役立ちます。ブロックストレージデバイスにパーティション、ファイルシステム、およびデータが含まれている場合、fio ツールを直接使用すると、ファイルシステムで例外が発生し、データが失われる可能性があります。前述の問題を防ぐために、fio ツールを使用してデバイスをテストする前に、テストするブロックストレージデバイスのスナップショットを作成してディスクデータをバックアップすることをお勧めします。詳細については、「スナップショットの作成」をご参照ください。
データの損失を防ぐために、オペレーティングシステムが存在するシステムディスク、またはデータを含むデータディスクをテスト対象として使用しないでください。fio ツールを使用して、新しい空のデータディスクのパフォーマンスをテストすることをお勧めします。
パフォーマンステスト結果はテスト環境で取得されたものであり、参考値です。本番環境では、ネットワーク環境や同時アクセスなどの要因により、クラウドディスクのパフォーマンスが異なる場合があります。
手順
ECS インスタンスに接続します。
詳細については、「Workbench を使用して SSH 経由で Linux インスタンスに接続する」をご参照ください。
ブロックストレージデバイスの名前をクエリします。
sudo fdisk -lu
前の図は、インスタンスに 3 つのブロックストレージデバイスがあることを示しています。/dev/vda という名前のシステムディスクと、/dev/vdb と /dev/vdc という名前の 2 つのデータディスクです。ブロックストレージデバイスにパーティションとファイルシステムが存在するかどうかをクエリします。
sudo blkid
前の図は、/dev/vda と /dev/vdb という名前のブロックストレージデバイスにパーティションとファイルシステムがあることを示しています。コマンド出力には、/dev/vdc という名前のブロックストレージデバイスに関する情報は含まれていません。これは、ブロックストレージデバイスにパーティションまたはファイルシステムがないことを示しています。ブロックストレージデバイスのパフォーマンスをテストする前に、デバイスに保存されているデータをバックアップして、データの損失を防いでください。詳細については、「スナップショットの作成」をご参照ください。
説明スナップショットには課金されます。スナップショットの請求については、「スナップショット」をご参照ください。
オペレーティングシステムに基づいて、libaio ライブラリと fio ツールをインストールします。
Alibaba Cloud Linux 2、Alibaba Cloud Linux 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 と Debian 10 は EOL に達しました。インスタンスで Debian 9 または Debian 10 を実行している場合は、オペレーティングシステムのリポジトリアドレスを変更します。詳細については、「Debian 9 または Debian 10 リポジトリアドレスを変更するにはどうすればよいですか?」をご参照ください。
sudo apt-get update sudo apt-get install libaio* fio -yパスを変更します。
cd /tmptest100w.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 "エラー: $device デバイスが存在しません。" 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 デバイスにはパーティションテーブルまたはファイルシステムが含まれています。fio スクリプトは停止されました。" exit 1 fi function RunFio { numjobs=$1 // テストスレッドの数。この例では、値は 10 です。 iodepth=$2 // 同時 I/O リクエストの最大数。この例では、値は 64 です。 bs=$3 // I/O あたりのデータブロックサイズ。この例では、値は 4k です。 rw=$4 // 読み取りおよび書き込みポリシー。この例では、値は randwrite です。 size=$5 // テストファイルのサイズ filename=$6 // テストファイルの名前。この例では、値は /dev/your_device です。 nr_cpus=`cat /proc/cpuinfo |grep "processor" |wc -l` if [ $nr_cpus -lt $numjobs ];then echo "numjobs パラメータの値は CPU コアの数よりも大きいです。テストは停止されました。" 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 // rq_affinity パラメータを 2 に設定します sleep 5 RunFio 10 128 4k randwrite 1024g $DEV_NAMEtest100w.sh スクリプトのパラメータをビジネスシナリオに基づいて変更します。
your_deviceを、テストするデバイスの実際のデバイス名に置き換えます。例:nvme1n1。10644krandwrite/dev/your_device
RunFio 10 64 4k randwrite /dev/your_device行の (numjobs)、(iodepth)、(bs)、(rw)、および を実際の値に置き換えます。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 /dev/vdb デバイスにはパーティションテーブルまたはファイルシステムが含まれています。fio スクリプトは停止されました。警告テストオブジェクトにパーティション、ファイルシステム、およびデータが含まれている場合、fio ツールを直接使用すると、ファイルシステムで例外が発生し、データが失われる可能性があります。データディスクにパーティションとファイルシステムがある場合は、空のデータディスクを作成して新しいディスクをテストすることをお勧めします。
データディスクと同じ仕様の従量課金ディスクを作成し、新しいディスクをインスタンスにアタッチしてテストできます。詳細については、「空のデータディスクを作成する」をご参照ください。
テストが完了したら、ビジネス要件に基づいて従量課金ディスクをデタッチしてリリースできます。詳細については、「データディスクをデタッチする」および「ディスクをリリースする」をご参照ください。
test100w.sh スクリプトの詳細
test100w.sh スクリプトでは、次のコマンドで
rq_affinityパラメータを 2 に設定します。echo 2 > /sys/block/your_device/queue/rq_affinityrq_affinity の値
説明
1
ブロックデバイスが、受信した I/O 完了イベントを、対応する I/O リクエストを送信した vCPU のグループに配信することを示します。複数のスレッドが同時に実行されるシナリオでは、I/O 完了イベントが 1 つの vCPU にのみ配信され、パフォーマンスボトルネックが発生する可能性があります。
2
ブロックデバイスが、受信した I/O 完了イベントを、対応する 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説明通常モードでは、デバイスには単一の request queue があります。複数のスレッドが同時に I/O リクエストを処理する場合、request queue はパフォーマンスボトルネックになります。マルチキューモードでは、デバイスは複数の request queue を使用して I/O リクエストを処理し、バックエンドストレージの最大パフォーマンスを実現できます。たとえば、4 つの I/O スレッドがあるとします。マルチキューモードを最大限に活用してストレージパフォーマンスを向上させるには、I/O スレッドを異なる request queue に対応する CPU コアにバインドする必要があります。
パラメータ
説明
値の例
numjobsI/O スレッドの数。
10
/dev/your_deviceESSD のデバイス名。
/dev/nvme1n1
cpus_allowed_policyfio ツールによって提供される、vCPU をバインドするためのパラメータ。fio ツールは、vCPU をバインドするために
cpus_allowed_policyパラメータとcpus_allowedパラメータを提供します。split
前述のコマンドは
jobsを実行して、異なる queue ID を持つキューを異なる CPU コアにバインドします。キューがバインドされている CPU コアの ID を表示するには、次のコマンドを実行します。ls /sys/block/your_device/mq/コマンドを実行します。コマンドでは、your_deviceパラメータを実際のデバイス名に置き換えます。例:nvme1n1。コマンドは、デバイス名が /dev/vd* 形式の ESSD の queue の ID を返します。cat /sys/block/your_device/mq/cpu_list コマンドを実行します。コマンドでは、
your_deviceパラメータを実際のデバイス名に置き換えます。例:nvme1n1。コマンドは、ESSD の queue がバインドされている CPU コアの ID を返します。ESSD のデバイス名は /dev/vd* 形式です。