

翻訳は機械翻訳により提供されています。提供された翻訳内容と英語版の間で齟齬、不一致または矛盾がある場合、英語版が優先します。

# Amazon EBS ボリュームパフォーマンス
<a name="ebs-performance"></a>

Amazon EBS のパフォーマンスは、I/O 特性やインスタンスとボリュームの設定などを含むいくつかの要因に左右されます。Amazon EBS 製品および Amazon EC2 製品の詳細ページに記載されているガイダンスに従うと、通常は良好なパフォーマンスを実現することができます。ただし、ピークパフォーマンスを実現するには、多少のチューニングを行う必要な場合があります。最適な設定を決定するには、ベンチマーキングに加えて、実際のワークロードからの情報でパフォーマンスをチューニングすることをお勧めします。EBS ボリュームの基本操作について理解したら、必要とする I/O パフォーマンスと、Amazon EBS パフォーマンスを向上させるオプションを確認し、そのパフォーマンス要件に対応できるようにすることをお勧めします。

AWS EBS ボリュームタイプのパフォーマンスの更新は、既存のボリュームにすぐには反映されない場合があります。古いボリュームで完全なパフォーマンスを確認するためには、最初に `ModifyVolume` アクションの実行が必要になる場合があります。詳細については、「[Elastic Volumes オペレーションを使用して Amazon EBS ボリュームを変更する](ebs-modify-volume.md)」を参照してください。

