Amazon EBS ボリュームの詳細なパフォーマンス統計情報を ebsnvme スクリプトで取得してみた
Amazon EBS ボリュームの詳細なパフォーマンス統計情報が確認可能になりました。CloudWatch に新しいメトリクスが増えたのかと思いきや、そうではなく ebsnvme スクリプトを実行して取得するものでしたので紹介します。
なにができるようになったのか
- 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 メトリクスでも確認可能です。ただし、今回の統計情報ではマイクロ秒単位で超過時間が確認できるため、より詳細な分析が可能です。
起動直後の様子
起動した後にマウントしただけの状態です。多少の読み書きのアクセスは発生していました。さすがにパフォーマンス不足を示す項目(〜 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 分単位で確認可能です。
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 ユーザーにとっては嬉しいところですね。