Amazon AuroraのIO関連で見るべき指標

2023/11/02に公開
  • English Version is below

https://tommyasai.fly.dev/posts/key-metrics-to-watch-in-aurora-io

Amazon AuroraのIOPSについて

Amazon AuroraのRead/WriteIOPSVolumeRead/WriteIOPSの存在意義の違いがわからなくなったのでAuroraのIOPS関連を調べてみました。

TL;DR

  • コストに関連する指標がみたい: VolumeReadIOPS/VolumeWriteIOPS
  • Cacheを効率的に使えているかみたい: BufferCacheHitRatio
  • インスタンスごと/詳細IOPSがみたい: ReadIOPS/WriteIOPS
  • Byte単位でみたい: ReadThroughput/WriteThroughput

IOPSとは

IOPSは、データベースがどれだけ活発にストレージとデータをやり取りしているかを示す尺度です。1データベースページの読み取りごとに1 IOPSがカウントされます。
AuroraではMySQLなら最大16KB、Postgresなら最大8KBが1データベースページとなります。

Aurora supports a 16 KB page size for Amazon Aurora MySQL and an 8 KB page size for Amazon Aurora PostgreSQL. The page size is the smallest I/O operation that the database engine performs.

https://aws.amazon.com/blogs/database/planning-i-o-in-amazon-aurora/

コストに直結するVolumeRead/WriteIOPS

VolumeReadIOPS/VolumeWriteIOPSAuroraのI/Oにかかる費用と比例する指標です。
クラスター単位のみで、5分間隔が最小です。
([billed] VolumeRead/WriteIOPSと記載される場合もあり)

データ量に対して読み書きが多いサービスではAuroraではI/Oにかかるコストがかなり多くの割合を占める場合があるので、突然のコスト上昇が発生していないか、アラームをつけて監視する価値があります。

ちなみに、MySQL AuroraのIOはTokyoリージョンだと執筆時点では以下のような価格設定になっています。

$0.24 per 1 million requests

I/Oが多い場合は2023年5月にアナウンスされたAurora I/O-Optimizedを利用することでコスト削減できそうです。
https://aws.amazon.com/blogs/aws/new-amazon-aurora-i-o-optimized-cluster-configuration-with-up-to-40-cost-savings-for-i-o-intensive-applications/

無駄なI/Oを測るBufferCacheHitRatio

BufferCacheHitRatioはReadの際に各リクエストがDBインスタンスのRAMのキャッシュからデータを取得している割合を測る指標です。
この割合が低くなることはディスクI/O(厳密にはOutput)が増えることを意味するので、VolumeReadIOPS/ReadIOPSも上昇する可能性が高いです。この指標は非効率なI/Oを把握する上でとても有効です。
この指標が低い場合、RAMが不足して十分にデータがキャッシュできていない可能性があるので、インスタンスのスケールアップなどの検討が必要かもしれません。
https://docs.aws.amazon.com/AmazonRDS/latest/AuroraUserGuide/Aurora.BestPractices.html#Aurora.BestPractices.Performance.Sizing

インスタンス単位で見れるReadIOPS

ReadIOPS/WriteIOPSでは、インスタンス、クラスター、Role(Writer/Reader)などの様々な単位と、より細かい間隔(1分) でのIOPSを見れます。
Auroraは普通のRDSとは異なりI/Oに対してストレージが自動でスケールアップしていくので、IOPS単体の増加がパフォーマンスに影響することはないようです。
この指標が必要になる場面は、VolumeReadIOPS等の上昇アラートを受け取った上で、インスタンスごとのI/Oの詳細を確認する際などが考えられます。
また、Byte単位でみたい場合はReadThroughput/WriteThroughputを利用することができます。

さいごに

どの指標を見るべきかというのは指標ごとの詳しい理解が必要なので難しいと思います。
もし異なる意見があればぜひ教えてください!

Discussion