メニュー
Amazon Elastic Compute Cloud
Linux インスタンス用ユーザーガイド

EBS ボリュームのベンチマーク

このセクションでは、I/O ワークロードをシミュレートすることで Amazon EBS ボリュームのパフォーマンスをテストする方法を示します。手順は次のとおりです。

  1. EBS 最適化インスタンスを作成する.

  2. 新しい EBS ボリュームを作成します。

  3. EBS 最適化インスタンスにボリュームをアタッチする.

  4. ブロックデバイスを設定およびマウントします。

  5. ツールをインストールし、I/O パフォーマンスを評価する.

  6. ボリュームの I/O パフォーマンスを評価する.

  7. ボリュームを削除し、料金が発生しないようにインスタンスを停止する.

重要

このトピックで説明されている手順の一部を実行すると、ベンチマークを実行する EBS ボリューム上の既存のデータが破壊されます。ベンチマーク手順は、本番ボリュームではなく、テスト目的で特別に作成されたボリュームで使用するために用意されています。

インスタンスのセットアップ

EBS ボリュームで最適なパフォーマンスを実現するには、EBS 最適化インスタンスを使用することをお勧めします。EBS 最適化インスタンスは、Amazon EC2 および Amazon EBS 間の専用スループットとインスタンスを提供します。EBS 最適化インスタンスは、Amazon EC2 と Amazon EBS の間で所定の帯域幅を実現するものであり、インスタンスタイプに応じて 500~12,000 Mbps の範囲内で選択できます。

EBS 最適化インスタンスを作成するには、Amazon EC2 コンソールを使用してインスタンスを起動するときに [Launch as an EBS-Optimized instance] を選択するか、コマンドラインを使用して --ebs-optimized を指定します。必ずこのオプションをサポートする現行世代のインスタンスタイプを起動してください。このトピックのテスト例では、c3.4xlarge インスタンスを起動することをお勧めします。詳細については、「Amazon EBS 最適化インスタンス」を参照してください。

プロビジョンド IOPS SSD (io1) ボリュームのセットアップ

io1 ボリュームを作成するには、Amazon EC2 コンソールを使用してボリュームを作成するときに, プロビジョンド IOPS SSD を選択するか、コマンドラインで --type io1 --iops n (n は 100~20000 の整数) を指定します。EBS ボリュームの作成の詳細については、「Amazon EBS ボリュームの作成」を参照してください。インスタンスへのこれらのボリュームのアタッチについては、「インスタンスへの Amazon EBS ボリュームのアタッチ」を参照してください。

テストの例では、高いレベルのパフォーマンスを提供する、6 ボリュームを持つ RAID アレイを作成することをお勧めします。ボリューム数ではなく、プロビジョニングしたギガバイト (および io1 ボリュームに対してプロビジョニングした IOPS 数) に対して料金が発生するので、複数の小さなボリュームを作成し、そのボリュームを使用してストライプセットを使用するための追加コストはありません。Oracle Orion を使用してボリュームを評価する場合は、Oracle ASM と同じ方法でストライピングをシミュレートできます。したがって、Orion でストライピングを行えるようにすることをお勧めします。別のベンチマークツールを使用する場合は、ボリュームのストライピングを自身で行う必要があります。

6 ボリュームのストライプセットを Amazon Linux で作成するには、次のようなコマンドを使用します。

Copy
[ec2-user ~]$ sudo mdadm --create /dev/md0 --level=0 --chunk=64 --raid-devices=6 /dev/sdf /dev/sdg /dev/sdh /dev/sdi /dev/sdj /dev/sdk

この例では、XFS ファイルシステムを使用します。要件を満たすファイルシステムを使用する必要があります。次のコマンドを使用して XFS ファイルシステムサポートをインストールします。

Copy
[ec2-user ~]$ sudo yum install -y xfsprogs

さらに、次のコマンドを使用して、XFS ファイルシステムの作成、マウント、および所有権の割り当てを行います。

Copy
[ec2-user ~]$ sudo mkdir -p /mnt/p_iops_vol0 && sudo mkfs.xfs /dev/md0 [ec2-user ~]$ sudo mount -t xfs /dev/md0 /mnt/p_iops_vol0 [ec2-user ~]$ sudo chown ec2-user:ec2-user /mnt/p_iops_vol0/

スループット最適化 HDD (st1) または Cold HDD (sc1) ボリュームのセットアップ

