Amazon EBS ボリュームの詳細なパフォーマンス統計情報を ebsnvme スクリプトで取得してみた

Amazon EBS ボリュームの詳細なパフォーマンス統計情報を ebsnvme スクリプトで取得してみた

Clock Icon2024.11.13

Amazon EBS ボリュームの詳細なパフォーマンス統計情報が確認可能になりました。CloudWatch に新しいメトリクスが増えたのかと思いきや、そうではなく ebsnvme スクリプトを実行して取得するものでしたので紹介します。

https://aws.amazon.com/jp/about-aws/whats-new/2024/11/amazon-ebs-performance-statistics-ebs-volume-health/

なにができるようになったのか

  • EBS ボリュームの I/O レイテンシーなどのパフォーマンス情報を1秒間隔で取得
  • 取得可能な統計情報一覧
    • 読み取り/書き込み操作数
    • 読み取り/書き込みバイト数
    • 読み取り/書き込み時間(マイクロ秒単位)
    • EBS ボリューム性能超過時間(マイクロ秒単位)
    • EC2 インスタンスの EBS 性能超過時間(マイクロ秒単位)
    • キューの長さ
    • I/O レイテンシーのヒストグラム表示

統計情報の確認方法

  • EC2 上でスクリプト実行
  • nvme-cli ツールの利用(Amaozn Linux のみ)
  • Prometheus でのモニタリング

※ CloudWatch から確認できません

それでは、実際に取得できる情報を確認してみましょう。

統計情報を取ってみた

検証には、GP3 タイプの 30GB EBS ボリュームをマウントしました。IOPS は 3,000、スループットは 125 MB/s とし標準的な設定にしています。

検証用のボリュームのみ抜粋
$ df -h
Filesystem        Size  Used Avail Use% Mounted on
/dev/nvme1n1       30G  247M   30G   1% /data/gp3

準備

ebsnvme スクリプトを使用してパフォーマンス統計情報を確認します。

スクリプトのダウンロードと実行権限の付与します。

wget https://raw.githubusercontent.com/amazonlinux/amazon-ec2-utils/refs/heads/main/ebsnvme
sudo chmod +x ./ebsnvme

統計情報の取得(追加した 30GB EBS ボリューム対象にした例)

sudo ./ebsnvme stats /dev/nvme1n1

現在は以下の統計情報が取得できます。

  • 読み取り/書き込み操作数
  • 読み取り/書き込みバイト数
  • 読み取り/書き込み時間(マイクロ秒単位)
  • EBS ボリューム性能超過時間(マイクロ秒単位)
  • EC2 インスタンスの EBS 性能超過時間(マイクロ秒単位)
  • キューの長さ
  • I/O レイテンシーヒストグラム

参考: Amazon EBS detailed performance statistics - Amazon EBS

EC2 インスタンスのEBS 性能(最大 IOPS、スループット性能)を超過した時間を取得できるのは興味深いですね。EBS 自体の性能不足か、インスタンスのスペック不足か切り分けができそうです。

EBS ボリュームの最大 IOPS、スループット性能超過は CloudWatch メトリクスでも確認可能です。ただし、今回の統計情報ではマイクロ秒単位で超過時間が確認できるため、より詳細な分析が可能です。

https://dev.classmethod.jp/articles/amazon-cloudwatch-ebs-volumes-exceeding-performance/

起動直後の様子

起動した後にマウントしただけの状態です。多少の読み書きのアクセスは発生していました。さすがにパフォーマンス不足を示す項目(〜 Exceeded)は0が記録されており、なにも問題がありません。また、読み書き I/O レイテンシーがヒストグラムで表示されるのは目新しいです。

実行結果
Total Ops
  Read: 414
  Write: 329
Total Bytes
  Read: 7811584
  Write: 69750784
Total Time (us)
  Read: 219879
  Write: 1750067
EBS Volume Performance Exceeded (us)
  IOPS: 0
  Throughput: 0
EC2 Instance EBS Performance Exceeded (us)
  IOPS: 0
  Throughput: 0
Queue Length (point in time): 0

