giip
SES案件登録
インフラIOPSストレージ性能EBSEC2

AWS EBSのIOPSと物理ディスクのIOPSは何が違うのか

公開日 2026-08-13 · 更新日 2026-08-13 · 最終検証日 2026-08-13

結論

EBSのIOPSは物理デバイスの性能値ではなく、サービス側で決められた上限値です。EBSはネットワーク越しに接続されるブロックストレージで、ボリューム種別とプロビジョニング量に応じたIOPSとスループット(MiB/s)の上限が適用されます。さらにインスタンス側にもEBS帯域の上限が別に存在し、大きなボリュームを小さなインスタンスに接続すればインスタンス側で頭打ちになります。そのため物理ディスクのベンチマーク値とEBSの数値を直接比較することはできません。

この文書の適用条件

対象製品Amazon EBS(gp2 / gp3 / io1 / io2 / st1 / sc1)、Amazon EC2 インスタンスストア
確認バージョンAWS CLI v2 / Amazon EC2・Amazon CloudWatch の公開API、fio 3.x(2026-08-13 時点の仕様に基づく)
適用環境AWS(EC2、EBS)、比較対象としてオンプレミスの物理ディスク
必要権限参照は `ec2:DescribeVolumes` と `cloudwatch:GetMetricStatistics`。fio実行にはOS上の対象デバイス/ファイルへのアクセス権
実行影響参照コマンドは影響なし。fioはI/O負荷を発生させ、同居する処理の性能に影響する
再起動不要
最終検証日2026-08-13

そのまま実行できるコマンド

ボリュームの種別とプロビジョニング値を確認する参照のみ
対象
Amazon EBS(AWS CLI v2)
権限
ec2:DescribeVolumes
変更作業
なし(参照のみ)
Production実行
可能
# 対象: Amazon EBS(AWS CLI v2)
# 権限: ec2:DescribeVolumes
# 変更作業: なし(参照のみ)
# Production 実行: 可能
aws ec2 describe-volumes \
  --volume-ids vol-0123456789abcdef0 \
  --query "Volumes[].{Id:VolumeId,Type:VolumeType,SizeGiB:Size,Iops:Iops,\
ThroughputMiBs:Throughput,MultiAttach:MultiAttachEnabled,State:State,\
AttachedTo:Attachments[0].InstanceId,Device:Attachments[0].Device}" \
  --output table

`Iops` と `Throughput` はプロビジョニング値です。`Throughput` はgp3で設定できるスループット値で、種別によっては返りません。ここに出る値は「ボリューム側の上限」であり、接続先インスタンス側のEBS帯域上限は別に確認する必要があります。

ボリュームの実測I/OとキューをCloudWatchで確認する参照のみ
対象
Amazon CloudWatch(名前空間 AWS/EBS)
権限
cloudwatch:GetMetricStatistics
変更作業
なし(参照のみ)
Production実行
可能
# 対象: Amazon CloudWatch(名前空間 AWS/EBS)
# 権限: cloudwatch:GetMetricStatistics
# 変更作業: なし(参照のみ)
# Production 実行: 可能
for M in VolumeReadOps VolumeWriteOps VolumeQueueLength BurstBalance
do
  echo "===== $M ====="
  aws cloudwatch get-metric-statistics \
    --namespace AWS/EBS \
    --metric-name "$M" \
    --dimensions Name=VolumeId,Value=vol-0123456789abcdef0 \
    --start-time 2026-08-12T00:00:00Z \
    --end-time   2026-08-13T00:00:00Z \
    --period 300 \
    --statistics Average Maximum Sum \
    --output text
done

`VolumeReadOps` と `VolumeWriteOps` は期間内の**I/O回数の合計**です。IOPS(1秒あたり)に直すには Sum を期間の秒数で割ります(`--period 300` なら300で割る)。`BurstBalance` はバーストクレジットを使う種別(gp2・st1・sc1)でのみ意味を持ち、値が下がり続けるならクレジットを消費している状態です。

Linux側でデバイス構成を確認する参照のみ
対象
Amazon Linux / Ubuntu など(EC2上のOS)
権限
一般ユーザーで実行可能(nvme コマンドは root 権限が必要な場合がある)
変更作業
なし(参照のみ)
Production実行
可能
# 対象: EC2 上の Linux
# 権限: 一般ユーザー(nvme list は root 権限が必要な場合がある)
# 変更作業: なし(参照のみ)
# Production 実行: 可能
lsblk -o NAME,SIZE,TYPE,MOUNTPOINT,MODEL
sudo nvme list
cat /sys/block/nvme1n1/queue/nr_requests
iostat -x 1 5

