ブロックストレージのパフォーマンスをテストすることで、ストレージデバイスの機能を理解し、パフォーマンスを最適化できます。Raw ディスクをテストすると、ブロックストレージのパフォーマンスを正確に測定できます。このトピックでは、オープンソースツールである Flexible I/O Tester (FIO) を Linux システムで使用して、IOPS、スループット、レイテンシーなどの Raw ディスクの主要なパフォーマンスメトリックをテストする方法について説明します。
FIO は、ストレージデバイスでランダムおよびシーケンシャルの読み取り/書き込み操作などの負荷テストを実行するために使用できる、強力なオープンソースの I/O パフォーマンステストツールです。
プロシージャ
Raw ディスクをテストすると、ブロックストレージのパフォーマンスを正確に測定できます。ただし、ブロックストレージデバイスにパーティション、ファイルシステム、またはその他のデータが含まれている場合、FIO を使用してストレステストを実行すると、ファイルシステムの例外やデータ損失が発生する可能性があります。テストを開始する前に、スナップショットを作成してデータをバックアップしてください。詳細については、「スナップショットの作成」をご参照ください。
このトピックでは、Alibaba Cloud Linux 3.2104 LTS 64 ビットのパブリックイメージを例として使用します。プロシージャは、お使いの環境によって異なる場合があります。
ECS インスタンスに接続します。
詳細については、「Workbench を使用して Linux インスタンスにログインする」をご参照ください。
次のコマンドを実行して、ブロックストレージデバイスのデバイス名をクエリします。
sudo fdisk -lu
上の図は、インスタンスに 3 つのブロックストレージデバイス、つまりシステムディスク /dev/vda と 2 つのデータディスク /dev/vdb および /dev/vdc があることを示しています。次のコマンドを実行して、Elastic Block Storage デバイスにパーティションとファイルシステムが存在するかどうかを確認します。
sudo blkid
上の図に示すように、ブロックストレージデバイス /dev/vda と /dev/vdb にはパーティションとファイルシステムがあります。出力には /dev/vdc に関する情報が含まれていないため、このデバイスにはパーティションやファイルシステムがないことを示しています。
警告パーティション、ファイルシステム、またはその他のデータを含むデバイスで FIO を使用してストレステストを実行すると、ファイルシステムの例外やデータ損失が発生する可能性があります。データディスクにパーティションとファイルシステムがある場合は、テスト用に新しい空のデータディスクを作成します:
同じ構成の従量課金ディスクを作成し、テストのためにインスタンスにアタッチします。詳細については、「Linux インスタンスにデータディスクをアタッチする」をご参照ください。
テストが完了したら、必要に応じてディスクをリリースします。詳細については、「インスタンスのリリース」をご参照ください。
ブロックストレージデバイスのパフォーマンスをテストする前に、データをバックアップしてデータ損失を防ぎます。詳細については、「スナップショットの作成」をご参照ください。
説明スナップショットには料金が発生します。スナップショットの課金の詳細については、「スナップショットの料金」をご参照ください。
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 を実行する ECS インスタンスを使用する場合は、まずリポジトリアドレスを切り替える必要があります。詳細については、「EOL 後の CentOS または Debian のリポジトリアドレスの切り替え」をご参照ください。
sudo apt-get update sudo apt-get install libaio* fio -yパスを変更します:
cd /tmpパフォーマンステストコマンドを実行します。コマンドの詳細については、次のセクションをご参照ください:
ディスクパフォーマンスをテストするコマンドについては、「ディスクパフォーマンステストコマンド」をご参照ください。
ローカルディスクパフォーマンスをテストするコマンドについては、「ローカルディスクパフォーマンステストコマンド」をご参照ください。
テスト結果を表示します。値はディスクによって異なります。次の図の値は参考用です。
IOPS テスト結果については、次の図に示すように
IOPS=***の値を見つけます。
スループットテスト結果については、次の図に示すように
BW=***の値を見つけます:
レイテンシーテスト結果については、次の図に示すように lat (usec) の値を見つけます。

