すべてのプロダクト
Search
ドキュメントセンター

Elastic Compute Service:ESSDのIOPSパフォーマンスのテスト

最終更新日:Oct 22, 2024

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」をご参照ください。

    重要
    • 生ディスクをテストすると、正確なテスト結果が得られますが、生ディスクのファイルシステム構造が破壊される可能性があります。 上記の問題を防ぐために、ディスクのスナップショットを作成してディスクデータをバックアップすることを推奨します。 詳細については「スナップショットの作成」をご参照ください。

    • データの損失を防ぐために、オペレーティングシステムが存在するシステムディスクまたは重要なデータを含むディスクをテストオブジェクトとして使用しないことを強くお勧めします。 ツールを使用して、重要なデータがない新しいデータディスクまたは一時ディスクのブロックストレージパフォーマンスをテストすることをお勧めします。

    • システムディスクに対して生のディスクストレステストを実行する場合は、サービスを展開する前に、ストレステストを完了してオペレーティングシステムをリセットすることをお勧めします。 これはストレステストによって引き起こされる潜在的な問題を防ぎ、システムの長期安定した操作を保障するのを助けます。

    • パフォーマンステストの結果はテスト環境で得られ、参照用です。 実際の本番環境では、ネットワーク環境や同時実行アクセスなどの要因により、クラウドディスクのパフォーマンスが異なる場合があります。

手順

  1. ECS インスタンスに接続します。

    詳細については、「パスワードまたはキーを使用したLinuxインスタンスへの接続」をご参照ください。

  2. 次のコマンドを実行して、libaioライブラリとfioツールをインストールします。

    sudo yum install libaio libaio-devel fio -y
  3. 次のコマンドを実行して、パスを変更します。

    cd /tmp
  4. 次のコマンドを実行して、test100w.shスクリプトを作成します。

    sudo vim test100w.sh
  5. 次のコンテンツを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
  6. 実際のビジネスシナリオに基づいたtest100w.shスクリプトのパラメーターを変更します。。

    • _deviceパラメーターをESSDの実際のデバイス名に置き換えます。 例: nvme1n1.

    • RunFio 10 64 randwrite /dev/your_device行の104krandwrite、および /dev/your_deviceを実際の値に置き換えます。

    • ESSDのデータ損失がビジネスに影響しない場合は、filenameパラメーターをデバイス名に設定できます。 例: filename=/dev/vdb。 それ以外の場合は、filenameパラメーターをfileディレクトリに設定します。 例: filename=/mnt/test.image

  7. 次のコマンドを実行して、ESSDのパフォーマンスをテストします。

    sudo sh test100w.sh

    次の図は、コマンド出力のサンプルを示しています。IOPS=*** パラメーターは、ESSDのIOPSを示します。image

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 * 形式です。