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

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

最終更新日:May 08, 2025

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 ツールを使用して、新しい空のデータディスクのパフォーマンスをテストすることをお勧めします。

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

手順

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

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

  2. ブロックストレージデバイスの名前をクエリします。

    sudo fdisk -lu

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

  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 はサポート終了(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 -y

    Debian 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
  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 // デバイスパス
    
        // デバイスが存在するかどうかを確認します。
        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_NAME
  9. test100w.sh スクリプトのパラメータをビジネスシナリオに基づいて変更します。

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

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

    • 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
      /dev/vdb デバイスにはパーティションテーブルまたはファイルシステムが含まれています。fio スクリプトは停止されました。

      警告

      テストオブジェクトにパーティション、ファイルシステム、およびデータが含まれている場合、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 が最大のパフォーマンスを発揮できます。

  • 次のコマンドは、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 コアにバインドする必要があります。

    パラメータ

    説明

    値の例

    numjobs

    I/O スレッドの数。

    10

    /dev/your_device

    ESSD のデバイス名。

    /dev/nvme1n1

    cpus_allowed_policy

    fio ツールによって提供される、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* 形式です。