**Topics**
+ [Amazon EBS パフォーマンスのヒント](#tips)
+ [Amazon EBS 最適化](ebs-optimization.md)
+ [Amazon EBS ボリュームの初期化](initalize-volume.md)
+ [設定可能なインスタンス帯域幅の重み付け](instance-bandwidth-configuration.md)
+ [Amazon EBS I/O の特性およびモニタリング](ebs-io-characteristics.md)
+ [Amazon EBS および RAID の構成](raid-config.md)
+ [Amazon EBS ボリュームのベンチマーク](benchmark_procedures.md)

## Amazon EBS パフォーマンスのヒント
<a name="tips"></a>

ここに示すヒントは、さまざまなユーザーシナリオで、EBS ボリュームから最適なパフォーマンスを得るためのベストプラクティスを表しています。

### EBS 最適化インスタンスを使用する
<a name="optimize"></a>

EBS 最適化スループットがサポートされていないインスタンスでは、インスタンスと EBS ボリュームの間のトラフィックが、ネットワークトラフィックと競合する場合があります。EBS 最適化インスタンスでは、これら 2 種類のトラフィックを分離した状態が維持されます。EBS 最適化インスタンスの設定によっては、追加コストが発生する場合 (C3、R3、M3 など) と、追加コストなしで常に EBS 最適化状態になる場合 (M4、C4、C5､D2 など) があります。詳細については、「[Amazon EBS 最適化](ebs-optimization.md)」を参照してください。

### インスタンス帯域幅を設定する
<a name="icb"></a>

サポートされているインスタンスタイプでは、`ebs-1` の帯域幅の重み付けを使用して、Amazon EBS の帯域幅を 25% 増やすようにインスタンス帯域幅の重み付けを設定できます。この機能を使用して EBS と VPC ネットワーク間のインスタンスのネットワークリソース割り当てを最適化することで、I/O 集約型ワークロードの EBS パフォーマンスを改善できる可能性があります。詳細については、「[設定可能なインスタンス帯域幅の重み付け](instance-bandwidth-configuration.md)」を参照してください。

### パフォーマンスの計算方法を理解する
<a name="performance_calculation"></a>

EBS ボリュームのパフォーマンスを測定する場合、関連する測定単位と、パフォーマンスの計算方法を理解することが重要です。詳細については、[Amazon EBS I/O の特性およびモニタリング](ebs-io-characteristics.md)を参照してください。

### ワークロードを理解する
<a name="workload_types"></a>

EBS ボリュームの最大パフォーマンス、I/O 操作の数およびサイズ、各アクションが完了するまでの所要時間は、互いに関連しています。これらの各要因 (パフォーマンス、I/O、レイテンシー) は相互に影響を与えます。また、アプリケーションが異なると、影響を受ける要因もさまざまに異なります。詳細については、「[Amazon EBS ボリュームのベンチマーク](benchmark_procedures.md)」を参照してください。

### スナップショットからボリュームを初期化する際のパフォーマンス低下に注意する
<a name="initialize"></a>

スナップショットから作成された新しい EBS ボリュームの各データブロックに初めてアクセスするときには、レイテンシーが著しく増加します。このパフォーマンスヒットは、以下のいずれかの方法で回避できます。
+ 各ブロックへのアクセスが、ボリュームの本番環境への移行前に起こるようにする。このプロセスは、*初期化*と呼ばれます (以前は事前ウォーミングと呼ばれていました)。詳細については、[作成後にボリュームを手動で初期化する](initalize-volume.md#ebs-initialize)を参照してください。
+ スナップショットの高速スナップショット復元を有効化して、スナップショットから作成される EBS ボリュームが作成時に完全に初期化され、各ボリュームのあらゆるプロビジョンドパフォーマンスが即座に発揮されるようにします。詳細については、[Amazon EBS 高速スナップショット復元](ebs-fast-snapshot-restore.md)を参照してください。

### HDD パフォーマンスが低下する要因
<a name="snapshotting_latency"></a>

スループット最適化 HDD (`st1`) または Cold HDD (`sc1`) ボリュームのスナップショットを作成すると、スナップショットの進行中はボリュームのベースライン値までパフォーマンスが低下する可能性があります。この動作は、これらのボリュームタイプに固有です。パフォーマンスが制限される他の要因としては、インスタンスでのサポート範囲を超えるスループットの強要、スナップショットから作成したボリュームの初期化中のパフォーマンス低下、ボリュームに対する大量の小さなランダム I/O などがあります。HDD ボリュームのスループットを計算する方法については、[Amazon EBS ボリュームの種類](ebs-volume-types.md)を参照してください。

アプリケーションから送られる I/O リクエスト数が十分でない場合も、パフォーマンスに影響します。これは、ボリュームのキュー長や I/O サイズを確認することで監視できます。このキュー長とは、アプリケーションからボリュームへの I/O リクエストのうち処理待ちのものの数です。最大限の安定性を確保するために、HDD-Backed ボリュームで 1 MiB のシーケンシャル I/O を実行する際には、キュー長 (整数に四捨五入) を 4 以上に保つ必要があります。安定したパフォーマンスの確保については、[Amazon EBS I/O の特性およびモニタリング](ebs-io-characteristics.md)を参照してください。

### `st1` および `sc1` (Linux インスタンスインスタンスのみ) で高いスループットの読み取りが多いワークロードに先読みを増やす
<a name="read_ahead"></a>

一部のワークロードでは読み取りが多く、オペレーティングシステムのページキャッシュを通じて (例えば、ファイルシステムから) ブロックデバイスへのアクセスが行われます。この場合、最大スループットを実現するには、先読みを 1 MiB に設定することをお勧めします。これは HDD ボリュームにのみ適用されるブロックデバイス単位の設定です。

ブロックデバイスに対する現在の先読み値を調べるには、次のコマンドを使用します。

```
$ sudo blockdev --report /dev/<device>
```

ブロックデバイス情報は次の形式で返されます。

```
RO    RA   SSZ   BSZ   StartSec            Size   Device
rw   256   512  4096       4096      8587820544   /dev/<device>
```

表示されているデバイスについては、先読み値として 256 (デフォルト値) が報告されています。この数値にセクターサイズ (512 バイト) を乗算すると、先読みバッファのサイズ (この場合は 128 KiB) を得ることができます。バッファ値を 1 MiBに設定するには、次のコマンドを使用します。

```
$ sudo blockdev --setra 2048 /dev/<device>
```

最初のコマンドをもう一度実行して、先読み設定が 2,048 になったことを確認します。

この設定は、ワークロードがサイズの大きなシーケンシャル I/O で構成される場合にのみ使用してください。ワークロードの内容として、サイズの小さなランダム I/O がほとんどであれば、この設定を使用すると逆にパフォーマンスが低下します。一般的に、サイズの小さい I/O やランダム I/O が大部分を占めるワークロードの場合は、`st1` や `sc1` ボリュームではなく、汎用 SSD (`gp2` および `gp3`) ボリュームの使用を検討してください。

### 最新の Linux カーネルを使用する (Linux インスタンスのみ)
<a name="ModernKernel"></a>

間接記述子がサポートされている最新の Linux カーネルを使用します。Linux カーネル 3.8 以降には、すべてこのサポートがあり、現行世代の EC2 インスタンスも同様です。平均 I/O サイズが 44 KiB 前後であれば、間接記述子がサポートされていないインスタンスやカーネルを使用している可能性があります。Amazon CloudWatch のメトリクスから平均 I/O サイズを得る方法については、[Amazon EBS I/O の特性およびモニタリング](ebs-io-characteristics.md)を参照してください。

`st1` または `sc1` ボリュームで最大スループットを達成するには、256 の値を、`xen_blkfront.max` パラメータ (Linux カーネルバージョン 4.6 未満の場合)または `xen_blkfront.max_indirect_segments` パラメータ (Linux カーネルバージョン 4.6 以降の場合) に適用することを推奨します。適切なパラメータは、OS の起動コマンドラインで設定できます。

例えば、Amazon Linux AMI では、`/boot/grub/menu.lst` に記述されている GRUB 設定で kernel 行の末尾に追加できます。

```
kernel /boot/vmlinuz-4.4.5-15.26.amzn1.x86_64 root=LABEL=/ console=ttyS0 xen_blkfront.max=256
```

後のカーネルの場合、コマンドは次のようになります。

```
kernel /boot/vmlinuz-4.9.20-11.31.amzn1.x86_64 root=LABEL=/ console=tty1 console=ttyS0 xen_blkfront.max_indirect_segments=256
```

この設定を有効にするには、インスタンスを再起動する必要があります。

詳細については、「[準仮想化 AMI 向けの GRUB の設定](https://docs.aws.amazon.com/linux/al2/ug/UserProvidedKernels.html#configuringGRUB)」を参照してください。他の Linux ディストリビューションでは (特に GRUB ブートローダーが使用されていない場合)、カーネル パラメータの調整に別のアプローチが必要になることがあります。

EBS I/O の特性の詳細については、このトピックの[Amazon EBS: パフォーマンスを考慮した設計](https://www.youtube.com/watch?v=2wKgha8CZ_w)プレゼンテーションを参照してください。

### RAID 0 を使用してインスタンスのリソース使用率を最大化する
<a name="RAID"></a>

一部のインスタンスタイプでは、単一の EBS ボリュームをプロビジョニングする場合よりも I/O スループットを増やすことができます。複数のボリュームを RAID 0 設定で結合し、これらのインスタンス用の利用可能な帯域幅を使用できます。詳細については、「[Amazon EBS および RAID の構成](raid-config.md)」を参照してください。

### Amazon EBS ボリュームのパフォーマンスをモニタリングする
<a name="cloudwatch"></a>

Amazon CloudWatch、ステータスチェック、EBS の詳細なパフォーマンス統計を使用して、Amazon EBS ボリュームのパフォーマンスをモニタリングおよび分析できます。詳細については、「[Amazon EBS の Amazon CloudWatch メトリクス](using_cloudwatch_ebs.md)」および「[Amazon EBS の詳細なパフォーマンス統計](nvme-detailed-performance-stats.md)」を参照してください。

# Amazon EBS 最適化
<a name="ebs-optimization"></a>

Amazon EBS 最適化インスタンスは、最適化された設定スタックを使用し、Amazon EBS I/O 用に専用のキャパシティを追加で提供します。このように最適化することで、Amazon EBS I/O と、インスタンスからのその他のトラフィックとの間の競合を最小に抑え、EBS ボリュームの最高のパフォーマンスを実現します。

EBS 最適化インスタンスは、Amazon EBS 用に専用の帯域幅を用意します。EBS 最適化インスタンスにアタッチした場合:
+ `io2` Block Express ボリュームは、16KiB の I/O オペレーションで平均 500 マイクロ秒未満のレイテンシーを実現するように設計されています。`io2`Block Express ボリュームでは汎用ボリュームと比較して外れ値のレイテンシーも改善されるため、I/O が 800 マイクロ秒を超える頻度が 10 分の 1 以下に減少します。`io1` および `io2` ボリュームは、1 年の 99.9% の期間、プロビジョンド IOPS パフォーマンスの少なくとも 90% のボリュームを提供するように設計されています。
+ `gp2` ボリュームと `gp3` ボリュームは、1 年の 99% の期間、プロビジョンド IOPS パフォーマンスの少なくとも 90% のボリュームを提供するように設計されています。
+ `st1` および `sc1` ボリュームは、1 年の 99% の期間、想定されるスループットパフォーマンスの少なくとも 90% のボリュームを提供します。

毎時間、予測合計スループットの 99% 達成を目標に、準拠しない期間はほぼ均一に分散されています。詳細については、「[Amazon EBS ボリュームの種類](ebs-volume-types.md)」を参照してください。

ワークロードの I/O サイズは、I/O サイズの増大に伴いレイテンシーが増加するにつれて、観測された平均レイテンシーに影響を及ぼします。例えば、`io2` Block Express ボリュームは、16KiB の I/O 操作で平均 500 マイクロ秒未満のレイテンシーを実現するように設計されています。

詳細については、「*Amazon EC2 ユーザーガイド*」の「[Amazon EBS 最適化インスタンス](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/ebs-optimized.html)」を参照してください。

# Amazon EBS ボリュームの初期化
<a name="initalize-volume"></a>

EBS スナップショットまたは別の EBS ボリューム (ボリュームコピー) から Amazon EBS ボリュームを作成する場合、データブロックにアクセスする前に、データブロックをボリュームに書き込む必要があります。スナップショットから作成されたボリュームの場合は、データブロックを Amazon S3 から新しいボリュームにダウンロードする必要があります。ボリュームコピーの場合は、データブロックをソースボリュームからボリュームコピーにコピーする必要があります。このプロセスは*ボリューム初期化*と呼ばれます。この間、初期化されるボリュームでは、I/O レイテンシーが増加し、パフォーマンスが低下する可能性があります。フルボリュームのパフォーマンスは、すべてのブロックがダウンロードされてボリュームに書き込まれた場合にのみ達成されます。

**注記**  
空のボリュームは、作成直後に最大パフォーマンスを実現し、初期化は必要ありません。

デフォルトのボリューム初期化レートは初期化プロセス全体で変動するため、完了時間が予測できなくなる可能性があります。ボリューム初期化に関連するパフォーマンスへの影響を最小限に抑えるため、次のオプションを使用できます。

**注記**  
ボリュームの初期化レートと高速スナップショット復元は、ボリュームコピーではサポートされていません。詳細については、「[Initialization](ebs-copying-volume.md#copy-volume-initialization)」を参照してください。

**Topics**
+ [ボリューム初期化に Amazon EBS プロビジョンドレートを使用する](#volume-initialization-rate)
+ [高速スナップショット復元が有効になっているスナップショットを使用する](#volume-initialization-fsr)
+ [ボリュームを手動で初期化する](#ebs-initialize)
+ [ボリューム初期化をモニタリングする](ebs-initialize-monitor.md)

## ボリューム初期化に Amazon EBS プロビジョンドレートを使用する
<a name="volume-initialization-rate"></a>

スナップショットから Amazon EBS ボリュームを作成する場合、オプションで、100～300 MiB/秒の範囲のボリューム初期化の Amazon EBS プロビジョンドレート (ボリューム初期化レート) を指定できます。ボリューム初期化レートを指定すると、スナップショットブロックは Amazon S3 からダウンロードされ、作成後に指定されたレートでボリュームに書き込まれます。これにより、予測可能な時間内に完全に初期化され、完全にパフォーマンスを発揮するボリュームを作成できます。

ボリューム初期化レートは、複数のボリュームを同時に作成していて、すべてのボリュームを予測可能な時間内に初期化する必要がある場合に特に便利です。

**注記**  
ボリューム初期化の Amazon EBS プロビジョンドレートは、すべての Amazon EBS ボリュームタイプ、および Amazon EC2 Mac インスタンスを含むすべての Amazon EC2 インスタンスタイプでサポートされています。

ボリューム初期化レートは以下の場合に指定できます。
+ 個々のボリューム作成リクエストの場合
+ インスタンス起動リクエストの EBS ボリュームブロックデバイスマッピングの場合
+ 起動テンプレートの EBS ボリュームブロックデバイスマッピングの場合
+ ルートボリューム置換タスクによって作成された EBS ボリュームの場合
+ Amazon EKS クラスター (EBS CSI ドライバーによって作成) および Amazon ECS クラスターの EBS ボリュームの場合

**Topics**
+ [仕組み](#consistent-rate-how)
+ [考慮事項](#consistent-rate-considerations)
+ [クォータ](#consistent-rate-quota)
+ [料金](#consistent-rate-billing)

### 仕組み
<a name="consistent-rate-how"></a>

ボリューム初期化レートでボリュームを作成すると、スナップショットブロックは指定したレートで Amazon S3 からボリュームにダウンロードされます。

ボリューム初期化にかかる時間は、以下によって異なります。
+ スナップショットのデータサイズ (作成されるボリュームのサイズではありません)。
**ヒント**  
スナップショットのデータサイズを確認するには、[describe-snapshots](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-snapshots.html) コマンド出力の `FullSnapshotSizeInBytes` フィールド、またはコンソールの **[フルスナップショットサイズ]** フィールドを確認します。
+ 指定したボリューム初期化レート

例えば、10 GiB のデータを持つスナップショットを使用して 20 GiB ボリュームを作成し、300 MiB/秒のボリューム初期化レートを指定すると、ボリュームは約 34.1 秒 (10 GiB / 300 MiB/秒 = 34.1 秒) で完全に初期化されます。同様に、同じスナップショットとボリューム初期化レートで同時に 10 個のボリュームを作成すると、10 個のボリュームすべてが 34.1 秒で完全に初期化されます。

### 考慮事項
<a name="consistent-rate-considerations"></a>
+ ボリューム初期化レートは 100～300 MiB/秒の間で指定できます。
+ ボリューム初期化レートを指定する場合、料金と完了時間は、スナップショットデータのサイズ (ボリュームのサイズではありません) と指定したレートによって決まります。詳細については、「[料金](#consistent-rate-billing)」を参照してください。
+ Amazon EBS は、お客様が 99% の時間用に指定したボリューム初期化レートの 10% 以内の平均レートを提供します。
+ ボリューム初期化レートを指定し、高速スナップショット復元が有効になっているスナップショットを使用した場合、Amazon EBS では高速スナップショット復元ではなく指定されたレートが使用されます。高速スナップショット復元を使用したい場合は、ボリューム初期化レートを指定しないでください。
+ 容量の制約または[クォータ](#consistent-rate-quota)の超過により、Amazon EBS が指定されたボリューム初期化レートでボリュームを初期化できない場合、リクエストは失敗します。
+ ローカルゾーン AWS Outpostsまたは Wavelength Zones で作成されたボリュームのボリューム初期化レートを指定することはできません。

### クォータ
<a name="consistent-rate-quota"></a>

同時ボリューム作成リクエスト間でリクエストできる累積ボリューム初期化レートには、5,000 MiB/秒の制限があります。例えば、100 MiB/秒のレートで 50 件の同時ボリューム作成リクエスト (50 件の同時リクエスト x 100 MiB/秒のレート)、または 200 MiB/秒のレートで 25 件の同時リクエスト (25 件の同時リクエスト x 200 MiB/秒のレート) を実行できます。この制限はリージョンごとに適用されます。リクエストがこの制限を超えると、リクエストは失敗します。その場合は進行中のリクエストの一部が完了するまで待つか、クォータの引き上げをリクエストします。詳細については、「[Amazon EBS のクォータ](ebs-resource-quotas.md)」を参照してください。

### 料金
<a name="consistent-rate-billing"></a>

ボリューム初期化レートでボリュームを作成すると、スナップショットデータの GiB あたりのレート、指定した初期化レートの MiB あたりのレートで請求されます。レートはリージョンによって異なります。詳細については、[Amazon EBS の料金表](https://aws.amazon.com/ebs/pricing/)を参照してください。

ボリュームのサイズではなく、スナップショットデータのサイズに基づいて請求されます。例えば、サイズが 100 GiB のボリュームのスナップショットを作成したものの、データ量が 50 GiB しかない場合、スナップショットのボリュームサイズが 100 GiB であっても、スナップショットのデータサイズは 50 GiB となります。そのスナップショットを使用してボリュームを作成し、ボリューム初期化レートを指定する場合、請求は 50 GiB のスナップショットデータに基づいて行われます。

**ヒント**  
スナップショットのデータサイズを確認するには、[describe-snapshots](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-snapshots.html) コマンド出力の `FullSnapshotSizeInBytes` フィールド、またはコンソールの **[フルスナップショットサイズ]** フィールドを確認します。

計算式は次のとおりです。

```
rate for Region x snapshot data size x volume initialization rate
```

ボリュームが `active` 状態になるとすぐに、全額が請求されます。失敗したリクエストについては請求されません。

ボリューム初期化が完了する前にボリュームを削除しても、リクエストしたボリューム初期化レートに対して請求されます。

## 高速スナップショット復元が有効になっているスナップショットを使用する
<a name="volume-initialization-fsr"></a>

高速スナップショット復元が有効になっているスナップショットからボリュームを作成すると、ボリュームは作成時に完全に初期化され、すぐに完全なパフォーマンスを提供します。高速スナップショット復元の使用方法の詳細については、「[Amazon EBS 高速スナップショット復元](ebs-fast-snapshot-restore.md)」を参照してください。

## 作成後にボリュームを手動で初期化する
<a name="ebs-initialize"></a>

作成後に Amazon EBS ボリュームを手動で初期化することで、ボリューム初期化によるパフォーマンスへの影響を最小限に抑えることができます。

次の手順を使用して、作成後に Amazon EBS ボリュームを手動で初期化できます。

**重要**  
スナップショットから作成された Provisioned IOPS SSD ボリュームを初期化している間は、ボリュームのパフォーマンスが想定レベルの 50% を下回る場合があります。このため、ボリュームは [**I/O Performance (I/O 性能)**] ステータスチェックで `warning` 状態が表示されます。これは想定の動作です。初期化中の Provisioned IOPS SSD ボリュームの `warning` 状態は無視してかまいません。詳細については、「[Amazon EBS ボリュームステータスチェック](monitoring-volume-checks.md)」を参照してください。

### Linux インスタンス
<a name="ebs-initialize-linux"></a>

**Linux で、スナップショットから作成されたボリュームを初期化するには**

1. 新しく復元されたボリュームを Linux インスタンスにアタッチします。

1. インスタンスのブロックデバイスを一覧表示するには、**lsblk** コマンドを使用します。

   ```
   $ lsblk
   NAME  MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
   xvdf  202:80   0  30G  0 disk
   xvda1 202:1    0   8G  0 disk /
   ```

   ここでは、新しいボリューム`/dev/xvdf` がアタッチされていますが、マウントされていないことがわかります (`MOUNTPOINT` 列の下にリストされているパスがないため)。

1. <a name="initialize-snapshot-step"></a>デバイスのすべてのブロックを読み取るには、**dd** ユーティリティまたは **fio** ユーティリティを使用します。Linux システムにデフォルトでインストールされているのは **dd** コマンドですが、マルチスレッドの読み取りが可能な **fio** の方が、処理速度が大幅に速くなります。
**注記**  
このステップは、使用している EC2 インスタンスの帯域幅、ボリュームに対してプロビジョニングされている IOPS、そしてボリュームのサイズに応じて、数分から数時間かかることがあります。

   [**dd**] `if` (入力ファイル) パラメータは、初期化するドライブに設定します。`of` (出力ファイル) パラメータは、Linux ヌル仮想デバイス `/dev/null` に設定する必要があります。`bs` パラメータは、読み取り操作のブロックサイズに設定します。最適なパフォーマンスを得るには、この値を 1 MB に設定します。
**重要**  
**dd** を誤って使用すると、ボリュームのデータが失われる場合があります。以下のコマンド例に正確に従ってください。`if=/dev/xvdf` パラメータのみ、読み出しているデバイスの名前によって異なります。

   ```
   $ sudo dd if=/dev/xvdf of=/dev/null bs=1M
   ```

   [**fio**] システムに **fio** がインストールされている場合、ボリュームを初期化するには次のコマンドを使用します。`--filename` (入力ファイル) パラメータは、初期化するドライブに設定します。

   ```
   $ sudo fio --filename=/dev/xvdf --rw=read --bs=1M --iodepth=32 --ioengine=libaio --direct=1 --name=volume-initialize
   ```

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

   ```
   sudo yum install -y fio
   ```

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

   ```
   sudo apt-get install -y fio
   ```

   この操作が終了すると、読み取り操作のレポートが表示されます。これでボリュームを使用する準備ができました。詳細については、「[Amazon EBS ボリュームを使用できるようにする](ebs-using-volumes.md)」を参照してください。

### Windows インスタンス
<a name="ebs-initialize-windows"></a>

どちらのツールを使用する前も、次のようにシステム上のディスクについての情報を収集してください。

**システムディスクに関する情報を収集するには**

1. システムで使用可能なディスクを一覧表示するには、**wmic** コマンドを使用します。

   ```
   wmic diskdrive get size,deviceid
   ```

   出力例を次に示します。

   ```
   DeviceID            Size
   \\.\PHYSICALDRIVE2  80517265920
   \\.\PHYSICALDRIVE1  80517265920
   \\.\PHYSICALDRIVE0  128849011200
   \\.\PHYSICALDRIVE3  107372805120
   ```

1. **dd** または **fio** を使用して、初期化するディスクを識別します。`C:` ドライブは、`\\.\PHYSICALDRIVE0` にあります。使用するドライブ番号がはっきりしない場合は、`diskmgmt.msc` ユーティリティを使用して、ドライブ文字とディスクドライブ番号を比較できます。

------
#### [ Use the dd utility ]

**dd** をインストールおよび使用してボリュームを初期化するには、次の手順を実行します。

**重要な考慮事項**
+ ボリュームの初期化には、使用している EC2 インスタンスの帯域幅、ボリュームに対してプロビジョニングされている IOPS、そしてボリュームのサイズに応じて、数分から数時間かかることがあります。
+ **dd** を誤って使用すると、ボリュームのデータが失われる場合があります。この手順を正確に実行してください。

**Windows 向け dd をインストールするには**

Windows 用 **dd** プログラムは、Linux や Unix システムで共通して使用できる **dd** プログラムと同様の環境を提供します。このプログラムを使用すると、スナップショットから作成された Amazon EBS ボリュームを初期化することができます。最新のベータバージョンでは、`/dev/null` 仮想デバイスをサポートしています。以前のバージョンをインストールする場合は、代わりに `nul` 仮想デバイスを使用できます。詳細なドキュメントは、[http://www.chrysocome.net/dd](http://www.chrysocome.net/dd) から入手できます。

1. Windows 用の最新バイナリバージョンの **dd** を、[http://www.chrysocome.net/dd](http://www.chrysocome.net/dd) からダウンロードします。

1. (オプション) 簡単に覚えられる場所に、コマンドラインユーティリティ用のフォルダを作成します (`C:\bin` など)。コマンドラインユーティリティ用にフォルダを既に指定した場合、次の手順を実行する代わりに、そのフォルダを使用できます。

1. バイナリパッケージを解凍し、`dd.exe` ファイルをコマンドラインユーティリティのフォルダ (`C:\bin` など) にコピーします。

1. どこからでもフォルダ内のプログラムを実行できるようにするため、Path 環境変数にコマンドラインユーティリティのフォルダを追加します。

   1. [**スタート**] を選択し、[**PC**] のコンテキスト (右クリック) メニューを開いて、[**プロパティ**] を選択します。

   1. [**システムの詳細設定**]、[**環境変数**] の順に選択します。

   1. [**システム環境変数**] で [**Path**] 変数を選択し、[**編集**] を選択します。

   1. [**変数値**] として、既存の値の最後に、セミコロンとコマンドラインユーティリティフォルダの場所 (**;C:\$1bin\$1)**) を追加します。

   1. [**OK**] をクリックして、[**システム変数の編集**] ウィンドウを閉じます。

1. 新しいコマンドプロンプトウィンドウを開きます。前の手順を行っても、現在開いているコマンドプロンプトウィンドウの環境変数は更新されません。前の手順を完了した時点で開くコマンドプロンプトウィンドウが更新されます。
<a name="prewarm_snapshot_command"></a>
**Windows 用 dd を使ってボリュームを初期化するには**  
指定したデバイスのすべてのブロックの読み取り (および `/dev/null` 仮想デバイスへの出力の送信) を実行するには、次のコマンドを実行します。このコマンドは、既存のデータを安全に初期化します。

```
dd if=\\.\PHYSICALDRIVEn of=/dev/null bs=1M --progress --size
```

**dd** がボリュームの末尾を超えて読み取りを行おうとすると、エラーが表示されることがあります。このエラーを無視しても問題ありません。

以前のバージョンの **dd** コマンドを使用した場合、そのコマンドは `/dev/null` デバイスをサポートしていません。代わりに、次のように `nul` デバイスを使用することができます。

```
dd if=\\.\PHYSICALDRIVEn of=nul bs=1M --progress --size
```

------
#### [ Use the fio utility ]

**fio** をインストールおよび使用してボリュームを初期化するには、次の手順を実行します。

**Windows 用 **fio** をインストールするには**

Windows 用 **fio** プログラムは、Linux や Unix システムで共通して使用できる **fio** プログラムと同様の環境を提供します。このプログラムを使用すると、スナップショットから作成された Amazon EBS ボリュームを初期化することができます。詳細については、[https://github.com/axboe/fio](https://github.com/axboe/fio)を参照してください。

1. [**fio** MSI](https://github.com/axboe/fio/releases) インストーラをダウンロードするには、最新リリースの **[アセット]** を展開して、MSI インストーラを選択します。

1. **fio** をインストールします。

**Windows 用 **fio** を使用してボリュームを初期化するには**

1. 次のようなコマンドを実行してボリュームを初期化します。

   ```
   fio --filename=\\.\PHYSICALDRIVEn  --rw=read --bs=1M --iodepth=32 --direct=1 --name=volume-initialize
   ```

1. この操作が終了すると、新規ボリュームを使用する準備が完了します。詳細については、「[Amazon EBS ボリュームを使用できるようにする](ebs-using-volumes.md)」を参照してください。

------

# Amazon EBS ボリューム初期化のステータスをモニタリングする
<a name="ebs-initialize-monitor"></a>

スナップショットまたは別のボリューム (ボリュームコピー) からボリュームを作成するときに、ボリューム初期化のステータスをモニタリングして、初期化プロセスが完了したかどうかを判断できます。ボリューム初期化は、次のオプションを使用してモニタリングできます。

**Topics**
+ [AWS CLI および Amazon EC2 コンソール](#ebs-initialize-monitor-ec2)
+ [Amazon EventBridge](#ebs-initialize-monitor-ev)

## AWS CLI および Amazon EC2 コンソール
<a name="ebs-initialize-monitor-ec2"></a>

 AWS CLI および Amazon EC2 コンソールを使用して、ボリュームの作成後にいつでもボリュームの初期化のステータスを確認できます。以下の情報が提供されます。
+ **初期化タイプ** (AWS CLI のみ) — 使用されるボリューム初期化のタイプを示します。高速スナップショット復元とデフォルトのボリューム初期化`default`の場合は 、ボリューム初期化`provisioned-rate`の場合は Amazon EBS プロビジョンドレート、ボリュームコピー初期化`volume-copy`の場合は 。
+ **完了までの推定時間** (AWS CLI のみ) — ボリュームの初期化に Amazon EBS プロビジョンドレートを使用して作成されたボリュームの場合のみ。ボリューム初期化が完了するまでの推定残り時間を秒単位で表します。
+ **[進行状況]** — ボリューム初期化プロセスの進行状況のパーセンテージ (0～100)。高速スナップショット復元で初期化されたボリュームの場合、進行状況は作成直後に 100% に達します。
+ **[初期化の状態]** — ボリューム初期化の全体的な状態 (`initializing` または `completed`)。高速スナップショット復元で初期化されたボリュームの場合、状態は作成直後に `completed` に移行します。

**注記**  
ボリューム初期化の情報が更新されるまでに最大 5 分かかる場合があります。

------
#### [ Console ]

**ボリューム初期化のステータスをモニタリングするには**

1. Amazon EC2 コンソールの [https://console.aws.amazon.com/ec2/](https://console.aws.amazon.com/ec2/) を開いてください。

1. ナビゲーションペインの [**ボリューム**] を選択します。

1. ボリューム初期化のステータスを確認するボリュームを選択します。

1. グリッドの **[初期化の状態]** フィールドと **[詳細]** タブには、*初期化状態 (進行状況のパーセンテージ)* の形式で進行状況情報が表示されます。例えば、*初期化中 (75%)* のように表示されます。

   初期化状態は *[初期化中]* と *[完了]* のいずれかになります。

------
#### [ AWS CLI ]

**ボリューム初期化のステータスをモニタリングするには**  
describe[describe-volume-status](https://docs.aws.amazon.com/cli/latest/reference/ec2/describe-volume-status.html) AWS CLI コマンドを使用して初期化ステータスを表示します。 `EstimatedTimeToCompleteInSeconds`は、ボリューム初期化の Amazon EBS プロビジョンドレートで作成されたボリュームに対してのみ返されます。

例えば、次のコマンドでは、ボリューム初期化の Amazon EBS プロビジョンドレートで作成されたボリューム `vol-11111111111111111` の初期化ステータスをチェックします。

```
aws ec2 describe-volume-status --volume-id vol-01111111111111111
```

以下は出力の例です。

```
{
    "VolumeStatuses": [
        {
            "Actions": [],
            "AvailabilityZone": "us-east-1a",
            "Events": [],
            "VolumeID": "vol-11111111111111111",
            "VolumeStatus": {
                "Details": [
                    {
                        "Name": "io-enabled",
                        "Status": "passed"
                    },
                    {
                        "Name": "io-performance",
                        "Status": "not-applicable"
                    },
                    {
                        "Name": "initialization-state",
                        "Status": "completed"
                    }
                ],
                "Status": "ok"
            },
            "InitializationStatusDetails": {
                "InitializationType": "provisioned-rate",
                "Progress": 75,
                "EstimatedTimeToCompleteInSeconds": 850
            }
        }
    ]
}
```

------

## Amazon EventBridge
<a name="ebs-initialize-monitor-ev"></a>

Amazon EventBridge イベントは、ボリューム初期化の完了**後** 5 分以内にアカウントに送信されます。これらのイベントに応答してプログラムによるアクションをトリガーするルールを作成できます。

**注記**  
イベントは、ベストエフォートベースで出力されます。
初期化が完了する前にボリュームを削除するか、初期化が完了してから 5 分以内にボリュームを削除すると、イベントを受信しない可能性があります。

イベントの詳細については、「[EBS ボリューム初期化イベント](ebs-cloud-watch-events.md#volume-initialization-events)」を参照してください。

**EventBridge を使用してボリューム初期化のステータスをモニタリングするには**

1. Amazon EventBridge コンソールの [https://console.aws.amazon.com/events/](https://console.aws.amazon.com/events/) を開いてください。

1. **[ルール]**、**[ルールの作成]** の順に選択します。

1. **[ステップ 1]** で、以下を行います。

   1. ルールの名前と説明を指定します。

   1. **[イベントバス]** で、イベントを受信するバスを選択します。カスタムイベントバスを作成していない場合は、**デフォルト**のままにするか、「[Creating an event bus in Amazon EventBridge](https://docs.aws.amazon.com/eventbridge/latest/userguide/eb-create-event-bus.html)」を参照してください。

   1. **[ルールタイプ]** で、**[イベントパターンを持つルール]** を選択したままにします。

   1. [**次へ**] を選択します。

1. **[ステップ 2]** で、以下を行います。

   1. **[イベントソース]** で、**[AWS イベントまたは EventBridge パートナーイベント]** を選択します。

   1. **[作成方法]** セクションで、**[カスタムパターン (JSON エディタ)]** を選択します。

   1. **[イベントパターン]** で、以下を追加します。

      ```
      {
          "detail-type": ["EBS Volume Notification"],
          "source": ["aws.ec2"],
          "detail": {
              "event": ["initializeVolume"],
              "result": ["succeeded"]
          }
      }
      ```

      イベント例については、「[EBS ボリューム初期化イベント](ebs-cloud-watch-events.md#volume-initialization-events)」を参照してください。

   1. [**次へ**] を選択します。

1. **[ステップ 3]** で、以下を行います。

   1. **[ターゲットタイプ]** では、**[AWS サービス]** を選択します。

   1. **[ターゲットの選択]** で **[SNS トピック]** を選択し、**[トピック]** で必要なトピックを選択します。トピックを作成していない場合は、「[Creating an Amazon SNS topic](https://docs.aws.amazon.com/sns/latest/dg/sns-create-topic.html)」を参照してください。

   1. **[許可]** で、**[実行ロールを使用 (推奨)]** を選択したままにします。

   1. **[実行ロール]** で、**[この特定のリソースについて新しいロールを作成]** を選択したままにし、デフォルトのロール名のままにします。

   1. [**次へ**] を選択します。

1. **[ステップ 4]** で、必要に応じてルールのタグを指定し、**[次へ]** を選択します。

1. **[ステップ 5]** でルールを確認し、**[ルールの作成]** を選択します。

# 設定可能なインスタンス帯域幅の重み付け
<a name="instance-bandwidth-configuration"></a>

インスタンス帯域幅設定 (IBC) は、Amazon EC2 インスタンスの Amazon EBS と VPC ネットワーク間のネットワーク帯域幅の割り当てを調整できる機能です。この機能は、特定の帯域幅要件を持つワークロードのパフォーマンスを最適化するのに役立ちます。インスタンス帯域幅設定は、一部のインスタンスでのみサポートされています。詳細については、「[EC2 instance bandwidth weighting configuration](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configure-bandwidth-weighting.html#config-bw-support)」を参照してください。

EBS パフォーマンスの場合、`ebs-1` 帯域幅の重み付けを使用すると、ベースライン EBS 帯域幅が 25% 増加し、VPC ネットワーク帯域幅は同じ絶対量だけ減少します。これは、より高い EBS スループットを必要とする I/O 集約型ワークロードにとって有益です。

ワークロードを計画するときは、I/O のサイズとパターンを慎重に検討してください。一般に I/O サイズが小さいほど帯域幅制限の影響を受けにくくなるのに対し、I/O サイズやシーケンシャルワークロードが大きいほど、帯域幅の変化による影響が大きくなる可能性があります。選択した帯域幅の重み付けで最適なパフォーマンスを確保するために、特定のワークロードを徹底的にテストすることが重要です。

**考慮事項**
+ 設定可能なインスタンス帯域幅は、一部のインスタンスタイプでサポートされています。詳細については、「[帯域幅の重み付けでサポートされているインスタンスタイプ](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configure-bandwidth-weighting.html#config-bw-support)」を参照してください。
+ `ebs-1` 帯域幅の重み付けを使用すると、EBS 帯域幅が最大 25% 増加するため、I/O 集約型アプリケーションのパフォーマンスを向上させることができます。ただし、VPC ネットワーク帯域幅は同じ絶対量だけ減少することに注意してください (EBS とネットワーク間の帯域幅仕様の組み合わせは変わりません)。
+ 帯域幅の重み付けを変更すると、I/O パフォーマンスに大きな影響を与える可能性があります。`vpc-1` 帯域幅の重み付けにより、ネットワーク帯域幅が増加しますが、EBS ボリュームの IOPS が予想よりも減少する可能性があります。これは、特に I/O サイズが大きい場合、IOPS 制限の前に EBS 帯域幅制限に達する可能性があるためです。例えば、16 KiB の I/O サイズで通常 240,000 IOPS をサポートするインスタンスタイプでは、`vpc-1` 帯域幅の重みを使用する場合、EBS 帯域幅の減少により IOPS が減少する可能性があります。
+ 選択した帯域幅の重み付けでパフォーマンスのニーズを満たしていることを確認するために、常に特定のワークロードをテストしてください。
+ インスタンスの起動時に帯域幅の重み付けを設定することも、停止したインスタンスの帯域幅の重み付けを変更することもできます。詳細については、「[Configure bandwidth weighting for your instance](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/configure-bandwidth-weighting.html#config-bw-how-to)」を参照してください。
+ インスタンス帯域幅の重み付けは、追加料金なしで設定できます。

# Amazon EBS I/O の特性およびモニタリング
<a name="ebs-io-characteristics"></a>

ボリューム設定が同じであっても、特定の I/O 特性により EBS ボリュームのパフォーマンス動作が向上します。
+ SSD-Backed ボリューム、汎用 SSD (`gp2` および `gp3`) とプロビジョンド IOPS SSD (`io1` および `io2`) は、I/O 操作がランダムでもシーケンシャルでも、安定したパフォーマンスを提供します。
+ HDD-Backed ボリューム、スループット最適化 HDD (`st1`) および Cold HDD (`sc1`) は、サイズが大きくシーケンシャルな I/O 操作の場合のみ、最適なパフォーマンスを提供します。

アプリケーションにおける SSD ボリュームおよび HDD ボリュームのパフォーマンスについて理解するには、ボリュームに対するデマンド、ボリュームに対して使用可能な IOPS の量、I/O 操作が完了するまでにかかる時間、およびボリュームのスループット制限の間のつながりについて知ることが重要です。

**Topics**
+ [IOPS](#ebs-io-iops)
+ [ボリューム のキュー長とレイテンシー](#ebs-io-volume-queue)
+ [I/O サイズとボリュームのスループット制限](#ebs-io-size-throughput-limits)
+ [CloudWatch を使用して I/O 特性を監視する](#ebs-io-metrics)
+ [リアルタイムの I/O パフォーマンス統計をモニタリングする](#monitor-io-nvme)
+ [関連リソース](#ebs-io-resources)

## IOPS
<a name="ebs-io-iops"></a>

IOPS とは、1 秒あたりの入出力操作数を表す測定単位です。操作は KiB 単位で計測され、基礎となるドライブテクノロジーが1 つの I/O としてカウントするデータの最大量を決定します。I/O サイズは、SSD ボリュームで 256 KiB、HDD ボリュームで 1,024 KiB に制限されます。これは、小さい I/O やランダム I/O の扱いにおいて、SSD ボリュームは HDD ボリュームに比べて はるかに効率的であるためです。

小さな I/O 操作が物理的に連続している場合、Amazon EBS ではできる限りこれらを最大の I/O サイズになるまで、単一の I/O 操作にマージして処理します。同様に、I/O 操作が最大 I/O サイズより大きい場合、Amazon EBS ではより小さな I/O 操作に分割して処理しようとします。例をいくつか、次の表に示します。

[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ja_jp/ebs/latest/userguide/ebs-io-characteristics.html)

このため、3,000 IOPS をサポートする SSD-Backed ボリュームを (`io1` または `io2` ボリュームを 3,000 IOPS でプロビジョニングするか、`gp2` ボリュームを 1,000 GiB にサイズ設定するか、`gp3` ボリュームを使用することによって) 作成し、十分な帯域幅を提供できる EBS 最適化インスタンスにアタッチした場合、1 秒あたり最大 3,000 件の I/O 操作分のデータを転送できます (スループットは I/O サイズで決まります)。

## ボリューム のキュー長とレイテンシー
<a name="ebs-io-volume-queue"></a>

ボリュームのキュー長とは、デバイスに対する保留中の I/O リクエストの数です。レイテンシーとは、実際に I/O 操作にかかるエンドツーエンドのクライアント時間です。つまり、I/O を EBS に送信してから、読み取りまたは書き込みの I/O が完了したという確認を EBS から受信するまでの時間ということになります。ゲストオペレーティングシステムまたは EBS へのネットワークリンクでのボトルネックを回避するには、I/O サイズとレイテンシーに合わせて正しくキュー長を調整する必要があります。

最適なキュー長は、アプリケーションがどの程度 IOPS およびレイテンシーの影響を受けるかによってワークロードごとに異なります。EBS ボリュームで利用可能なパフォーマンスをフル活用するための十分な I/O リクエストがワークロードから提供されないと、プロビジョニングどおりの IOPS またはスループットをボリュームで実現できないことがあります。

トランザクション量の多いアプリケーションは、I/O レイテンシーの上昇の影響を受けるため、SSD-Backed ボリュームが適しています。キュー長を小さく抑え、ボリュームで利用可能な限り高い IOPS を維持することにより、低いレイテンシーと高い IOPS を実現できます。ボリュームで利用可能な IOPS を超える IOPS を継続的に強制すると、I/O レイテンシーが上昇する可能性があります。最大限の整合性を確保するには、ボリュームは 1 分間で 1,000 のプロビジョンド IOPS ごとに 1 の平均キュー深度 (最も近い整数に四捨五入) を維持する必要があります。例えば、3,000 IOPS でプロビジョニングされたボリュームの場合、平均キュー深度は 3 である必要があります。

スループットが高いアプリケーションは I/O レイテンシーの上昇による影響を受けにくいため、HDD-Backed ボリュームが適しています。HDD-Backed ボリュームに対する高いスループットを維持するには、サイズの大きなシーケンシャル I/O を実行するときにキュー長を大きくします。

## I/O サイズとボリュームのスループット制限
<a name="ebs-io-size-throughput-limits"></a>

SSD-Backed ボリュームで I/O サイズが非常に大きい場合は、ボリュームのスループット制限に達することにより、IOPS 値がプロビジョニングした値よりも小さくなることがあります。例えば、利用可能なバーストクレジットを持つ 1,000 GiB 未満の `gp2` ボリュームの IOPS 制限は 3,000 で、ボリュームスループット制限は 250 MiB/秒です。256 KiB の I/O サイズを使用している場合、ボリュームは 1000 IOPS (1000 x 256 KiB = 250 MiB) でスループット制限に達します。より小さい I/O サイズ (16 KiB など) では、スループットが 250 MiB/s を大幅に下回っているため、同じボリュームで 3,000 IOPS を維持できます。(これらの例では、ボリュームの I/O がインスタンスのスループット限界に達していないと想定しています)。各 EBS ボリュームタイプのスループット制限については、[Amazon EBS ボリュームの種類](ebs-volume-types.md)を参照してください。

サイズの小さな I/O 操作では、インスタンス内で測定した IOPS がプロビジョニングの値より高くなることがあります。この状況は、インスタンスのオペレーティングシステムが、小さな I/O 操作を Amazon EBS に渡す前に、大きな操作にマージした場合に生じます。

ワークロードが HDD バックアップの `st1` および `sc1` ボリュームでシーケンシャル I/O を使用する場合、ワークロードで使用している I/O がシーケンシャルであれば、インスタンス内で測定した IOPS が予測値より高くなることがあります。この状況は、インスタンスのオペレーティングシステムが、シーケンシャル I/O をマージし、1,024 KiB サイズ単位でカウントすることによって生じます。ワークロードで小さな I/O またはランダム I/O を使用している場合は、スループットが予測値より低くなることがあります。これは、非シーケンシャルの各ランダム I/O をカウントして合計の IOPS カウントを求める過程で、予測より早くボリュームの IOPS 制限に達する場合があるためです。

EBS ボリュームタイプに関係なく、設定したはずの IOPS またはスループットを得られない場合は、EC2 インスタンスの帯域幅が制限要因になっていないか確認してください。最適なパフォーマンスを得るには、常に現行世代の EBS 最適化インスタンス (または、10 Gb/s のネットワーク接続を確保できるインスタンス) を使用してください。予想された IOPS が得られない別の原因として、EBS ボリュームに対して十分な I/O を提供していないことが考えられます。

## CloudWatch を使用して I/O 特性を監視する
<a name="ebs-io-metrics"></a>

これらの I/O 特性は、各ボリュームの [CloudWatch ボリュームメトリクス](using_cloudwatch_ebs.md#ebs-volume-metrics)を使用してモニタリングできます。

**停止した I/O をモニタリングする**  
`VolumeStalledIOCheck` は、EBS ボリュームのステータスをモニタリングして、ボリュームに障害が発生した時期を判断します。メトリクスは、EBS ボリュームが I/O 操作を完了できるかどうかに基づいて `0` (合格) または `1` (失敗) ステータスを返すバイナリ値です。

`VolumeStalledIOCheck` メトリクスが失敗した場合、 が問題を解決 AWS するのを待つか、影響を受けるボリュームの置き換えや、ボリュームがアタッチされているインスタンスの停止と再起動などのアクションを実行できます。ほとんどの場合、このメトリクスが失敗すると、EBS は数分以内にボリュームを自動的に診断して復元します。で [I/O の一時停止](ebs-fis.md)アクションを使用すると AWS Fault Injection Service 、制御された実験を実行して、このメトリクスに基づいてアーキテクチャとモニタリングをテストし、ストレージ障害に対する耐障害性を向上させることができます。

**ボリュームの I/O レイテンシーをモニタリングする**  
`VolumeAvgReadLatency` および `VolumeAvgWriteLatency` メトリクスをそれぞれ使用して、Amazon EBS ボリュームの読み取りおよび書き込み操作の平均レイテンシーをモニタリングできます。の [Latency Injection](ebs-fis-latency-injection.md) アクションを使用すると AWS Fault Injection Service 、制御された実験を実行して、このメトリクスに基づいてアーキテクチャとモニタリングをテストし、ストレージのパフォーマンス低下に対する耐障害性を向上させることができます。

I/O レイテンシーが必要な値よりも高い場合、ボリュームに対してプロビジョニングした IOPS またはスループット以上の処理をアプリケーションが実行しようとしていないことを確認します。`VolumeAvgIOPS` および `VolumeAvgThroughput` メトリクスを使用して、1 分間にボリュームに駆動される平均 IOPS とスループットをモニタリングし、それをボリュームのプロビジョンド IOPS とスループットと比較できます。ボリュームが 1 分間に操作を駆動しない場合、メトリクスでは `0` の値が報告されます。高 IOPS またはスループットのバーストが 1 分よりも短い間隔で発生した場合、ボリュームにマイクロバーストが発生しますが、平均 IOPS およびスループットメトリクスでは、ボリュームのプロビジョンド IOPS またはスループット制限よりも低いパフォーマンスが駆動されていると報告される可能性があります。ボリュームで特定の 1 分間にパフォーマンスのバーストが発生しているかどうかを確認するには、`VolumeIOPSExceededCheck` および `VolumeThroughputExceededCheck` メトリクスを使用します。これらのメトリクスをモニタリングして、ワークロードが一貫して特定の 1 分間にボリュームのプロビジョニングされたパフォーマンスよりも大きい IOPS またはスループットを駆動しようとしたかを判断できます。1 分間の任意の秒において駆動された IOPS が一貫してボリュームのプロビジョンド IOPS のパフォーマンスを超える場合、`VolumeIOPSExceededCheck` メトリクスは `1` を返します。1 分以内の任意の秒において駆動されたスループットが一貫してボリュームのプロビジョニングされたスループットパフォーマンスを超える場合、`VolumeThroughputExceededCheck` メトリクスは `1` を返します。駆動された IOPS とスループットがボリュームのプロビジョニングされたパフォーマンス内に留まっている場合、メトリクスは `0` を返します。

ボリュームが提供できるよりも多くの IOPS がアプリケーションに必要な場合は、次のいずれかの使用を検討する必要があります。
+ 必要なレイテンシーを実現するのに十分な IOPS がプロビジョニングされている、`gp3`、`io2`、または `io1` ボリューム
+ 十分なベースライン IOPS パフォーマンスを実現するより大容量の `gp2` ボリューム

`st1` および `sc1` の HDD-Back ボリュームは、1,024 KiB の最大 I/O サイズを活用するワークロードに最適な設定になっています。ボリュームの平均 I/O サイズを求めるには、`VolumeWriteBytes` を `VolumeWriteOps` で除算します。読み取り操作にも同じ計算を適用できます。平均 I/O サイズが 64 KiB を下回る場合は、`st1` または `sc1` のボリュームに送る I/O 操作のサイズを大きくすると、パフォーマンスが向上します。

**`gp2`、`st1`、および `sc1` ボリュームのバーストバケットバランスをモニタリングする**  
`BurstBalance` は `gp2`、`st1`、および `sc1` ボリュームのバーストバケットバランスを残りのバランスの割合として表示します。バーストバケットが減ると、ボリューム I/O (`gp2` ボリューム用) またはボリュームスループット (`st1` および `sc1` ボリューム用) はベースラインにスロットリングされます。この理由でボリュームに制限が適用されているかどうかを確認するには、`BurstBalance` の値を調べてください。利用可能な Amazon EBS メトリクスの完全なリストについては、[Amazon EBS の Amazon CloudWatch メトリクス](using_cloudwatch_ebs.md) および「[Nitro ベースのインスタンスの Amazon EBS メトリクス](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/viewing_metrics_with_cloudwatch.html#ebs-metrics-nitro)」を参照してください。

## リアルタイムの I/O パフォーマンス統計をモニタリングする
<a name="monitor-io-nvme"></a>

Nitro ベースの Amazon EC2 インスタンスにアタッチされている Amazon EBS ボリュームの詳細なパフォーマンス統計にリアルタイムでアクセスできます。

これらの統計を組み合わせて、平均レイテンシーと IOPS を導き出したり、I/O 操作が完了中かどうかを確認したりすることができます。また、アプリケーションが EBS ボリュームまたはアタッチされたインスタンスのプロビジョンド IOPS またはスループット制限を超えた合計時間を表示することもできます。これらの統計の増加を経時的に追跡することで、アプリケーションのパフォーマンスを最適化するためにプロビジョンド IOPS またはスループット制限を増やす必要があるかどうかを判断できます。詳細なパフォーマンス統計には、読み取りおよび書き込み I/O 操作のヒストグラムも含まれています。これにより、レイテンシーバンド内で完了した I/O 操作の合計数を追跡することで、I/O レイテンシーの分布を確認できます。

詳細については、「[Amazon EBS の詳細なパフォーマンス統計](nvme-detailed-performance-stats.md)」を参照してください。

## 関連リソース
<a name="ebs-io-resources"></a>

Amazon EBS の I/O 特性の詳細については、re:Invent プレゼンテーション[Amazon EBS: パフォーマンスを考慮した設計](https://www.youtube.com/watch?v=2wKgha8CZ_w)を参照してください。

# Amazon EBS および RAID の構成
<a name="raid-config"></a>

Amazon EBS では、従来のベアメタルサーバーで使用できる標準的な RAID 設定はすべて使用できます。ただしその RAID 設定が、お使いのインスタンスのオペレーティングシステムでサポートされている必要があります。これは、RAID がすべてソフトウェアレベルで実現されるためです。

Amazon EBS ボリュームのデータは、同じアベイラビリティーゾーン内の複数のサーバーにレプリケートされます。これは、コンポーネントの 1 つに障害が発生したことが原因でデータが失われるのを防ぐためです。このレプリケーションにより、一般的なコモディティディスクドライブに比べて Amazon EBS ボリュームの信頼性が 10 倍に高まります。詳細については、「[Amazon EBS の特徴](https://aws.amazon.com/ebs/features/)」を参照してください。

**Topics**
+ [RAID 設定オプション](#raid-config-options)
+ [RAID 0 アレイの作成](#create-raid-array)
+ [RAID アレイでのボリュームのスナップショットの作成](#ebs-snapshots-raid-array)

## RAID 設定オプション
<a name="raid-config-options"></a>

RAID 0 アレイを作成すると、単一の Amazon EBS ボリュームでプロビジョニングする場合よりも、ファイルシステムで高レベルのパフォーマンスが実現されます。I/O パフォーマンスが最も重要視される場合には、RAID 0 を使用します。RAID 0 では、I/O がストライプ内のボリューム全体に分散されます。ボリュームを追加すると、スループットと IOPS を追加したことになります。ただし、ストライプのパフォーマンスは、セット内で最もパフォーマンスの低いボリュームにより制限されることに留意してください。セット内のボリュームが 1 つ失われた場合でも、結果としてアレイのデータが完全に失われます。

RAID 0 アレイの最終的なサイズは、アレイ内のボリュームサイズの合計です。帯域幅は、アレイ内のボリュームで利用可能な帯域幅の合計です。例えば、4,000 のプロビジョンド IOPS が設定された 500 GiB の `io1` ボリュームが 2 つある場合、そのそれぞれが、使用可能な帯域幅が 8,000 IOPS でスループットが 1,000 MiB/秒の、1,000 GiB の RAID 0 アレイを構築します。

**重要**  
RAID 5 と RAID 6 ではボリュームに使用できる IOPS の一部がパリティ書き込み操作によって消費されるため、Amazon EBS にはこれらの RAID モードをお勧めしません。RAID アレイの構成によっては、これらの RAID モードで使用できる IOPS が RAID 0 構成と比較して 20 ～ 30% 少なくなる場合があります。これらの RAID モードにはコストの増加も伴います。ボリュームサイズとスピードが同じ 2 ボリュームの RAID 0 アレイの方が、コストが 2 倍の 4 ボリュームの RAID 6 アレイよりも優れたパフォーマンスが得られる場合があります。  
RAID 1 も、Amazon EBS での使用が推奨されません。RAID 1 ではデータが同時に複数のボリュームに書き込まれるため、非 RAID 構成と比較して、Amazon EC2 と Amazon EBS の間により大きな帯域幅が必要となります。さらに、RAID 1 は書き込みパフォーマンスの向上をもたらしません。

## RAID 0 アレイの作成
<a name="create-raid-array"></a>

次の手順に従って RAID 0 アレイを作成します。

**考慮事項**
+ この手順を実行する前に、RAID 0 アレイのサイズおよびプロビジョニングする IOPS 数を決定してください。
+ アレイに作成するボリュームのサイズと IOPS パフォーマンス値は同一にしてください。EC2 インスタンスで利用可能な帯域幅を超えるアレイを作成しないよう注意してください。
+ RAID ボリュームからの起動は避ける必要があります。デバイスの 1 つが失敗した場合、オペレーティングシステムを起動できなくなる場合があります。

### Linux インスタンス
<a name="create-raid-array-linux"></a>

**Linux で RAID 0 アレイを作成するには**

1. アレイに Amazon EBS ボリュームを作成します。詳細については、「[Amazon EBS ボリュームの作成](ebs-creating-volume.md)」を参照してください。

1. アレイをホストするインスタンスに Amazon EBS ボリュームをアタッチします。詳細については、[Amazon EBS ボリュームを Amazon EC2 インスタンスにアタッチ](ebs-attaching-volume.md)を参照してください。

1. **mdadm** コマンドを使用して、新しくアタッチした Amazon EBS ボリュームから論理 RAID デバイスを作成します。[*number\$1of\$1volumes*] に、構成するアレイ内のボリュームの数を入れ、*device\$1name* に、アレイ内の各ボリュームのデバイス名 (`/dev/xvdf` など) を入れます。*MY\$1RAID* を、配列の一意の名前で置き換えることもできます。
**注記**  
インスタンスのデバイス名を見つけるには、**lsblk** コマンドを使用してデバイスのリストを表示します。

   RAID 0 アレイを作成するには、次のコマンドを実行します (アレイをストライプ化するには `--level=0` オプションをメモしておきます)。

   ```
   [ec2-user ~]$ sudo mdadm --create --verbose /dev/md0 --level=0 --name=MY_RAID --raid-devices=number_of_volumes device_name1 device_name2
   ```
**ヒント**  
`mdadm: command not found` エラーが発生した場合は、`sudo yum install mdadm` コマンドを使用して mdadm をインストールします。

1.  RAID アレイでの初期化と同期に許可された時間です。これらのオペレーションの進行状況は、次のコマンドを使用して追跡できます。

   ```
   [ec2-user ~]$ sudo cat /proc/mdstat
   ```

   出力例を次に示します。

   ```
   Personalities : [raid0]
   md0 : active raid0 xvdc[1] xvdb[0]
         41910272 blocks super 1.2 512k chunks
   
   unused devices: <none>
   ```

   一般的に、次のコマンドで RAID アレイに関する詳細情報を表示できます。

   ```
   [ec2-user ~]$ sudo mdadm --detail /dev/md0
   ```

   出力例を次に示します。

   ```
   /dev/md0:
              Version : 1.2
        Creation Time : Wed May 19 11:12:56 2021
           Raid Level : raid0
           Array Size : 41910272 (39.97 GiB 42.92 GB)
         Raid Devices : 2
        Total Devices : 2
          Persistence : Superblock is persistent
   
          Update Time : Wed May 19 11:12:56 2021
                State : clean
       Active Devices : 2
      Working Devices : 2
       Failed Devices : 0
        Spare Devices : 0
   
           Chunk Size : 512K
   
   Consistency Policy : none
   
                 Name : MY_RAID
                 UUID : 646aa723:db31bbc7:13c43daf:d5c51e0c
               Events : 0
   
       Number   Major   Minor   RaidDevice State
          0     202       16        0      active sync   /dev/sdb
          1     202       32        1      active sync   /dev/sdc
   ```

1. RAID アレイにファイルシステムを作成し、それを後でマウントするときに、使用するラベルをそのファイルシステムに提供します。例えば、ext4 ファイルシステムのラベル *MY\$1RAID* で作成するには、次のコマンドを実行します。

   ```
   [ec2-user ~]$ sudo mkfs.ext4 -L MY_RAID /dev/md0
   ```

   アプリケーションの要件またはオペレーティングシステムの制限によって、ext3 や XFS などの異なるファイルシステムタイプを使用できます (対応するファイルシステム作成コマンドについては、ファイルシステムの資料を参照してください)。

1. RAID アレイがブート時に自動的に再編成されることを確認するには、RAID 情報を含むように設定ファイルを作成します。

   ```
   [ec2-user ~]$ sudo mdadm --detail --scan | sudo tee -a /etc/mdadm.conf
   ```
**注記**  
Amazon Linux 以外の Linux ディストリビューションを使用している場合は、このコマンドを変更する必要が生じることがあります。例えば、ファイルを別の場所に配置することや、`--examine` パラメータを追加することが必要な場合があります。詳細については、Linux インスタンスで **man mdadm.conf** を実行します。

1. 新しい RAID 設定のブロックデバイスモジュールを適切に事前ロードする新しいラムディスクイメージを作成する:

   ```
   [ec2-user ~]$ sudo dracut -H -f /boot/initramfs-$(uname -r).img $(uname -r)
   ```

1. RAID アレイのマウントポイントを作成します。

   ```
   [ec2-user ~]$ sudo mkdir -p /mnt/raid
   ```

1. 最後に、作成したマウントポイントに RAID デバイスをマウントします。

   ```
   [ec2-user ~]$ sudo mount LABEL=MY_RAID /mnt/raid
   ```

   これで RAID デバイスを使用する準備ができました。

1. (オプション) システムブート時に常に、この Amazon EBS ボリュームをマウントするには、`/etc/fstab` ファイルにデバイス用のエントリを追加します。

   1. `/etc/fstab` ファイルのバックアップコピーを作成すると、編集中に誤って破壊/削除してしまった場合にこのコピーを使用できます。

      ```
      [ec2-user ~]$ sudo cp /etc/fstab /etc/fstab.orig
      ```

   1. お好みのテキストエディタ (`/etc/fstab` や **nano** など) を使用して、**vim** ファイルを開きます。

   1. 「`UUID=`」で始まる行にコメントして、ファイルの最後に次の形式で RAID ボリュームの新しい行を追加します。

      ```
      device_label mount_point file_system_type fs_mntops fs_freq fs_passno
      ```

      この行の最後の 3 つのフィールドは、ファイルシステムのマウントオプション、ファイルシステムのダンプ頻度、ブート時に実行されるファイルシステムチェックの順番です。これらの値がわからない場合は、次の例の値を使用してください。(`defaults,nofail 0 2)` `/etc/fstab` エントリの詳細については、**fstab** のマニュアルページを参照してください。 (コマンドラインで **man fstab** を入力します。)) 例えば、マウントポイント `/mnt/raid` にラベル MY\$1RAID を持つデバイスに ext4 ファイルシステムをマウントするには、`/etc/fstab` に次のエントリを追加します。
**注記**  
このボリュームをアタッチしないでインスタンスを起動することを目的としている場合 (例えば、このボリュームが異なるインスタンス間で移動される可能性がある場合)、`nofail` マウントオプションを追加し、ボリュームのマウントでエラーが発生してもインスタンスが起動できるようにしてください。Debian から派生した OS (Ubuntu など) では、`nobootwait` マウントオプションも追加する必要があります。

      ```
      LABEL=MY_RAID       /mnt/raid   ext4    defaults,nofail        0       2
      ```

   1. 新しいエントリを `/etc/fstab` に追加した後、エントリが正しく動作するかを確認する必要があります。**sudo mount -a** コマンドを使用して、すべてのファイルシステムを `/etc/fstab` にマウントします。

      ```
      [ec2-user ~]$ sudo mount -a
      ```

      前のコマンドを実行してもエラーが発生しない場合、`/etc/fstab` ファイルに問題はありません。次回ブート時にファイルシステムは自動的にマウントされます。このコマンドを実行してエラーが発生した場合、エラーを調べて、`/etc/fstab` を修正してください。
**警告**  
`/etc/fstab` ファイルにエラーがあると、システムがブート不能になる可能性があります。`/etc/fstab` ファイルにエラーがあるシステムをシャットダウンしないでください。

   1. (オプション) `/etc/fstab` のエラーの修正方法が不明な場合、次のコマンドを使って、いつでもバックアップの `/etc/fstab` ファイルを復元することができます。

      ```
      [ec2-user ~]$ sudo mv /etc/fstab.orig /etc/fstab
      ```

### Windows インスタンス
<a name="create-raid-array-windows"></a>

**Windows で RAID 0 アレイを作成するには**

1. アレイに Amazon EBS ボリュームを作成します。詳細については、「[Amazon EBS ボリュームの作成](ebs-creating-volume.md)」を参照してください。

1. アレイをホストするインスタンスに Amazon EBS ボリュームをアタッチします。詳細については、[Amazon EBS ボリュームを Amazon EC2 インスタンスにアタッチ](ebs-attaching-volume.md)を参照してください。

1. Windows インスタンスに接続します。詳細については、「[Windows インスタンスに接続する](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/connecting_to_windows_instance.html)」を参照してください。

1. コマンドプロンプトを開いて、**diskpart** コマンドを入力します。

   ```
   diskpart
   
   Microsoft DiskPart version 6.1.7601
   Copyright (C) 1999-2008 Microsoft Corporation.
   On computer: WIN-BM6QPPL51CO
   ```

1. `DISKPART` プロンプトで、次のコマンドを使用して、利用できるディスクの一覧を表示できます。

   ```
   DISKPART> list disk
   
     Disk ###  Status         Size     Free     Dyn  Gpt
     --------  -------------  -------  -------  ---  ---
     Disk 0    Online           30 GB      0 B
     Disk 1    Online            8 GB      0 B
     Disk 2    Online            8 GB      0 B
   ```

   アレイで使用するディスクを確認し、ディスクの番号を書き留めます。

1. <a name="windows_raid_disk_step"></a>アレイで使用する各ディスクは、既存のボリュームを含まないオンラインの動的なディスクである必要があります。ベーシックディスクを動的なディスクに変換する手順と既存のボリュームを削除する手順は以下のとおりです。

   1. 次のコマンドを使用して、アレイで利用するディスクを選択します。*n* を利用するディスクの番号に置き換えます。

      ```
      DISKPART> select disk n
      
      Disk n is now the selected disk.
      ```

   1. 選択したディスクが `Offline` と表示されている場合は、**online disk** コマンドを実行してオンラインにします。

   1. 選択したディスクにおいて、前述の`Dyn` コマンドの出力の **list disk** 列にアスタリスクが付いていない場合、動的なディスクに変換する必要があります。

      ```
      DISKPART> convert dynamic
      ```
**注記**  
ディスクが書き込み禁止であることを示すエラーが表示された場合は、**ATTRIBUTE DISK CLEAR READONLY** コマンドを使って読み取り専用フラグをクリアしてから、動的ディスク変換をもう一度試してください。

   1. **detail disk** コマンドを使用して、選択したディスクの既存のボリュームを確認します。

      ```
      DISKPART> detail disk
      
      XENSRC PVDISK SCSI Disk Device
      Disk ID: 2D8BF659
      Type   : SCSI
      Status : Online
      Path   : 0
      Target : 1
      LUN ID : 0
      Location Path : PCIROOT(0)#PCI(0300)#SCSI(P00T01L00)
      Current Read-only State : No
      Read-only  : No
      Boot Disk  : No
      Pagefile Disk  : No
      Hibernation File Disk  : No
      Crashdump Disk  : No
      Clustered Disk  : No
      
        Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
        ----------  ---  -----------  -----  ----------  -------  ---------  --------
        Volume 2     D   NEW VOLUME   FAT32  Simple      8189 MB  Healthy
      ```

      ディスクのボリュームの番号を書き留めます。この例では、ボリュームの番号は 2 です。ボリュームがない場合、次の手順は省略できます。

   1. (前の手順でボリュームの存在が確認された場合のみ) 前の手順で確認したディスクで既存のボリュームを選択して削除します。
**警告**  
この手順により、ボリュームの既存データがすべて失われます。

      1. ボリュームを選択します。*n* をボリュームの番号と置き換えてください。

         ```
         DISKPART> select volume n
         Volume n is the selected volume.
         ```

      1. ボリュームを削除します。

         ```
         DISKPART> delete volume
         
         DiskPart successfully deleted the volume.
         ```

      1. 選択したディスクで削除する必要があるボリュームごとに以下の手順を繰り返します。

   1. アレイで使用するディスクごとに[Step 6](#windows_raid_disk_step)を繰り返します。

1. 使用するディスクが動的なディスクであるかどうかを確認します。このケースでは、ディスク 1 と 2 を RAID ボリュームのために使用しています。

   ```
   DISKPART> list disk
   
     Disk ###  Status         Size     Free     Dyn  Gpt
     --------  -------------  -------  -------  ---  ---
     Disk 0    Online           30 GB      0 B
     Disk 1    Online            8 GB      0 B   *
     Disk 2    Online            8 GB      0 B   *
   ```

1. RAID アレイを作成します。Windows では、RAID 0 ボリュームはストライプ化されたボリュームとして参照されます。

   次のコマンドにより、ディスク 1 とディスク 2 上にストライプ化されたボリュームアレイを作成します (アレイをストライプ化するには `stripe` オプションをメモしてください)。

   ```
   DISKPART> create volume stripe disk=1,2
   DiskPart successfully created the volume.
   ```

1. 新しいボリュームを確認します。

   ```
   DISKPART> list volume
   
     DISKPART> list volume
   
     Volume ###  Ltr  Label        Fs     Type        Size     Status     Info
     ----------  ---  -----------  -----  ----------  -------  ---------  --------
     Volume 0     C                NTFS   Partition     29 GB  Healthy    System
     Volume 1                      RAW    Stripe        15 GB  Healthy
   ```

   `Type` 列には、Volume 1 が `stripe` ボリュームであることが示されていることに注意してください。

1. ボリュームを選択してフォーマットし、ボリュームの使用を開始できるようにします。

   1. フォーマットするボリュームを選択します。*n* をボリュームの番号に置き換えます。

      ```
      DISKPART> select volume n
      
      Volume n is the selected volume.
      ```

   1. ボリュームをフォーマットします。
**注記**  
完全フォーマットを実行するには、`quick` オプションを省略します。

      ```
      DISKPART> format quick recommended label="My new volume"
      
        100 percent completed
      
      DiskPart successfully formatted the volume.
      ```

   1. ボリュームに使用可能な任意のドライブ文字を割り当てます。

      ```
      DISKPART> assign letter f
      
      DiskPart successfully assigned the drive letter or mount point.
      ```

   新しいボリュームを使用する準備ができました。

## RAID アレイでのボリュームのスナップショットの作成
<a name="ebs-snapshots-raid-array"></a>

スナップショットを使用して、RAID 配列で EBS ボリュームのデータをバックアップする場合には、そのスナップショットが一貫していることを確認する必要があります。これは、ボリュームのスナップショットが個別に作成されるためです。同期されていないスナップショットから RAID 配列の EBS ボリュームを復元すると、配列の整合性は低下します。

RAID 配列の一貫性のあるスナップショットを作成するには、[EBS マルチボリュームスナップショット](https://docs.aws.amazon.com/AWSEC2/latest/APIReference/API_CreateSnapshots.html)を使用します。マルチボリュームスナップショットを使用すると、EC2 インスタンスにアタッチされている複数の EBS ボリュームにわたって、ポイントインタイムで、データ調整済みの Crash-consistent スナップショットを取得できます。スナップショットは複数の EBS ボリュームにわたって自動的に作成されるため、一貫性を保証できるように、ボリューム間で調整してインスタンスを停止する必要はありません。詳細については、「[Create Amazon EBS snapshots](https://docs.aws.amazon.com/ebs/latest/userguide/ebs-creating-snapshot.html)」のマルチボリュームスナップショットを作成するステップを参照してください。

# Amazon EBS ボリュームのベンチマーク
<a name="benchmark_procedures"></a>

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

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

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

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

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

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

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

1. ボリュームを削除し、料金が発生しないようにインスタンスを終了する。

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

## インスタンスのセットアップ
<a name="set_up_instance"></a>

EBS ボリュームで最適なパフォーマンスを実現するには、EBS 最適化インスタンスを使用することをお勧めします。EBS 最適化インスタンスは、Amazon EC2 と Amazon EBS の間で所定の帯域幅を実現するものであり、インスタンスタイプに応じて仕様で選択できます。

EBS 最適化インスタンスを作成するには、Amazon EC2 コンソールを使用してインスタンスを起動するときに **[EBS 最適化インスタンスとして起動する]** を選択するか、コマンドラインを使用するときに **--ebs-optimized** を指定します。このオプションをサポートするインスタンスタイプを必ず選択してください。

### Provisioned IOPS SSD または 汎用 SSD ボリュームの設定
<a name="setupPIOPS"></a>

Amazon EC2 コンソールを使用して、プロビジョンド IOPS SSD (`io1` および `io2`) または汎用 SSD (`gp2` および `gp3`) ボリュームを作成するには、[**ボリュームタイプ**] で、[**プロビジョンド IOPS SSD (io1)**]、[**プロビジョンド IOPS SSD (io2)**]、[**汎用 SSD (gp2)**]、または [**汎用 SSD (gp3)**] を選択します。コマンドラインの **--volume-type** パラメータには、`io1`、`io2`、`gp2`、または `gp3` を指定します。`io1`、`io2`、および `gp3` ボリュームの場合は、**--iops** パラメータに、1 秒あたりの I/O オペレーション数 (IOPS) を指定します。詳細については、「[Amazon EBS ボリュームの種類](ebs-volume-types.md)」および「[Amazon EBS ボリュームの作成](ebs-creating-volume.md)」を参照してください。

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

RAID 0 アレイの作り方の詳細については、「[RAID 0 アレイの作成](raid-config.md#create-raid-array)」を参照してください。

### スループット最適化 HDD (`st1`) または Cold HDD (`sc1`) ボリュームをセットアップする
<a name="set_up_hdd"></a>

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

(*Linux インスタンスのみ*) は、この設定手順を簡素化 CloudFormation する で使用する JSON テンプレート AWS を提供します。[テンプレート](https://s3.amazonaws.com/cloudformation-examples/community/st1_cloudformation_template.json)にアクセスして JSON ファイルとして保存します。 では、独自の SSH キーを設定 CloudFormation でき、`st1`ボリュームを評価するパフォーマンステスト環境を簡単にセットアップできます。テンプレートを使用すると、現行世代のインスタンスと 2 TiB の `st1` ボリュームが作成され、このボリュームが `/dev/xvdf` のインスタンスにアタッチされます。

**(*Linux インスタンスのみ*) テンプレートを使用して HDD ボリュームを作成する方法**

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

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

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

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

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

1. 新しいスタックのステータスが **[CREATE\$1IN\$1PROGRESS]** から **[COMPLETE]** に移行したら、**[出力]** を選択して新しいインスタンスのパブリック DNS エントリを取得します。このインスタンスには、2 TiB の `st1` ボリュームがアタッチされます。

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

1. [ベンチマークツールのインストール](#install_tools) に進みます。

## ベンチマークツールのインストール
<a name="install_tools"></a>

次の表に、EBS ボリュームのパフォーマンスをベンチマークするために使用できるツールのいくつかを示します。

### Linux インスタンス
<a name="install_tools-linux"></a>


| ツール | 説明 | 
| --- | --- | 
|  fio  |  I/O ベンチマーキングを評価します。(**fio** は `libaio-devel` に依存することに注意してください。) **fio** を Amazon Linux にインストールするには、次のコマンドを実行します。 <pre>$ sudo yum install -y fio</pre> Ubuntu に **fio** インストールするには、次のコマンドを実行します。 <pre>sudo apt-get install -y fio</pre>  | 
|  [Oracle Orion Calibration ツール](https://docs.oracle.com/cd/E18283_01/server.112/e16638/iodesign.htm#BABFCFBC)  |  Oracle データベースで使用するストレージシステムの I/O パフォーマンスを調整します。  | 

### Windows インスタンス
<a name="install_tools-windows"></a>


| ツール | 説明 | 
| --- | --- | 
| [DiskSpd](https://github.com/microsoft/diskspd/releases) | DiskSpd は、Microsoft の Windows、Windows Server、クラウドサーバーインフラストラクチャエンジニアリングチームのストレージパフォーマンスツールです。これは、次からダウンロードできます。[https://github.com/Microsoft/diskspd/releases](https://github.com/Microsoft/diskspd/releases) `diskspd.exe` 実行可能ファイルをダウンロードした後、管理者権限でコマンドプロンプトを開き (「管理者として実行を選択」)、`diskspd.exe` ファイルをコピーしたディレクトリに移動します。 適切な実行可能フォルダ (`amd64fre`、`armfre` または `x86fre)`) から目的の `diskspd.exe` 実行可能ファイルを `C:\DiskSpd` などの短い、単純なパスにコピーします。ほとんどの場合、`amd64fre` フォルダから 64 ビットバージョンの DiskSpd を使用します。 DiskSpd のソースコードは、[https://github.com/Microsoft/diskspd](https://github.com/Microsoft/diskspd) の GitHub でホストされています。 | 
|  CrystalDiskMark  | CrystalDiskMark は、シンプルなディスクベンチマークソフトウェアです。[https://crystalmark.info/en/software/crystaldiskmark/](https://crystalmark.info/en/software/crystaldiskmark/) でダウンロードできます。 | 

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

## ボリュームキュー長の選択
<a name="UnderstandingQueueLength"></a>

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

### SSD-Backed ボリュームのキュー長
<a name="SSD_queue"></a>

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

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

### HDD-Backed ボリュームのキュー長
<a name="HDD_queue"></a>

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 に設定します。アプリケーションに最適な値を確認するには、これらの値を増減して調整してください。

## C ステートの無効化
<a name="cstates"></a>

ベンチマーキングを実行する前に、プロセッサの C ステートを無効にする必要があります。サポートされている CPU の一時的にアイドリング状態のコアは、電力を節約するために C ステートに入ることができます。コアが処理を再開するために呼び出されると、コアが再び完全に動作するまで一定の時間が経過します。このレイテンシーは、プロセッサのベンチマーキングルーチンを妨げる可能性があります。C ステートとその EC2 インスタンスタイプでサポートされるインスタンスの詳細については、[EC2 インスタンスタイプのプロセッサのステート制御](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/processor_state_control.html)を参照してください。

### Linux インスタンス
<a name="cstates-linux"></a>

Amazon Linux、RHEL、および CentOS で C ステートを無効にするには、次のようにします。

1. C ステートの数を取得します。

   ```
   $ cpupower idle-info | grep "Number of idle states:"
   ```

1. C ステート c1 から cN にして無効にします。理想的には、コアは c0 ステートにある必要があります。

   ```
   $ for i in `seq 1 $((N-1))`; do cpupower idle-set -d $i; done
   ```

### Windows インスタンス
<a name="cstates-windows"></a>

次のようにして、Windows システムで C ステートを無効にできます。

1. PowerShell で、現在のアクティブな電力スキームを取得します。

   ```
   $current_scheme = powercfg /getactivescheme
   ```

1. 電力スキームの GUID を取得します。

   ```
   (Get-WmiObject -class Win32_PowerPlan -Namespace "root\cimv2\power" -Filter "ElementName='High performance'").InstanceID          
   ```

1. 電力設定 GUID を取得します。

   ```
   (Get-WmiObject -class Win32_PowerSetting -Namespace "root\cimv2\power" -Filter "ElementName='Processor idle disable'").InstanceID                  
   ```

1. 電力設定サブグループの GUID を取得します。

   ```
   (Get-WmiObject -class Win32_PowerSettingSubgroup -Namespace "root\cimv2\power" -Filter "ElementName='Processor power management'").InstanceID
   ```

1. インデックスの値を 1 に設定して、C ステートを無効にします。値 0 は、C ステートが無効であることを示します。

   ```
   powercfg /setacvalueindex <power_scheme_guid> <power_setting_subgroup_guid> <power_setting_guid> 1
   ```

1. アクティブなスキームを設定して、設定が保存されるようにします。

   ```
   powercfg /setactive <power_scheme_guid>
   ```

## ベンチマーキングを実行する
<a name="perform_benchmarking"></a>

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

EBS ボリュームがアタッチされている EBS 最適化インスタンスで、次のコマンドを実行します。EBS ボリュームをスナップショットから作成した場合は、ベンチマーキングを実行する前に、必ず初期化してください。詳細については、「[作成後にボリュームを手動で初期化する](initalize-volume.md#ebs-initialize)」を参照してください。

**ヒント**  
EBS の詳細なパフォーマンス統計によって提供される I/O レイテンシーヒストグラムを使用して、ベンチマークテストの I/O パフォーマンスの分布を比較できます。詳細については、「[Amazon EBS の詳細なパフォーマンス統計](nvme-detailed-performance-stats.md)」を参照してください。

ボリュームのテストが完了したら、クリーンアップに関する次のトピックの [Amazon EBS ボリュームの削除](ebs-deleting-volume.md) および「[インスタンスの終了](https://docs.aws.amazon.com/AWSEC2/latest/UserGuide/terminating-instances.html)」を参照してください。

### Provisioned IOPS SSD ボリュームと 汎用 SSD ボリュームをベンチマークする
<a name="piops_benchmarking"></a>

#### Linux インスタンス
<a name="piops_benchmarking-linux"></a>

作成した RAID 0 アレイで **fio** を実行します。

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

```
$ sudo fio --directory=/mnt/p_iops_vol0 --ioengine=psync --name fio_test_file --direct=1 --rw=randwrite --bs=16k --size=1G --numjobs=16 --time_based --runtime=180 --group_reporting --norandommap
```

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

```
$ 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 パフォーマンスの確認](https://www.linux.com/training-tutorials/inspecting-disk-io-performance-fio/)」を参照してください。

#### Windows インスタンス
<a name="piops_benchmarking-windows"></a>

作成したボリュームで **DiskSpd** を実行します。

次のコマンドは、`C:` ドライブ上にある 20 GB のテストファイルを使用して、30 秒のランダム I/O テストを実行します。書き込み率 25%、読み取り率 75%、ブロックサイズは 8 K です。これは、それぞれ 4 つの未処理の I/O を持ち、1 GB の書き込みエントロピー値シードを持つ 8 つのワーカースレッドを使用します。テストの結果は、`DiskSpeedResults.txt` というテキストファイルに保存されます。これらのパラメータは、SQL Server OLTP ワークロードをシミュレートします。

```
diskspd -b8K -d30 -o4 -t8 -h -r -w25 -L -Z1G -c20G C:\iotest.dat > DiskSpeedResults.txt
```

結果の読み方については、チュートリアル[DiskSPd のディスク IO パフォーマンスの確認](https://sqlperformance.com/2015/08/io-subsystem/diskspd-test-storage)を参照してください。

### `st1` および `sc1` ボリュームのベンチマーク (Linux インスタンス）
<a name="hdd_benchmarking"></a>

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

**注記**  
これらのテストを実行する前に、[`st1` および `sc1` (Linux インスタンスインスタンスのみ) で高いスループットの読み取りが多いワークロードに先読みを増やす](ebs-performance.md#read_ahead)の説明に従って、バッファ付き I/O をインスタンスに設定してください。

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

```
$ 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 のシーケンシャル書き込み操作を実行します。

```
$ 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`) を作成します。

```
[global] 
clocksource=clock_gettime
randrepeat=0
runtime=180
 
[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
offset=100g
```

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

```
$ sudo fio fio_rw_mix.cfg
```

結果の読み方については、チュートリアル[fio のディスク I/O パフォーマンスの確認](https://www.linux.com/training-tutorials/inspecting-disk-io-performance-fio/)を参照してください。

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