st1 ボリュームを作成するには、Amazon EC2 コンソールを使用してボリュームを作成するときに [スループット最適化 HDD] を選択するか、コマンドラインを使用して --type st1 を指定します。sc1 ボリュームを作成するには、Amazon EC2 コンソールを使用してボリュームを作成するときに [Cold HDD] を選択するか、コマンドラインを使用して --type sc1 を指定します。EBS ボリュームの作成の詳細については、「Amazon EBS ボリュームの作成」を参照してください。インスタンスへのこれらのボリュームのアタッチについては、「インスタンスへの Amazon EBS ボリュームのアタッチ」を参照してください。

AWS では、AWS CloudFormation と共に JSON テンプレートを使用して、このセットアップ手順を簡単にすることができます。これには、テンプレートにアクセスして JSON ファイルとして保存します。AWS CloudFormation では、独自の SSH キーを設定して、st1 ボリュームを評価するためのパフォーマンステスト環境を簡単にセットアップすることができます。テンプレートを使用すると、現行世代のインスタンスと 2 TiB の st1 ボリュームが作成され、このボリュームが /dev/xvdf のインスタンスにアタッチされます。

テンプレートを使用して HDD ボリュームを作成するには

  1. AWS CloudFormation コンソール (https://console.aws.amazon.com/cloudformation/) を開きます。

  2. [Create Stack] を選択します。

  3. [Upload a Template to Amazon S3] を選択し、さきほど入手した JSON テンプレートを選択します。

  4. スタックに、"ebs-perf-testing" のような名前を付け、インスタンスタイプ (デフォルトは r3.8xlarge) および SSH キーを選択します。

  5. [Next] を 2 回選択し、[Create Stack] を選択します。

  6. 新しいスタックのステータスが CREATE_IN_PROGRESS から COMPLETE に移行したら、[Outputs] を選択して新しいインスタンスのパブリック DNS エントリを取得します。このインスタンスには、2 TiB の st1 ボリュームがアタッチされます。

  7. ユーザー ec2-user として、前のステップで DNS エントリから取得したホスト名を使用し、新しいスタックに SSH を使用して接続します。

  8. ベンチマークツールをインストールする に進みます。

ベンチマークツールをインストールする

EBS ボリュームのパフォーマンスを評価するために使用できるツールの一部を、次の表に示します。

ツール 説明

fio

I/O パフォーマンスを評価します(fiolibaio-devel に依存することに注意してください。)

Amazon Linux に fio をインストールするには、次のコマンドを実行します。

Copy
[ec2-user ~]$ sudo yum install -y fio

Ubuntu に fio インストールするには、次のコマンドを実行します。

Copy
$ sudo apt-get install -y fio

Oracle Orion Calibration ツール

Oracle データベースで使用するストレージシステムの I/O パフォーマンスを調整します。

これらのベンチマークツールは、さまざまなテストパラメータをサポートしています。使用するのは、ボリュームがサポートするワークロードを見積もるためのコマンドです。評価に必要な基本的なコマンドの例を以下に示します。

ボリュームキュー長の選択

ワークロードとボリュームタイプに基づいて最適なボリュームキュー長を選択します。

SSD-Backed ボリュームのキュー長

SSD-Backed ボリュームでワークロードに最適なキュー長を決定するには、使用可能な 500 IOPS ごとにキュー長 1 を指定するようにお勧めします (gp2 ボリュームのベースライン、io1 ボリュームにプロビジョニングする値)。その後、アプリケーションのパフォーマンスを監視して、アプリケーション要件に応じて値を調整することができます。

プロビジョニングした IOPS、スループット、または最適なシステムキュー長 (現在は 32 に設定) に達するまでは、キュー長を大きくする方が有益です。たとえば、IOPS として 1000 がプロビジョニングされたボリュームでは、キュー長 2 を設定します。アプリケーションに最適な値を確認するには、これらの値を増減して調整してください。

HDD-Backed ボリュームのキュー長

HDD-Backed ボリュームのワークロードに対する最適なキュー長を決定するには、1 MiB のシーケンシャル I/O の実行時に 4 以上のキュー長を設定しておくようお勧めします。その後、アプリケーションのパフォーマンスを監視して、アプリケーション要件に応じて値を調整することができます。たとえば、2 TiB の st1 ボリュームで、バーストスループットが 500 MiB/秒、IOPS が 500 の場合は、1,024 KiB、512 KiB、または 256 KiB のシーケンシャル I/O を実行する際に、キュー長をそれぞれ 4、8、または 16 に設定します。アプリケーションに最適な値を確認するには、これらの値を増減して調整してください。

ベンチマークテストを実行する

次の手順では、さまざまな EBS ボリュームタイプに対するベンチマークコマンドについて説明します。

EBS ボリュームがアタッチされている EBS 最適化インスタンスで、次のコマンドを実行します。EBS ボリュームをスナップショットから復元した場合は、ベンチマークテストを実行する前に、必ず初期化してください。詳細については、「Amazon EBS ボリュームの初期化」を参照してください。

ボリュームのテストが完了したら、クリーンアップに関するトピック「Amazon EBS ボリュームの削除」および「インスタンスの終了」を参照してください。

io1 ボリュームの評価

作成したストライプセットで fio を実行します。

次のコマンドは、16 KB のランダム書き込みオペレーションを実行します。

Copy
[ec2-user ~]$ sudo fio --directory=/mnt/p_iops_vol0 \ --name fio_test_file --direct=1 --rw=randwrite --bs=16k --size=1G \ --numjobs=16 --time_based --runtime=180 --group_reporting --norandommap

次のコマンドは、16 KB のランダム読み取りオペレーションを実行します。

Copy
[ec2-user ~]$ sudo fio --directory=/mnt/p_iops_vol0 \ --name fio_test_file --direct=1 --rw=randread --bs=16k --size=1G \ --numjobs=16 --time_based --runtime=180 --group_reporting --norandommap

結果の読み方については、チュートリアル「fio のディスク IO パフォーマンスの確認」を参照してください。

st1 ボリュームおよび sc1 ボリュームの評価

st1 ボリュームまたは sc1 ボリュームで fio を実行します。

注記

これらのテストを実行する前に、「st1 および sc1 で読み取りの多い高スループットワークロードを先読みする」の説明に従って、バッファ付き I/O をインスタンスに設定してください。

次のコマンドでは、アタッチされた st1 ブロックデバイス (/dev/xvdf など) に対して、1 MiB のシーケンシャル読み取り操作を実行します。

Copy
[ec2-user ~]$ sudo fio --filename=/dev/<device> --direct=1 --rw=read --randrepeat=0 --ioengine=libaio --bs=1024k --iodepth=8 --time_based=1 --runtime=180 --name=fio_direct_read_test

次のコマンドでは、アタッチされた st1 ブロックデバイスに対して、1 MiB のシーケンシャル書き込み操作を実行します。

Copy
[ec2-user ~]$ sudo fio --filename=/dev/<device> --direct=1 --rw=write --randrepeat=0 --ioengine=libaio --bs=1024k --iodepth=8 --time_based=1 --runtime=180 --name=fio_direct_write_test

ワークロードによっては、ブロックデバイスの異なる部分に対してシーケンシャル読み取りとシーケンシャル書き込みの組み合わせを実行するケースがあります。このようなワークロードを評価する場合は、読み取りと書き込みに対して別々の fio ジョブを同時に実行し、fio offset_increment オプションを使用して、ブロックデバイスの別々の場所を各ジョブに割り当てることをお勧めします。

このワークロードの実行は、シーケンシャル書き込みまたはシーケンシャル読み取りのワークロードの場合より、少し複雑になります。テキストエディターを使用して、次の内容を含む fio ジョブファイル (この例では fio_rw_mix.cfg) を作成します。

Copy
[global] clocksource=clock_gettime randrepeat=0 runtime=180 offset_increment=100g [sequential-write] bs=1M ioengine=libaio direct=1 iodepth=8 filename=/dev/<device> do_verify=0 rw=write rwmixread=0 rwmixwrite=100 [sequential-read] bs=1M ioengine=libaio direct=1 iodepth=8 filename=/dev/<device> do_verify=0 rw=read rwmixread=100 rwmixwrite=0

次に、以下のコマンドを実行します。

Copy
[ec2-user ~]$ sudo fio fio_rw_mix.cfg

結果を読み取る方法については、チュートリアル「Inspecting disk I/O performance with fio」を参照してください。

シーケンシャルの読み取りまたは書き込みの操作を使用しても、ダイレクト I/O の fio ジョブを複数実行した場合は、st1 および sc1 ボリュームで予測を下回るスループットになります。単一のダイレクト I/O ジョブを使用し、iodepth パラメータを指定して、I/O 操作の同時実行数を制御することをお勧めします。