Nitro世代のインスタンスではEBSボリュームもNVMeデバイスとして見えます。デバイス名がNVMeであることは「物理的に直結している」ことを意味しません。`nvme list` のモデル名で、EBSボリュームかインスタンスストアかを区別できます。

fioでランダムリードの実測値を取る(I/O負荷が発生する)
対象
Linux + fio 3.x
権限
対象ファイル/デバイスへの読み取り権限(デバイス直接指定時は root)
変更作業
なし(読み取りのみ。ただしI/O負荷が発生する)
Production実行
非推奨。本番と同居するストレージでは実行しないこと
# 対象: Linux + fio 3.x
# 権限: 対象ファイルへの読み取り権限(デバイス直接指定なら root)
# 変更作業: なし(読み取りのみ)だが、実行中は他の処理の I/O 性能に影響する
# Production 実行: 非推奨。検証環境、または本番と共有しないボリュームで実行すること
fio --name=randread \
    --filename=/mnt/testdir/fio_testfile \
    --size=64G \
    --rw=randread \
    --bs=4k \
    --ioengine=libaio \
    --direct=1 \
    --iodepth=32 \
    --numjobs=4 \
    --runtime=300 \
    --time_based \
    --group_reporting

`--direct=1` はOSのページキャッシュを迂回する指定で、これが無いとキャッシュヒットを測ることになり、ストレージの性能ではなくメモリの性能が出ます。`--size` はRAM容量より十分大きく取ります(ワーキングセットがメモリに収まると、やはりキャッシュを測ります)。この2つを外した測定値は、物理ディスクでもEBSでも意味を持ちません。

結果の読み方

意味確認するポイント
VolumeTypeボリューム種別(gp2 / gp3 / io1 / io2 / st1 / sc1)種別ごとに上限の決まり方が違う。gp2は容量連動+バースト、gp3は基線+追加設定、io1/io2はプロビジョニング
Sizeボリュームサイズ(GiB)gp2では容量が基線性能に直結する。gp3では容量と性能設定が独立する
IopsプロビジョニングされたIOPS上限「出せる値」ではなく「これ以上は出ない値」。実測がこれに張り付いていれば上限律速
Throughputプロビジョニングされたスループット(MiB/s)IOPSに余裕があってもここで頭打ちになることがある。大きいI/Oサイズのワークロードで先に当たる
Attachments[0].InstanceId接続先インスタンスそのインスタンスクラスのEBS帯域上限を現行のAWSドキュメントで確認する。ボリューム上限より低ければインスタンス側が律速
VolumeReadOps / VolumeWriteOps期間内のI/O回数の合計Sumを期間秒数で割ってIOPSに換算し、プロビジョニング値と比較する
VolumeQueueLength未完了I/O要求の平均数恒常的に大きいならストレージが要求を捌ききれていない。値が小さいまま遅いなら律速はストレージ以外
BurstBalanceバーストクレジット残量(%)gp2・st1・sc1のみ。下がり続けるならクレジット枯渇後に基線性能まで落ちる

こういう状況で使います

  • オンプレミスのSSDで出ていた性能が、EBSに移したら出ない
  • ベンチマークツールの数値がEBSのプロビジョニング値と大きく食い違う
  • ボリュームのIOPSを増やしたのにスループットが上がらない
  • 大きなボリュームを接続したのに、期待した性能が出ない
  • gp2ボリュームで、しばらく速いがある時点から急に遅くなる
  • CloudWatchのVolumeReadOpsの値とIOPSの単位が合わない