ディスクパフォーマンステストコマンド
パーティション、ファイルシステム、またはその他のデータを含むデバイスで FIO を使用してストレステストを実行すると、ファイルシステムの例外やデータ損失が発生する可能性があります。データディスクにパーティションとファイルシステムがある場合は、テスト用に新しい空のデータディスクを作成します:
同じ構成の従量課金ディスクを作成し、テストのためにインスタンスにアタッチします。詳細については、「Linux インスタンスにデータディスクをアタッチする」をご参照ください。
テストが完了したら:
サンプルコマンドのパラメーター値は参考用です。コマンドで、/dev/your_device を、ステップ 2 で取得したテスト対象のブロックストレージデバイスの名前に置き換えます。たとえば、テストするディスクのデバイス名が /dev/vdb の場合、/dev/your_device を /dev/vdb に置き換えます。FIO パラメーターの詳細については、「FIO パラメーターの説明」をご参照ください。
ディスクのランダム書き込み IOPS をテストします:
sudo fio -direct=1 -iodepth=128 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=Rand_Write_Testingディスクのランダム読み取り IOPS をテストします:
sudo fio -direct=1 -iodepth=128 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=Rand_Read_Testingディスクのシーケンシャル書き込みスループットをテストします:
sudo fio -direct=1 -iodepth=64 -rw=write -ioengine=libaio -bs=1024k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=Write_PPS_Testingディスクのシーケンシャル読み取りスループットをテストします:
sudo fio -direct=1 -iodepth=64 -rw=read -ioengine=libaio -bs=1024k -size=1G -numjobs=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=Read_PPS_Testingディスクのランダム書き込みレイテンシーをテストします:
sudo fio -direct=1 -iodepth=1 -rw=randwrite -ioengine=libaio -bs=4k -size=1G -numjobs=1 -group_reporting -filename=/dev/your_device -name=Rand_Write_Latency_Testingディスクのランダム読み取りレイテンシーをテストします:
sudo fio -direct=1 -iodepth=1 -rw=randread -ioengine=libaio -bs=4k -size=1G -numjobs=1 -group_reporting -filename=/dev/your_device -name=Rand_Read_Latency_Testing
さまざまな種類のディスクをテストする方法の詳細な手順については、「ESSD の IOPS パフォーマンスのテスト」をご参照ください。
ローカルディスクパフォーマンステストコマンド
パーティション、ファイルシステム、またはその他のデータを含むデバイスで FIO を使用してストレステストを実行すると、ファイルシステムの例外やデータ損失が発生する可能性があります。ローカルディスクにパーティションとファイルシステムがある場合は、テスト用にローカルディスクを備えた新しいインスタンスを作成することをお勧めします:
ローカルディスクはインスタンスでのみ作成できます。テストするには、同じ構成の新しいインスタンスを作成します。詳細については、「カスタムインスタンスの購入」をご参照ください。
テストが完了したら:
ディスクを保持する場合は、データディスクを再初期化します。
次のテストコマンドは、ローカル NVMe SSD とローカル SATA HDD に適用されます。サンプルコマンドのパラメーター値は参考用です。コマンドで、/dev/your_device を、ステップ 2 で取得したテスト対象のブロックストレージデバイスの名前に置き換えます。たとえば、テストするローカルディスクのデバイス名が /dev/vdb の場合、/dev/your_device を /dev/vdb に置き換えます。FIO パラメーターの詳細については、「FIO パラメーターの説明」をご参照ください。
ローカルディスクのランダム書き込み IOPS をテストします:
sudo fio -direct=1 -iodepth=32 -rw=randwrite -ioengine=libaio -bs=4k -numjobs=4 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=testローカルディスクのランダム読み取り IOPS をテストします:
sudo fio -direct=1 -iodepth=32 -rw=randread -ioengine=libaio -bs=4k -numjobs=4 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=testローカルディスクのシーケンシャル書き込みスループットをテストします:
sudo fio -direct=1 -iodepth=128 -rw=write -ioengine=libaio -bs=128k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=testローカルディスクのシーケンシャル読み取りスループットをテストできます:
sudo fio -direct=1 -iodepth=128 -rw=read -ioengine=libaio -bs=128k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=testローカルディスクのランダム書き込みレイテンシーをテストします:
sudo fio -direct=1 -iodepth=1 -rw=randwrite -ioengine=libaio -bs=4k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=testローカルディスクのランダム読み取りレイテンシーをテストする:
sudo fio -direct=1 -iodepth=1 -rw=randread -ioengine=libaio -bs=4k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=testローカルディスクのシーケンシャル書き込みレイテンシーをテストします:
sudo fio -direct=1 -iodepth=1 -rw=write -ioengine=libaio -bs=4k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=testローカルディスクのシーケンシャル読み取りレイテンシーをテストします:
sudo fio -direct=1 -iodepth=1 -rw=read -ioengine=libaio -bs=4k -numjobs=1 -time_based=1 -runtime=1000 -group_reporting -filename=/dev/your_device -name=test
FIO パラメーターの説明
次の表に、テストコマンドで使用される FIO パラメーターを示します。
パラメーター | 説明 |
direct | ダイレクト I/O を使用するかどうかを指定します。デフォルト値: 1。
|
iodepth | テスト中の I/O キューの深さ。たとえば、 |
rw | テストの読み取りおよび書き込みポリシー。このパラメーターは、次のいずれかの値に設定できます:
|
ioengine | テストに使用する I/O エンジン。`libaio` は、日常のアプリケーションパターンをよりよく反映するため、通常選択されます。その他のオプションの詳細については、公式の FIO ドキュメントをご参照ください。 |
bs | 各 I/O ユニットのブロックサイズ。デフォルト値: 4 KB。`read,write` フォーマットで読み取りおよび書き込み操作に個別の値を指定できます。値が空のままの場合、デフォルトが使用されます。 |
size | テストファイルの合計サイズ。 `runtime` などの他のオプションによって制限されない限り、FIO は指定された量のデータの読み取りまたは書き込みが完了した後にのみテストを停止します。このパラメーターが指定されていない場合、FIO は指定されたファイルまたはデバイスのフルサイズを使用します。サイズを 1 から 100 までのパーセンテージで指定することもできます。たとえば、`size=20%` と指定した場合、FIO は指定されたファイルまたはデバイスの合計サイズの 20% を使用します。 |
numjobs | テストの同時スレッド数。デフォルト値: 1。 |
runtime | テストの期間。 このパラメーターを指定しない場合、FIO は size で指定されたブロックサイズを使用して、bs で指定された合計ファイルサイズの読み取りまたは書き込みが完了するまで実行されます。 |
group_reporting | テスト結果の表示モード。 このパラメーターを指定すると、結果は各タスクの統計を表示する代わりに、各プロセスの統計を集計します。 |
filename | テストするオブジェクトのパス。パスは、ディスクのデバイス名またはファイルアドレスにすることができます。このトピックでは、fio のテストオブジェクトは、ファイルシステムを持たないディスク全体 (Raw ディスク) です。他のディスク上のデータが破損するのを防ぐために、/dev/your_device を実際のパスに置き換えてください。 |
name | テストの名前。このパラメーターは必要に応じて指定できます。例: Rand_Write_Testing。 |
パラメーターの詳細については、「FIO man ページ」をご参照ください。