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

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

最終更新日:Dec 24, 2024

Alibaba Cloud Enterprise SSD (ESSD) は、25ギガビットイーサネットおよびリモートダイレクトメモリアクセス (RDMA) テクノロジーを使用して、ディスクあたり最大1,000,000のランダムな読み取り /書き込みIOPSを提供し、一方向のレイテンシを削減します。 このトピックでは、次のセクションで説明するテスト条件に基づいて、生のESSDのIOPSパフォーマンスをテストする方法について説明します。

テスト条件

  • テストツール: フレキシブルI/Oテスター (fio) を使用します。

    説明

    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:

    • rawディスクでのテストは、実際のディスクパフォーマンスを得るのに役立ちます。 fioツールを使用して、生のディスクのIOPSパフォーマンスをテストすることをお勧めします。

    • パフォーマンスレベル3のESSD (PL3 ESSD) を使用することを推奨します。 ESSDの詳細については、「ESSD」をご参照ください。

    重要
    • rawディスクでのテストは、実ブロックストレージのパフォーマンスを得るのに役立ちます。 ブロックストレージデバイスにパーティション、ファイルシステム、およびデータが含まれている場合、fioツールを直接使用すると、ファイルシステムで例外が発生し、データが失われる可能性があります。 上記の問題を防ぐために、fioツールを使用してデバイスをテストする前に、テストするブロックストレージデバイスのスナップショットを作成してディスクデータをバックアップすることをお勧めします。 詳細については「スナップショットの作成」をご参照ください。

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

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

手順

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

    詳細については、「Workbenchを使用したSSH経由のLinuxインスタンスへの接続」をご参照ください。

  2. 次のコマンドを実行して、ブロックストレージデバイスの名前を照会します。

    sudo fdisk -lu

    截屏2024-12-05 09前の図は、インスタンスに /dev/vdaという名前のシステムディスクと、/dev/vdbおよび /dev/vdcという名前の2つのデータディスクの3つのブロックストレージデバイスがあることを示しています。

  3. 次のコマンドを実行して、パーティションとファイルシステムがブロックストレージデバイスに存在するかどうかを照会します。

    sudo blkid

    截屏2024-12-05 09上の図は、/dev/vdaおよび /dev/vdbという名前のブロックストレージデバイスにパーティションとファイルシステムがあることを示しています。 コマンド出力には、/dev/vdcという名前のブロックストレージデバイスに関する情報は含まれていません。これは、ブロックストレージデバイスにパーティションやファイルシステムがないことを示しています。

  4. ブロックストレージデバイスのパフォーマンスをテストする前に、データの損失を防ぐために、デバイスに保存されているデータをバックアップしていることを確認してください。 詳細については「スナップショットの作成」をご参照ください。

    説明

    スナップショットに対して課金されます。 スナップショットの課金については、「スナップショット」をご参照ください。

  5. オペレーティングシステムに基づいて、次のいずれかのコマンドを実行してlibaioライブラリとfioツールをインストールします

    Alibaba Cloud Linux 2、Alibaba Cloud Linux 3、またはCentOS 6以降

    重要

    CentOS 6とCentOS 8は、寿命 (EOL) に達しました。 インスタンスがCentOS 6またはCentOS 8を実行している場合は、オペレーティングシステムのリポジトリアドレスを変更します。 詳細については、「」をご参照ください。CentOS 6リポジトリアドレスを変更するにはどうすればよいですか? CentOS 8リポジトリアドレスの変更

    sudo yum install libaio libaio-devel fio -y

    Debian 9以降、またはUbuntu 14以降

    重要

    Debian9とDebian10はEOLに到達しました。 インスタンスがDebian 9またはDebian 10を実行している場合は、オペレーティングシステムのリポジトリアドレスを変更します。 詳細については、「」をご参照ください。Debian 9またはDebian 10リポジトリのアドレスを変更するにはどうすればよいですか。

    sudo apt-get update
    sudo apt-get install libaio* fio -y
  6. 次のコマンドを実行して、パスを変更します。

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

    sudo vim test100w.sh
  8. 次のコンテンツをtest100w.shスクリプトに貼り付けます。

    スクリプトの内容については、このトピックの「test100w.shスクリプトの詳細」をご参照ください。

    #!/bin/bash
    
    DEV_NODE=your_device
    DEV_NAME=/dev/$DEV_NODE
    
    function CheckHasFS
    {
        local device=$1 # The device path.
    
        # Check whether the device exists.
        if [ !  -b "$device" ]; then
            echo "Error: The $device device does not exist."
            exit 1
        fi
    
        # Run the blkid command to check the partition table and file system type.
        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   # 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 "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
  9. のパラメーターを変更します。test100w.sh実際のビジネスシナリオに基づいたスクリプト。

    • _deviceを、テストするESSDの実際のデバイス名に置き換えます。 例: nvme1n1.

    • 10 (numjobs) 、64 (iodepth) 、4k (bs) 、randwrite (rw) 、およびRunFio 10 64 4k randwrite /dev/your_device行の /dev/your_deviceを実際の値に置き換えます。

    • numjobsパラメーターの値は、CPUコアの数を超えることはできません。 次のコマンドを実行して、CPUコアの数を照会できます。

      cat /proc/cpuinfo |grep "processor" |wc -l
  10. 次のコマンドを実行して、ESSDのパフォーマンスをテストします。

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

    • 次のサンプルコードに示す結果が返された場合、テストオブジェクトにはパーティションまたはファイルシステムが含まれます。 データのセキュリティを確保するために、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スクリプトの詳細

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