考えられる原因(可能性の高い順)

  1. 01

    EBSはネットワーク接続型のブロックストレージである

    EBSはインスタンスに物理的に取り付けられたデバイスではなく、ネットワーク越しに接続されたストレージです。したがってIOPSは「デバイスがどれだけ速いか」ではなく「サービスがどこまで通すか」で決まります。ネットワーク経由であるため、レイテンシの性質も物理ディスクとは異なります。

  2. 02

    I/Oサイズによって1回のI/Oが消費するIOPS数が変わる

    EBSはI/Oを固定サイズの単位で数えます。その単位より大きいI/Oは複数IOPSぶんとして計上され、逆に連続したI/Oはまとめて計上されることがあります。つまり「1操作=1 IOPS」ではありません。単位サイズはボリューム種別(SSD系とHDD系)で異なるため、現行のEBSボリューム種別のドキュメントで対象種別の値を確認してください。この文書では具体的なバイト数を示しません。

  3. 03

    IOPSとスループットは別々の上限である

    EBSにはIOPS(回数/秒)とスループット(MiB/秒)の2つの上限があります。小さいI/Oを大量に出すワークロードはIOPS上限に、大きいI/Oを出すワークロードはスループット上限に先に当たります。どちらが律速かは、I/OサイズとIOPSの積がスループット上限に達しているかで判断します。

  4. 04

    インスタンス側にもEBS帯域の上限がある

    ボリューム側の上限とは別に、EC2インスタンスクラスごとにEBSへの帯域上限(EBS最適化帯域)が定められています。高性能なボリュームを小さいインスタンスに接続すると、インスタンス側の上限で頭打ちになります。上限値はインスタンスクラスごとに異なるため、現行のAWSドキュメントで対象クラスを確認してください。

  5. 05

    gp2はバーストクレジットに依存する

    gp2は容量に応じた基線性能を持ち、それを超えるI/OはI/Oクレジットで賄います。クレジットが枯渇すると基線性能まで落ちます。「最初は速いがある時点から遅くなる」という現象の典型的な原因です。gp3はクレジット方式ではなく、基線に対して追加のIOPSとスループットを設定するモデルです。

  6. 06

    インスタンスストア(NVMe)と混同している

    インスタンスストアはホストに物理的に取り付けられたNVMeデバイスで、EBSのようなネットワーク経由の上限は適用されません。ただしインスタンスの停止・終了でデータが消える一時ストレージです。ベンチマークでインスタンスストアの値を測り、それをEBSの値と比較すると必ず食い違います。

  7. 07

    ベンチマークがキャッシュを測っている

    `direct=1` を指定していない、あるいはテストデータのサイズがRAM容量より小さい場合、測定しているのはOSのページキャッシュです。この条件で出た数値は、物理ディスクでもEBSでもストレージの性能を表しません。

確認手順

  1. 1

    ボリューム側の上限を確認する

    参照のみ

    `aws ec2 describe-volumes` で種別・容量・プロビジョニングIOPS・スループット設定を確認します。

  2. 2

    インスタンス側の上限を確認する

    参照のみ

    接続先インスタンスクラスのEBS帯域上限を、現行のAWSドキュメントで確認します。ボリューム側より低ければインスタンスが律速です。

  3. 3

    実測をCloudWatchで取る

    参照のみ

    VolumeReadOps・VolumeWriteOpsをSumで取り期間秒数で割ってIOPSに換算します。VolumeQueueLengthとBurstBalanceも併せて見ます。

  4. 4

    I/Oサイズを確認する

    参照のみ

    スループット(バイト/秒)をIOPS(回/秒)で割り、平均I/Oサイズを求めます。これがIOPS律速かスループット律速かの判断材料になります。

  5. 5

    OS側の見え方を確認する

    参照のみ

    `iostat -x` で `r/s`・`w/s`・`aqu-sz`・`await`・`%util` を確認し、CloudWatchの値と突き合わせます。

  6. 6

    必要なら検証環境でfioを実行する

    `--direct=1` とRAMより大きいワーキングセットを必ず指定します。本番と同居するボリュームでは実行しません。

対応方法

すぐに実施できる低リスクの対応

  • どの上限に当たっているかを1つに特定する

    参照のみ

    ボリュームのIOPS上限、ボリュームのスループット上限、インスタンスのEBS帯域上限、バーストクレジット枯渇の4つのどれかを特定します。ここが決まらないと設定変更は当て推量になります。

  • ベンチマーク条件を揃えてから比較する

    参照のみ

    比較対象の測定に `direct=1` が指定されているか、ワーキングセットがRAMより大きいか、I/Oサイズとキュー深度が同じかを確認します。条件が違えば数値は比較できません。

