Aurora MySQL の FreeableMemory が減少したら何をすればいいのか

2024.06.13

アノテーション、テクニカルサポートチームの高橋です。

Aurora MySQL を本番環境にサービスイン後、 FreeableMemory が残り 10% になってもなお減少傾向が継続していると、「このまま 0% になりサービス影響が出てしまうのでは」ということが脳裏をよぎります。

Aurora MySQL はどのような動きをしていて、どのようなアクションが必要なのかについて記載します。
なお、 Aurora Serverless MySQL については除外しております。

Aurora MySQL はパフォーマンスを重視!

MySQL は多くのメモリを内部のバッファやキャッシュとして利用することでパフォーマンスを出す動作となるため、メモリは減少していきます。
また、データベースエンジンのメモリが不足してくると、 DB インスタンスは、バッファとキャッシュに使用されているメモリを解放し、メモリ使用量を確保しようとします。

Aurora MySQL は DB インスタンスリソースを最⼤限利⽤する設計となっているため、特にメモリ使用率は高くなります。
これは、 Aurora MySQL のデフォルトのパラメーターグループはパフォーマンスを重視したチューニング済みとなっているためです。
さらにお客様のワークロードの特性に応じてチューニングを行うことが望ましいですが、個々のパラメータ値を設計することが難しい状況である場合、適切なインスタンスタイプにスペックアップすることがアクションとなります。

パフォーマンスに影響が出ている場合はスペックアップが必要!

Aurora MySQL はメモリを多く使用するように設計されていますので、確認したいのはパフォーマンスに影響が出ているかどうかがわかるメトリクスです。
下記のメトリクスを確認し、パフォーマンスに影響が出てしまっている場合、メモリのスペックアップが必要です。
パフォーマンスに影響が出ていない場合でも、 FreeableMemory が常に少ない状態のままであれば、パフォーマンス影響の発生に備えてメモリのスペックアップを検討します。

  • スペックアップの判断基準となりうるメトリクス
    • クエリレイテンシが悪化したらパフォーマンス低下
      • SelectLatency
      • CommitLatency
      • DMLLatency
      • DDLLatency
    • キャッシュヒットレートが下がったらメモリ不足によるパフォーマンス低下
      • BufferCacheHitRatio (バッファキャッシュヒット率:テーブルデータとインデックスのキャッシュ)
      • ResultSetCacheHitRatio (クエリキャッシュヒット率:クエリの実行結果のキャッシュ)
    • Swap の使用が FreeableMemory 減少と同時進行ならメモリ不足
      • SwapUsage

Amazon Aurora の Amazon CloudWatch メトリクス

スペックアップ前に確認したいこと!

FreeableMemory の CloudWatch メトリクスを調べて、 DB インスタンスの全体的なメモリ使用パターンを把握します。

特定の SQL クエリが長時間実行し続けメモリを無制限に消費し続けているケースがあります。
SHOW FULL PROCESSLIST を実行してデータベースで実行されているすべてのスレッドを確認し、実行時間が長いクエリや大量の一時テーブルを必要とするクエリが存在した場合、それがメモリ減少の原因となっているかもしれません。
対象のクエリの停止やクエリチューニングを行います。

有効化している場合には Performance Insights を確認、また、その他の確認項目として下記を参考にします。

Amazon RDS for MySQL で確保できるメモリが少ない問題をトラブルシューティングする

コスト面からスペックアップが難しい場合!

予算の関係やリザーブドインスタンス購入済みなどの理由でどうしてもスペックアップをすることができない場合には、メモリの 75% を占めている Innodb_buffer_pool_size パラメータに着目します。
バッファープールは主にテーブルデータとインデックスをキャッシュする領域ですので、両者で削除できるものがないかを検討していきます。

削除できるものがない場合、 Innodb_buffer_pool_size パラメータのサイズ調整を検討することになりますが、パフォーマンスに影響が出やすい状況を作り出すことになる可能性があるため注意が必要です。

Amazon Auroraのデフォルトのパラメータグループをカスタムのパラメータグループに変更してみた

Aurora MySQL の Innodb_buffer_pool_size を変更する

バッファープール以外のパラメータ調整についても前述の下記が参考になります。

Amazon RDS for MySQL で確保できるメモリが少ない問題をトラブルシューティングする

参考資料

Aurora MySQL チューニングの基本的な概念
Aurora MySQL データベースのワークロードに関する問題のトラブルシューティング
Amazon Aurora のトラブルシューティング
Amazon Aurora での Performance Insights を使用したDB 負荷のモニタリング
Amazon Aurora (MySQL-compatible edition) Deep Dive
Amazon RDS for MySQL で確保できるメモリが少ない問題をトラブルシューティングする
十分なメモリがある場合でもスワップメモリを使用する Amazon RDS インスタンスのトラブルシューティング
MySQL :: MySQL 8.0 リファレンスマニュアル :: 8.12.3.1 MySQL のメモリーの使用方法

アノテーション株式会社について

アノテーション株式会社はクラスメソッドグループのオペレーション専門特化企業です。
サポート・運用・開発保守・情シス・バックオフィスの専門チームが、最新 IT テクノロジー、高い技術力、蓄積されたノウハウをフル活用し、お客様の課題解決を行っています。
当社は様々な職種でメンバーを募集しています。
「オペレーション・エクセレンス」と「らしく働く、らしく生きる」を共に実現するカルチャー・しくみ・働き方にご興味がある方は、アノテーション株式会社 採用サイトをぜひご覧ください。