fio を使用し、25GE および RDMA で最大 1,000,000 のランダム読み取り/書き込み IOPS をサポートする raw ESSD の IOPS をベンチマークします。
前提条件
-
テストツール: fio (flexible I/O tester)。
説明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:
-
fio を使用して raw ディスクをテストし、実際のディスクパフォーマンスを取得します。
-
PL3 ESSD を使用します。 詳細については、「ESSD」をご参照ください。
重要-
ブロックストレージデバイスにパーティション、ファイルシステム、またはデータが含まれている場合、fio によってファイルシステムが破損し、データ損失が発生する可能性があります。テスト前にスナップショットを作成してください。詳細については、「スナップショットの手動作成」をご参照ください。
-
システムディスクまたはデータが含まれるデータディスクではテストを行わないでください。代わりに、新しく作成された未初期化の空のデータディスクを使用します。
-
テスト結果はテスト環境で取得したものであり、参考情報としてのみご利用ください。本番環境では、ネットワーク条件や同時アクセスなどの要因により、クラウドディスクのパフォーマンスが異なる場合があります。
-
新しいディスクのテスト後:
-
この項目は予約済みであり、直接使用できません。詳細については、「データディスクの再初期化」をご参照ください。
-
-
操作手順
ECS インスタンスに接続します。
詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。
-
ブロックストレージデバイス名を照会します。
sudo fdisk -lu
出力には、システムディスク /dev/vda と 2 つのデータディスク /dev/vdb および /dev/vdc の 3 つのブロックストレージデバイスが表示されます。 -
ブロックストレージデバイスにパーティションとファイルシステムがあるかどうかを確認します。
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 を実行している場合は、リポジトリアドレスを変更してください。
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: The $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 "The $DEV_NAME device contains a partition table or a file system. The fio script is stopped." exit 1 fi function RunFio { numjobs=$1 # テストスレッド数。この例では 10 です。 iodepth=$2 # 同時I/Oリクエストの最大数。この例では 128 です。 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 "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 -
お使いの環境に合わせてスクリプトパラメーターを変更してください。
-
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 を示します。
-
次の出力が表示された場合、テスト対象のディスクにはパーティションまたはファイルシステムが含まれています。 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
-
次のコマンドは、
rq_affinityを 2 に設定します。echo 2 > /sys/block/your_device/queue/rq_affinityrq_affinityの値説明
1
I/O 完了イベントを、I/O リクエストを送信した vCPU グループに配信します。 マルチスレッド同時実行時には、イベントが単一の 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 時にボトルネックになります。 マルチキューモードでは、複数のリクエストキューが有効になります。 たとえば、4 つの I/O スレッドがある場合、各スレッドを異なるリクエストキューにマッピングされた CPU コアにバインドすることで、ストレージパフォーマンスを最大化します。
パラメーター
説明
値の例
numjobsI/O スレッドの数。
10
/dev/your_deviceESSD のデバイス名。
/dev/nvme1n1
cpus_allowed_policyvCPU をバインドするための fio パラメーターです。
cpus_allowed_policyとcpus_allowedを一緒に使用して vCPU をバインドします。split
このコマンドは
jobsを実行して、異なる ID のキューを異なる CPU コアにバインドします。 各キューにバインドされている CPU コアを表示するには、次のコマンドを実行します。-
ls /sys/block/your_device/mq/を実行します。your_deviceを実際のデバイス名 (例:nvme1n1) に置き換えます。 これにより、指定されたデバイスのキュー ID が返されます。 -
cat /sys/block/your_device/mq/cpu_listを実行します。your_deviceを実際のデバイス名 (例:nvme1n1) に置き換えます。 これにより、指定されたデバイスの各キューにバインドされている CPU コア ID が返されます。
-