事前検討が必要な変更

  • ボリューム種別・プロビジョニング値を見直す

    IOPS律速ならIOPSを、スループット律速ならスループット設定を見直します。gp2でクレジット枯渇が起きているならgp3への切り替えを検討します。

  • インスタンスクラスを見直す

    インスタンス側のEBS帯域が律速なら、ボリュームをいくら強化しても改善しません。EBS帯域の大きいクラスへの変更を検討します。

  • アプリケーション側のI/Oサイズとキュー深度を見直す

    小さいI/Oを大量に出している場合、まとめて出すことでIOPS消費を減らせることがあります。データベースであればページサイズや先読み設定が該当します。

再起動・サービス影響を伴う変更

  • インスタンスストアを使う構成に変更する

    インスタンスストアは停止・終了でデータが消えます。永続化が必要なデータには使えません。キャッシュや一時領域に限定し、消失前提の運用設計とセットで導入してください。

  • ボリューム種別を変更する

    種別変更(gp2→gp3 など)は変更処理中に性能が一時的に変動する場合があります。適用条件と所要時間は現行のAWSドキュメントで確認し、業務影響の小さい時間帯に実施してください。

!注意事項

  • この文書はEBSの具体的なIOPS値・スループット値・レイテンシ値を示しません。上限値は種別・容量・インスタンスクラスによって決まり、改定もされます。必ず現行のAWSドキュメントで対象構成の値を確認してください。
  • fioは実際にI/O負荷を発生させます。本番と同じボリュームやEBS帯域を共有するインスタンスで実行すると、業務処理の性能に影響します。検証環境で実施してください。
  • `--direct=1` を付けない測定、およびRAM容量より小さいワーキングセットでの測定は、ストレージではなくページキャッシュを測っています。その数値でEBSと物理ディスクを比較することはできません。
  • gp2でバーストクレジットが枯渇している状態は、短時間のベンチマークでは検出できません。BurstBalanceの推移を長期間で確認してください。
  • Nitro世代ではEBSボリュームもNVMeデバイスとして見えます。デバイス名から「物理直結だ」と判断しないでください。
  • インスタンスストアはインスタンスの停止・終了でデータが失われます。性能値だけを理由に永続データの置き場に選ばないでください。

バージョン・環境による違い

gp2容量に連動する基線性能とI/Oクレジット(バースト)方式です。BurstBalanceメトリクスが意味を持つのはこの種別とst1・sc1です。
gp3基線に対してIOPSとスループットを容量とは独立に設定できるモデルです。クレジット枯渇による段差は発生しません。設定可能な範囲は現行ドキュメントを参照してください。
io1 / io2IOPSをプロビジョニングする種別です。io2 Block Express など上位構成では上限と耐久性の条件が異なります。対象リージョンとインスタンス世代の対応状況を確認してください。
Nitro世代インスタンスEBSがNVMeブロックデバイスとして提示されます。デバイス名の対応関係が旧世代(/dev/xvd*)と異なるため、マウント設定はUUIDやラベルで行うことが推奨されます。

これで解決しない場合に確認すること

  • ファイルシステムとマウントオプションを確認する

    アライメント、ジャーナル設定、`noatime` の有無などがI/O回数に影響します。ブロックデバイスの上限に当たっていないのに遅い場合の確認先です。

  • アプリケーション側の同期I/O設定を確認する

    データベースのログ書き込みは同期I/Oであり、スループットではなくレイテンシが効きます。IOPSに余裕があっても遅い場合はここを見ます。

  • RAID構成やLVMの層で待ちが発生していないか確認する

    複数ボリュームをストライプしている場合、1本の遅延が全体を引きずります。デバイス単位で `iostat -x` を確認します。

  • インスタンスのネットワーク帯域と競合していないか確認する

    世代・クラスによってはEBS帯域とネットワーク帯域の扱いが異なります。大量のネットワーク通信と同時にI/Oが落ちる場合は要確認です。

  • 比較対象の測定条件を入手する

    「物理ディスクではこの値だった」という数値の測定条件(I/Oサイズ、キュー深度、direct指定、ワーキングセット)が不明なら、比較そのものが成立しません。

この文書の根拠と限界

製品の公式ドキュメントに基づく説明

Amazon EBS のボリューム種別・プロビジョニングモデル・EBS最適化インスタンス帯域の公開仕様、Amazon CloudWatch の AWS/EBS 名前空間メトリクス(VolumeReadOps、VolumeWriteOps、VolumeQueueLength、BurstBalance)、および fio の公開オプション仕様に基づきます。具体的な上限値・実測値は改定されるため本文には含めていません。対象構成の値は現行のAWSドキュメントで確認してください。

