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

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

最終更新日:Aug 25, 2026

このトピックでは、テスト条件を設定し、FIO を使用して raw ディスクとしての ESSD の IOPS をベンチマークする方法について説明します。

前提条件

  • テストツール:FIO を使用します。

    説明

    Fio (Flexible I/O Tester) は、ランダムまたはシーケンシャルの読み書きなど、さまざまなワークロードでストレージデバイスをベンチマークするために使用される、強力なオープンソースの I/O テストツールです。

  • インスタンスタイプ:ecs.g7se.32xlarge の Elastic Compute Service (ECS) インスタンスを推奨します。詳細については、「汎用インスタンスファミリー (gシリーズ)」をご参照ください。

  • イメージ:最新バージョンの Linux パブリックイメージを使用します。このトピックでは、Alibaba Cloud Linux 3 を使用します。

    説明

    テストの結果、一部の Linux ディストリビューションでは期待どおりのパフォーマンスが得られない場合があります。最良の結果を得るには、Alibaba Cloud が提供する公式の Alibaba Cloud Linux 3 イメージを使用することを推奨します。

  • ESSD:

    • raw ディスクをテストすることで、クラウドディスクのより正確なパフォーマンスメトリクスが得られます。FIO を raw ディスク上で直接実行して、そのパフォーマンスをテストすることを推奨します。

    • ESSD PL3 を推奨します。ESSD の詳細については、「ESSD」をご参照ください。

    重要
    • raw ディスクをテストすることで、最も正確なブロックストレージのパフォーマンス結果が得られます。ただし、パーティション、ファイルシステム、またはその他のデータが含まれるブロックストレージデバイスに対して Fio を直接実行すると、ファイルシステムエラーやデータ損失が発生する可能性があります。開始する前に、スナップショットを作成してデータをバックアップしてください。詳細については、「手動でスナップショットを作成する」をご参照ください。

    • データ損失を防ぐため、システムディスクまたはデータを含むデータディスクはテストしないよう強く推奨します。テストには、新規作成した未初期化の空のデータディスクを使用することを推奨します。

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

    • テスト完了後、新しいクラウドディスクを次のように処理します。

