このトピックでは、ESSD (enhanced SSD) のIOPSパフォーマンスをテストする方法について説明します。 ディスクの仕様とテスト条件がテスト結果に影響します。 マルチコアの同時実行性の高いシステムのパフォーマンスを最大化するために、次の例のようにテスト条件を設定した場合、ESSDでストレステストを実行すると、100万のIOPS値を得ることができます。
テスト条件
サンプル操作: ランダム書き込み (randwrite) 。
イメージ: Alibaba Cloudが提供する最新バージョンのLinuxパブリックイメージ (CentOS 7.4 64ビット、CentOS 7.3 64ビット、CentOS 7.2 64ビット、Alibaba Cloud Linux 2.1903 64ビットなど) を使用することを推奨します。
ツール: FIOを使用することを推奨します。
インスタンスタイプ: ecs.g7se.32xlargeの使用を推奨します。 詳細については、「g7se、ストレージ拡張汎用インスタンスファミリー」をご参照ください。
ESSD: パフォーマンスレベル3のESSD (PL3 ESSD) を使用することを推奨します。 この例では、ESSDのデバイス名として /dev/your_deviceが使用されます。 実際のデバイス名に置き換えます。 詳細については、「ESSD」をご参照ください。
注意事項
生ディスクをテストすることで、正確なテスト結果を得ることができます。 ただし、ディスクを直接テストすると、生のディスクのファイルシステム構造が破壊される可能性があります。 生のディスクをテストする前に、ディスクのスナップショットを作成してデータをバックアップすることをお勧めします。 詳細については、「ディスクのスナップショットの作成」をご参照ください。
オペレーティングシステムが存在するディスクや重要なデータが格納されているディスクはテストしないことをお勧めします。 データの損失を防ぐために、テスト用のデータを含まない新しいECS (Elastic Compute Service) インスタンスを使用することを推奨します。
手順
- ECSインスタンスに接続します。 詳細については、「VNCを使用したインスタンスへの接続」をご参照ください。
次のコマンドを順番に実行して、libaioとFIOをインストールします。
sudo yum install libaio -y sudo yum install libaio-devel -y sudo yumインストールfio -y
次のコマンドを実行して、パスを切り替えます。
cd /tmp
次のコマンドを実行して、test100w.shスクリプトを作成します。
vim test100w.sh
次のコンテンツをtest100w.shスクリプトに貼り付けます。
スクリプトの内容については、このトピックの「test100w.shスクリプトの詳細」をご参照ください。
関数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 エコー "Numjobsはcpuコア以上のものです、終了! 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 =${} -- time_based=1 -- direct=1 -- name=test -- group_reporting -- cpus_allow_policy=$ } echo 2 > /sys/block/your_device/queue/rq_affinity 睡眠5 RunFio 10 128 4k randwrite 1024g /dev/your_device
実際の条件に基づいてtest100w.shスクリプトのパラメーターを変更します。
_device
をESSDの実際のデバイス名に置き換えます。 例: nvme1n1.RunFio 10 64 4k randwrite /dev/your_device
の10、64、4k、randwrite、および /dev/your_deviceを実際の値に置き換えます。ESSDのデータ損失がビジネスに影響しない場合は、
filename
をデバイス名に設定できます。 例: filename=/dev/vdb。 それ以外の場合は、filename
をファイルディレクトリに設定します。 例: filename=/mnt/test.image
警告生ディスクをテストすることで、正確なテスト結果を得ることができます。 ただし、ディスクを直接テストすると、生のディスクのファイルシステム構造が破壊される可能性があります。 生のディスクをテストする前に、ディスクのスナップショットを作成してデータをバックアップすることをお勧めします。 詳細については、「ディスクのスナップショットの作成」をご参照ください。
オペレーティングシステムが存在するディスクや重要なデータが格納されているディスクはテストしないことをお勧めします。 データの損失を防ぐために、テスト用のデータを含まない新しいECS (Elastic Compute Service) インスタンスを使用することを推奨します。
次のコマンドを実行して、ESSDのパフォーマンスをテストします。
sh test100w.sh
コマンド出力に
IOPS=***
の結果が表示された場合、ESSDのパフォーマンスストレステストは完了です。
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 ={ rw} -filename={filename} -time_based=1 -direct=1 -name=test -group_reporting-cpus_allow_alow_policy=$spincpu=
説明通常モードでは、デバイスは単一の要求キューを有する。 この要求キューは、複数のスレッドがI/O要求を同時に処理するときにパフォーマンスのボトルネックになります。 マルチキューモードでは、デバイスは複数のリクエストキューを使用してI/Oリクエストを処理し、最大のバックエンドストレージパフォーマンスを提供できます。 たとえば、4つのI/Oスレッドがあるとします。 マルチキューモードを最大限に活用し、ストレージパフォーマンスを向上させるには、これらのスレッドを、異なるリクエストキューに対応するCPUコアにバインドする必要があります。
パラメーター
説明
例
numjobs
I/O スレッドの数。
10
/dev/your_device
ESSDのデバイス名。
/dev/nvme1n1
cpus_allowed_ポリシー
vCPUをバインドするためにFIOによって提供されるパラメーター。 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 * 形式です。