よくある質問

EBSのIOPSは物理ディスクのIOPSと同じ意味ですか?

違います。物理ディスクのIOPSはデバイスの性能特性ですが、EBSのIOPSはサービス側で適用される上限値です。EBSはネットワーク接続型のブロックストレージであり、プロビジョニングした値以上は出ません。したがって両者の数値を直接比較することはできません。

ボリュームのIOPSを増やせば必ず速くなりますか?

なりません。スループット(MiB/s)の上限に当たっている場合、IOPSを増やしても改善しません。またインスタンスクラスごとのEBS帯域上限のほうが低ければ、ボリュームを強化してもインスタンス側で頭打ちになります。まずどの上限に当たっているかを特定してください。

HDDのRAID 0構成で非常に高いIOPSが表示されるのはなぜですか?

ほぼ確実に、デバイスの性能ではないものを測っています。典型的にはOSのページキャッシュ、RAIDコントローラのライトバックキャッシュ、あるいはシーケンシャルアクセスパターンです。回転メディアの真のランダムI/Oはシークと回転待ちに支配されるため、キャッシュを迂回した測定(`direct=1` かつRAMより大きいワーキングセット、`rw=randread`)では同じ数値は出ません。測定条件を確認してください。

CloudWatchのVolumeReadOpsはIOPSですか?

そのままではIOPSではありません。VolumeReadOps/VolumeWriteOpsは期間内のI/O回数の合計です。IOPS(1秒あたり)に換算するには、Sum統計を期間の秒数で割ってください。`--period 300` なら300で割ります。

インスタンスストアを使えばEBSの上限を回避できますか?

ストレージの上限という意味では回避できますが、インスタンスストアは停止・終了でデータが消える一時ストレージです。永続化が必要なデータには使えません。キャッシュや一時領域に用途を限定し、消失を前提とした運用設計と併せて検討してください。

Productionで実行できますか?

`describe-volumes`、CloudWatchの取得、`lsblk`/`iostat` は参照のみで本番環境でも実行できます。fioは実際にI/O負荷をかけるため、本番と同じボリュームやEBS帯域を共有する環境では実行しないでください。

この文書がカバーする質問

  • HDD RAID 0で高いIOPS値が表示される理由
  • EBSのIOPSを上げても速くならないのはなぜか
  • オンプレのSSDと同じ性能がEBSで出ない
  • CloudWatchのVolumeReadOpsをIOPSに換算する方法

リスク表示の意味

  • 参照のみデータと設定を変更しません。
  • 影響は限定的ですが、権限と負荷の確認が必要です。
  • 性能・ロック・コストに影響する可能性があります。
  • 障害・データ損失・復旧作業が発生する可能性があります。
  • 専門家レビュー必須本番適用前に別途レビューが必須です。

GIIPの対応範囲

EBSの上限がどこに効いているかは、条件を揃えれば1回の調査で分かります。運用で問題になるのはそこではなく、データ量とアクセスパターンが変化して、ある日から上限に当たり始める瞬間に気づけるかどうかです。GIIPではAWSとAzure上の複数データベースおよび約30のWebサービスについて、VolumeQueueLengthやBurstBalanceといったストレージ側の先行指標をAIエージェントが継続的に追い、上限に近づく傾向が出た段階で人間の専門家が構成変更の要否を判断しています。障害になってから測るのではなく、上限に触れる前に検知することを目的にしています。

執筆・技術検証

GIIP プロダクション運用チーム

大規模Webサービス、SQL Server、Oracle、AWS、Azureの設計・移行・運用に約30年従事。x12largeクラスのAWS RDS for SQL Server環境12セット、約12万テーブルのOracle環境、約3TBのTiDBからAurora MySQLへの移行を経験。現在も複数のクラウドデータベースと約30のWebサービスを、AIエージェントと人間の専門家が継続的に監視・運用しています。

関連するナレッジ

関連サービス

EBS性能のボトルネック調査を依頼する

同じ確認を複数の環境で継続する必要がある場合は、運用体制ごと相談できます。

EBS性能のボトルネック調査を依頼する

ナレッジベース一覧へ