RDSまたはAuroraのMySQLのメモリ使用率が高い場合の原因と対処法について書いていきます。
結論としては、RDSとAuroraで同じで、
メモリ使用率が高い=効率良く動いている
から安心で良いです。
でも、監視は必要です。
ちなみにメモリ使用率をAWSマネージメントコンソール画面から確認できないので、CloudWatchのメトリクス「FreeableMemory(メモリ空き容量)」から確認することになります。
まず、RDSやAuroraのメモリ使用率が高くなる理由について書いていきます。
RDS/Auroraのメモリ使用率が高くなる理由
AWS公式に以下の記載があります。
Amazon RDS for MySQL では、インスタンスで利用可能なメモリの 80% から 90% がデフォルトのパラメータで割り当てられます。この割り当てはパフォーマンスには最適ですが、より多くのメモリを使用するパラメータを設定する場合は、他のパラメータを変更してより少ないメモリを使用するように補正してください。
パフォーマンスの最適化のために、メモリの 80% から 90% が利用されるように設定されているようです。
メモリ使用率が90%以下の場合は、効率良く動いている状態なので、気にしなくて大丈夫ということです。
ちなみにAuroraのパラメータは効率良く動くように設定されているので、設定変更しないことがベストプラクティスです。
次にメモリの用途について書いていきます!
メモリの主な用途はバッファプールです。バッファプールの解説は以下の通りです。
バッファプールは、
InnoDB
がアクセス時にテーブルおよびインデックスデータをキャッシュするメインメモリー内の領域です。 バッファープールを使用すると、頻繁に使用されるデータをメモリーから直接処理できるため、処理速度が向上します。 専用サーバーでは、多くの場合、最大 80% の物理メモリーがバッファプールに割り当てられます。
バッファプールはLRUアルゴリズムというもので、管理されているようです。
バッファプールは、最低使用頻度 (LRU) アルゴリズムのバリエーションを使用してリストとして管理されます。 バッファプールに新しいページを追加するための領域が必要な場合は、最も最近使用されていないページが削除され、新しいページがリストの中央に追加されます。 このミッドポイント挿入戦略はリストを 2 つのサブリストとして扱います。
「専用サーバーでは、多くの場合、最大 80% の物理メモリーがバッファプールに割り当てられます。 」とMySQLの公式に記載されていることから、RDSやAuroraに限らず、MySQLでは、メモリ使用率が高くても問題ないということになります。
また、「バッファプールに新しいページを追加するための領域が必要な場合は、最も最近使用されていないページが削除され、新しいページがリストの中央に追加されます。」と記載されています。
よって、MySQLでのメモリは以下のように使用され、バッファプールに割り当てられている値まで増加し、その後は増えないという挙動が基本となります。(減ることもない)
- メモリは、バッファプールに割り当てられている値まで増加する
- その後は、新しい情報をメモリに書き込む際は、古い情報を削除してから書き込みがされる
- 古い情報を削除して新しい情報を書き込むという再利用がされるため、バッファプールに割り当てられている値以上にメモリを消費することはない
- その後は、新しい情報をメモリに書き込む際は、古い情報を削除してから書き込みがされる
<AWS公式ページからわかること>
メモリの 80% から 90% がデフォルトのパラメータで利用されるように設定されている
→メモリ使用率が90%以下の場合は、効率良く動いている状態なので、気にしなくて大丈夫
→メモリの主な用途はバッファプール
<MySQL公式ページからわかること>
AWSに限らず一般的に、80%程度のメモリーがバッファプールに割り当てられる
→メモリ使用量は、バッファプールに割り当てられている値まで増加し、その後は増えない(再利用される)という挙動が基本となる
次に監視について書いていきます。
メモリ使用率の監視は必要
AWS公式より、監視は必要です。95%を超えたらアラートをあげるようにしておくのが、ベストプラクティスのようです。
- FreeableMemory メトリクスに CloudWatch アラームを設定して、利用可能なメモリが 95% に到達したときに通知を受け取るようにします。インスタンスメモリを 5% 以上空けておくのがベストプラクティスです。
Amazon RDS for MySQL で確保できるメモリが少ない問題をトラブルシューティングするAmazon Relational Database Service (Amazon RDS) または MySQL インスタンスを実行しています。使用可能なメモリが少ない、データベースのメモリが不足している、またはメモリが少ないためにアプリケーションでレイテンシー問題が発生しています。メモリ使用率の原因を特定するにはど...
監視アラートが上がったらどうするか
基本的に以下のいずれかの対応となります。
クエリーチューニングの実施
DBインスタンスのスペックをあげる
時間的余裕がない場合は、「DBインスタンスのスペックをあげる」の一択ですね。
ちなみにメモリ使用率を下げるためにパラメータ(max_connectionsなど)を変更することはお勧めしません。パラメータはパフォーマンス良く動くよう設定されているためです。
まとめ
RDS/Aurora MySQLのメモリ使用率について、みてきました。
正しく理解し対応していきましょ!