Read IO Latency Histogram (us)
Number of bins: 28
=================================
Lower       Upper        IO Count
=================================
[0        - 1       ] => 0
[1        - 2       ] => 0
[2        - 4       ] => 0
[4        - 8       ] => 0
[8        - 16      ] => 0
[16       - 32      ] => 0
[32       - 64      ] => 0
[64       - 128     ] => 0
[128      - 256     ] => 0
[256      - 512     ] => 228
[512      - 1024    ] => 184
[1024     - 2048    ] => 2
[2048     - 4096    ] => 0
[4096     - 8192    ] => 0
[8192     - 16384   ] => 0
[16384    - 32768   ] => 0
[32768    - 65536   ] => 0
[65536    - 131072  ] => 0
[131072   - 262144  ] => 0
[262144   - 524288  ] => 0
[524288   - 1048576 ] => 0
[1048576  - 2097152 ] => 0
[2097152  - 4194304 ] => 0
[4194304  - 8388608 ] => 0
[8388608  - 16777216] => 0
[16777216 - 33554432] => 0
[33554432 - 67108864] => 0
[67108864 - 18446744073709551615] => 0

Write IO Latency Histogram (us)
Number of bins: 28
=================================
Lower       Upper        IO Count
=================================
[0        - 1       ] => 0
[1        - 2       ] => 0
[2        - 4       ] => 0
[4        - 8       ] => 0
[8        - 16      ] => 0
[16       - 32      ] => 0
[32       - 64      ] => 0
[64       - 128     ] => 0
[128      - 256     ] => 3
[256      - 512     ] => 53
[512      - 1024    ] => 7
[1024     - 2048    ] => 16
[2048     - 4096    ] => 80
[4096     - 8192    ] => 75
[8192     - 16384   ] => 95
[16384    - 32768   ] => 0
[32768    - 65536   ] => 0
[65536    - 131072  ] => 0
[131072   - 262144  ] => 0
[262144   - 524288  ] => 0
[524288   - 1048576 ] => 0
[1048576  - 2097152 ] => 0
[2097152  - 4194304 ] => 0
[4194304  - 8388608 ] => 0
[8388608  - 16777216] => 0
[16777216 - 33554432] => 0
[33554432 - 67108864] => 0
[67108864 - 18446744073709551615] => 0

I/O 負荷をかけた直後の様子

fio を利用して EBS ボリュームに負荷をかけてみました。

EBS Volume Performance Exceededの項目から EBS ボリュームの IOPS、スループット共に性能限界に達していた時間があったことがわかります。書き込みのレイテンシーは高い値まで広く分布していることがパッと見わかります。

実行結果
Total Ops
  Read: 380456
  Write: 196957
Total Bytes
  Read: 1564475904
  Write: 9327874048
Total Time (us)
  Read: 191791149
  Write: 426600406
EBS Volume Performance Exceeded (us)
  IOPS: 65874112
  Throughput: 41883236
EC2 Instance EBS Performance Exceeded (us)
  IOPS: 0
  Throughput: 0
Queue Length (point in time): 0

Read IO Latency Histogram (us)
Number of bins: 28
=================================
Lower       Upper        IO Count
=================================
[0        - 1       ] => 0
[1        - 2       ] => 0
[2        - 4       ] => 0
[4        - 8       ] => 0
[8        - 16      ] => 0
[16       - 32      ] => 0
[32       - 64      ] => 0
[64       - 128     ] => 129
[128      - 256     ] => 1831
[256      - 512     ] => 354437
[512      - 1024    ] => 20663
[1024     - 2048    ] => 3164
[2048     - 4096    ] => 219
[4096     - 8192    ] => 13
[8192     - 16384   ] => 0
[16384    - 32768   ] => 0
[32768    - 65536   ] => 0
[65536    - 131072  ] => 0
[131072   - 262144  ] => 0
[262144   - 524288  ] => 0
[524288   - 1048576 ] => 0
[1048576  - 2097152 ] => 0
[2097152  - 4194304 ] => 0
[4194304  - 8388608 ] => 0
[8388608  - 16777216] => 0
[16777216 - 33554432] => 0
[33554432 - 67108864] => 0
[67108864 - 18446744073709551615] => 0

Write IO Latency Histogram (us)
Number of bins: 28
=================================
Lower       Upper        IO Count
=================================
[0        - 1       ] => 0
[1        - 2       ] => 0
[2        - 4       ] => 0
[4        - 8       ] => 0
[8        - 16      ] => 0
[16       - 32      ] => 0
[32       - 64      ] => 0
[64       - 128     ] => 0
[128      - 256     ] => 3001
[256      - 512     ] => 40077
[512      - 1024    ] => 115164
[1024     - 2048    ] => 21869
[2048     - 4096    ] => 7179
[4096     - 8192    ] => 2747
[8192     - 16384   ] => 3083
[16384    - 32768   ] => 1683
[32768    - 65536   ] => 1585
[65536    - 131072  ] => 541
[131072   - 262144  ] => 28
[262144   - 524288  ] => 0
[524288   - 1048576 ] => 0
[1048576  - 2097152 ] => 0
[2097152  - 4194304 ] => 0
[4194304  - 8388608 ] => 0
[8388608  - 16777216] => 0
[16777216 - 33554432] => 0
[33554432 - 67108864] => 0
[67108864 - 18446744073709551615] => 0