手順

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

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

  2. 次のコマンドを実行して、利用可能なブロックストレージデバイスを一覧表示します。

    sudo fdisk -lu

    次の出力は、/dev/vda がシステムディスク、/dev/vdb と /dev/vdc がデータディスクである例です。

    [ecs-a                          ]$ sudo fdisk -lu
    Disk /dev/vda: 40 GiB, 42949672960 bytes, 83886080 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: gpt
    Disk identifier: F51132A7-67B1-4650-806D-FD0DE6E1210C
    Device      Start      End  Sectors  Size Type
    /dev/vda1    2048     6143     4096    2M BIOS boot
    /dev/vda2    6144   415743   409600  200M EFI System
    /dev/vda3  415744 83886046 83470303 39.8G Linux filesystem
    Disk /dev/vdb: 30 GiB, 32212254720 bytes, 62914560 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes
    Disklabel type: gpt
    Disk identifier: C36DF120-8650-4188-8043-AEF9C85F31EF
    Device     Start      End  Sectors Size Type
    /dev/vdb1   2048 62912511 62910464  30G Linux filesystem
    Disk /dev/vdc: 40 GiB, 42949672960 bytes, 83886080 sectors
    Units: sectors of 1 * 512 = 512 bytes
    Sector size (logical/physical): 512 bytes / 512 bytes
    I/O size (minimum/optimal): 512 bytes / 512 bytes

    上記の出力は、インスタンスに 1 台のシステムディスク /dev/vda と 2 台のデータディスク /dev/vdb および /dev/vdc があることを示しています。

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

    sudo blkid
    [ecs-a]$ sudo blkid
    /dev/vdb1: UUID="9c32c24f-d2b8-4aa8-8xxx" BLOCK_SIZE="4096" TYPE="ext4" PARTLABEL="primary" PARTUUID="4bd66635-f5f4-4dc0-9bdd-664fd5b8d2fb"
    /dev/vda2: SEC_TYPE="msdos" UUID="7E" BLOCK_SIZE="512" TYPE="vfat" PARTUUID="82a50cd6-9899-41eb-91fe-7027bf257086"
    /dev/vda3: LABEL="root" UUID="beef9d8d-ba84-46d9-8xxx" BLOCK_SIZE="4096" TYPE="ext4" PARTUUID="e0d4fa20-912d-4e86-943e-6b0866xxx"
    /dev/vda1: PARTUUID="d083a7cd-a7ea-4898-89d5-8e1510bed584"

    上記のように、ブロックストレージデバイス /dev/vda と /dev/vdb にはパーティションとファイルシステムがあります。/dev/vdc に関しては情報が返されず、パーティションやファイルシステムがないことを示しています。

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

    説明

    スナップショットの使用には料金が発生します。詳細については、「スナップショットの料金」をご参照ください。

  5. libaio ライブラリと FIO ツールをインストールするには、次のコマンドを実行します。 オペレーティングシステムに応じてコマンドを選択します。

    Alibaba Cloud Linux 2/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 および 10 はサポート終了 (EOL) となったため、これらのバージョンを実行している ECS インスタンスでは、まずリポジトリアドレスを変更する必要があります。詳細については、「CentOS/Debian EOLのリポジトリアドレスの変更」をご参照ください。

    sudo apt-get update
    sudo apt-get install libaio* fio -y
  6. /tmp ディレクトリに移動します。

    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 "Error: 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 "$DEV_NAME contains a partition table or a file system. Stop the fio script!"
        exit 1
    fi
    function RunFio
    {
     numjobs=$1   # インスタンス内のテストスレッド数。例:10。
     iodepth=$2   # 同時にサブミットできるI/Oリクエストの最大数。例:128。
     bs=$3        # 単一I/Oブロックのサイズ。例:4k。
     rw=$4        # テストの読み書きポリシー。例:randwrite。
     size=$5      # テストのサイズ。例:1024g。
     filename=$6  # テストファイルの名前。例:/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/$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 スクリプトを変更します。

    • すべての 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
  10. ESSD のパフォーマンスをテストするために、次のコマンドを実行してください。

    sudo sh test100w.sh
    • コマンド出力のIOPS=***を含む行は、ESSD の IOPS を示します。

      job1: (g=0): rw=randwrite, bs=(R) 4096B-4096B, (W) 4096B-4096B, (T) 4096B-4096B, ioengine=libaio, iodepth=128
      ...
        fio-3.7
        Starting 6 processes
        Jobs: 6 (f=6): [w(6)][100.0%][r=0KiB/s,w=3932MiB/s][r=0,w=1007k IOPS][eta 00m:00s]
      job1: (groupid=0, jobs=6): err= 0: pid=42693: Thu Jun 23 15:32:28 2022
        write: IOPS=1005k, BW=3925MiB/s (4116MB/s)(38.4GiB/10015msec)
          slat (nsec): min=728, max=9562.2k, avg=5157.38, stdev=47881.11
          clat (usec): min=82, max=25001, avg=758.61, stdev=843.67
           lat (usec): min=86, max=25042, avg=763.86, stdev=844.85
          clat percentiles (usec):
           |  1.00th=[  190],  5.00th=[  347], 10.00th=[  445], 20.00th=[  537],
           | 30.00th=[  586], 40.00th=[  635], 50.00th=[  652], 60.00th=[  676],
           | 70.00th=[  693], 80.00th=[  717], 90.00th=[  824], 95.00th=[ 1254],
           | 99.00th=[ 4424], 99.50th=[ 6849], 99.90th=[10814], 99.95th=[15008],
           | 99.99th=[19530]
         bw (  KiB/s): min=573448, max=732136, per=16.69%, avg=670799.74, stdev=26159.23, samples=120
         iops        : min=143362, max=183034, avg=167699.93, stdev=6539.81, samples=120
        lat (usec)   : 100=0.01%, 250=2.26%, 500=11.66%, 750=71.40%, 1000=8.11%
        lat (msec)   : 2=3.38%, 4=2.02%, 10=1.04%, 20=0.11%, 50=0.01%
        cpu          : usr=14.45%, sys=24.23%, ctx=401609, majf=0, minf=236
        IO depths    : 1=0.1%, 2=0.1%, 4=0.1%, 8=0.1%, 16=0.1%, 32=0.1%, >=64=110.0%
           submit    : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.0%
           complete  : 0=0.0%, 4=100.0%, 8=0.0%, 16=0.0%, 32=0.0%, 64=0.0%, >=64=0.1%
           issued rwts: total=0,10062326,0,0 short=0,0,0,0 dropped=0,0,0,0
           latency   : target=0, window=0, percentile=100.00%, depth=128
      Run status group 0 (all jobs):
        WRITE: bw=3925MiB/s (4116MB/s), 3925MiB/s-3925MiB/s (4116MB/s-4116MB/s), io=38.4GiB (41.2GB), run=10015-10015msec
      Disk stats (read/write):
        nvme1n1: ios=4Z/11063917, merge=0/0, ticks=5/8026436, in_queue=9632482, util=100.00%
    • 次の出力が表示された場合、テストディスクにはパーティションまたはファイルシステムがあります。FIO スクリプトは、データの安全性を確保するため停止します。テストには、新しい空のデータディスクを使用してください。

      [[ecs-user@ecs tmp]$ sudo sh test100w.sh
      /dev/vdb contains a partition table or a file system. Stop the fio script!
      警告

      テスト対象にパーティション、ファイルシステム、またはその他のデータがある場合、FIO をテスト対象上で直接実行すると、ファイルシステムのエラーやデータ損失が発生します。データディスクにパーティションとファイルシステムがある場合は、テスト用に新しい空のデータディスクを作成することを推奨します。

test100w.sh スクリプト

  • 以下のコマンドは、ブロックデバイスの rq_affinity パラメーターを 2 に設定します。

    echo 2 > /sys/block/your_device/queue/rq_affinity

    rq_affinity の値

    値の説明

    1

    ブロックデバイスが I/O 操作を完了すると、完了イベントはリクエストを発行したのと同じ 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 シナリオでは、この単一のリクエストキューがパフォーマンスのボトルネックになる可能性があります。マルチキューモードでは、デバイスは複数のリクエストキューを使用して I/O を処理し、バックエンドストレージのパフォーマンスを最大限に引き出すことができます。この機能を効果的に使用するには、異なるリクエストキューに対応する異なる CPU コアに I/O スレッドをバインドする必要があります。

    パラメーター

    説明

    例

    numjobs

    I/O スレッドの数。

    10

    /dev/your_device

    ESSD のデバイス名。

    /dev/nvme1n1

    cpus_allowed_policy

    FIO は、vCPU をバインドするために cpus_allowed_policy と cpus_allowed パラメーターを提供します。

    split

    直前のコマンドは、複数の jobs を実行し、異なる Queue_Id 値に対応する別々の CPU コアにバインドします。 Queue_Id 値にバインドされている cpu_core_id 値をクエリするには、次のコマンドを実行します。

    • ls /sys/block/your_device/mq/ コマンドを実行します。 コマンドの your_device は、nvme1n1 などの実際のデバイス名に置き換えます。 このコマンドは、指定されたデバイスの Queue_Id 値を照会します。

    • cat /sys/block/your_device/mq/*/cpu_list コマンドを実行します。コマンドの your_device を、nvme1n1 などの実際のデバイス名に置き換えます。このコマンドは、指定されたデバイスの各リクエストキューにどの CPU コアがバインドされているかを示します。