CloudWatch のメトリクスでは、EBS のボリューム性能限界に達していた期間が 1 分単位で確認可能です。

メトリクス___CloudWatch___ap-northeast-1-24

EC2 インスタンスを停止開始するとどうなるのか

ドキュメントにはボリュームがインスタンスにアタッチしている間、統計情報は保持されると書いてあります。

These statistics are presented as aggregated counters that are retained for the duration of the volume's attachment to the instance.
Amazon EBS detailed performance statistics - Amazon EBS

EBS をデタッチしてからアタッチし直したら過去の統計情報は削除される意味かなと思ったのですが違いました。EC2 インスタンスを停止して、開始しても過去の統計情報は失われます。

先ほど I/O 負荷をかけた後にインスタンスを停止開始し、起動直後の実行結果です。過去の統計情報はリセットされていました。

Total Ops
  Read: 97
  Write: 0
Total Bytes
  Read: 2142208
  Write: 0
Total Time (us)
  Read: 50869
  Write: 0
EBS Volume Performance Exceeded (us)
  IOPS: 0
  Throughput: 0
EC2 Instance EBS Performance Exceeded (us)
  IOPS: 0
  Throughput: 0
Queue Length (point in time): 0

Read IO Latency Histogram (us)
Number of bins: 28
=================================
Lower       Upper        IO Count
=================================
[0        - 1       ] => 0
[1        - 2       ] => 0
[2        - 4       ] => 0
[4        - 8       ] => 0
[8        - 16      ] => 0
[16       - 32      ] => 0
[32       - 64      ] => 0
[64       - 128     ] => 0
[128      - 256     ] => 0
[256      - 512     ] => 55
[512      - 1024    ] => 40
[1024     - 2048    ] => 2
[2048     - 4096    ] => 0
[4096     - 8192    ] => 0
[8192     - 16384   ] => 0
[16384    - 32768   ] => 0
[32768    - 65536   ] => 0
[65536    - 131072  ] => 0
[131072   - 262144  ] => 0
[262144   - 524288  ] => 0
[524288   - 1048576 ] => 0
[1048576  - 2097152 ] => 0
[2097152  - 4194304 ] => 0
[4194304  - 8388608 ] => 0
[8388608  - 16777216] => 0
[16777216 - 33554432] => 0
[33554432 - 67108864] => 0
[67108864 - 18446744073709551615] => 0

Write IO Latency Histogram (us)
Number of bins: 28
=================================
Lower       Upper        IO Count
=================================
[0        - 1       ] => 0
[1        - 2       ] => 0
[2        - 4       ] => 0
[4        - 8       ] => 0
[8        - 16      ] => 0
[16       - 32      ] => 0
[32       - 64      ] => 0
[64       - 128     ] => 0
[128      - 256     ] => 0
[256      - 512     ] => 0
[512      - 1024    ] => 0
[1024     - 2048    ] => 0
[2048     - 4096    ] => 0
[4096     - 8192    ] => 0
[8192     - 16384   ] => 0
[16384    - 32768   ] => 0
[32768    - 65536   ] => 0
[65536    - 131072  ] => 0
[131072   - 262144  ] => 0
[262144   - 524288  ] => 0
[524288   - 1048576 ] => 0
[1048576  - 2097152 ] => 0
[2097152  - 4194304 ] => 0
[4194304  - 8388608 ] => 0
[8388608  - 16777216] => 0
[16777216 - 33554432] => 0
[33554432 - 67108864] => 0
[67108864 - 18446744073709551615] => 0

今回の統計情報を使った長期的なパフォーマンス分析には外部のモニタリングツールに保存が必要です。そのために Prometheus がサポートされているのでしょう。

さいごに

EBS パフォーマンスの詳細モニタリングが可能ということで実際に試してみました。

個人的な見解では CloudWatch 対応ではなく、Prometheus 対応でリリースされているということは、EKS on EC2 のホストの詳細モニタリング用途で需要があってのアップデートなのかなと思いました。

粒度が 1 秒単位なので CloudWatch の場合だと、カスタムメトリクスで今回の統計情報が簡単に取れる設定などの情報が公開されると CloudWatch ユーザーにとっては嬉しいところですね。

Share this article

facebook logohatena logotwitter logo

© Classmethod, Inc. All rights reserved.