Azure Database for PostgreSQL - フレキシブル サーバーの高いメモリ使用率

適用対象: Azure Database for PostgreSQL - フレキシブル サーバー

この記事では、Azure Database for PostgreSQL フレキシブル サーバーでメモリ使用率が高くなる可能性がある、よくあるシナリオと根本原因について説明します。

この記事では、次のことについて説明します。

  • 根本原因を軽減するための推奨事項を特定して取得するためのトラブルシューティング ガイドについて。
  • 高いメモリ使用率を特定するツール。
  • 高いメモリ使用率と是正措置の理由。

トラブルシューティング ガイド

Azure Database for PostgreSQL フレキシブル サーバー ポータルで利用できる機能のトラブルシューティング ガイドを使用すると、考えられる根本原因と、高いメモリ使用率の軽減シナリオに関する推奨事項を確認できます。 トラブルシューティング ガイドをセットアップして使用する方法については、トラブルシューティング ガイドのセットアップに従ってください。

高いメモリ使用率を特定するツール

高いメモリ使用率を特定するには、次のツールを検討してください。

Azure メトリック

Azure メトリックを使って、特定の日付と時間帯に使用されているメモリの割合を監視します。
プロアクティブな監視のために、メトリックに対してアラートを構成します。 ステップバイステップ ガイダンスについては、「Azure メトリック」を参照してください。

クエリ ストア

クエリ データ ストアでは、クエリおよびランタイム統計の履歴が自動的にキャプチャされて保持されるので、それらを確認できます。

クエリ ストアを使うと、待機イベント情報とクエリ実行時の統計情報を関連付けることができます。 クエリ ストアを使って、対象期間中にメモリを多く消費したクエリを特定します。

クエリ ストアの設定と使用の詳細については、クエリ ストアに関する記事を参照してください。

理由と是正措置

高いメモリ使用率を解決するには、次の理由と是正措置を検討してください。

サーバー パラメーター

次のサーバー パラメーターはメモリ消費に影響があるので、確認する必要があります。

Work_Mem

work_mem パラメーターには、それを超えると一時ディスク ファイルへの書き込みが行われる、内部並べ替え操作とハッシュ テーブルによって使用されたメモリの量を指定します これは、クエリ単位ではなく、並べ替えとハッシュの操作数に基づいて設定されます。

ワークロードに実行時間が短いクエリが多数あり、単純な結合と最小限の並べ替え操作を伴う場合、work_mem を低く抑えることをお勧めします。 アクティブなクエリが少数で、複雑な結合と並べ替えを伴う場合は、work_mem に高い値を設定することをお勧めします。

正しい work_mem の値を取得するのは困難です。 高いメモリ使用率やメモリ不足の問題に気づいた場合は、work_mem の値を減らすことを検討してください。

work_mem のより安全な設定は work_mem = Total RAM / Max_Connections / 16 です

work_mem の既定値は 4 MB です。 work_mem の値は、Azure portal のパラメーター ページを使って、サーバー レベルを含む複数のレベルで設定できます。

お勧めの戦略は、ピーク時のメモリ消費を監視することです。

この時間帯にディスクの並べ替えが発生し、使用されていないメモリがたくさんある場合は、使用可能なメモリと使用中のメモリのバランスが良くなるまで work_mem を徐々に増やします。同様に、メモリ使用量が多いようであれば work_mem を減らします。

Maintenance_Work_Mem

maintenance_work_mem は、バキューム、インデックスや外部キーの追加といったメンテナンス タスク用です。 このシナリオでのメモリの使用はセッション単位です。

たとえば、3 つの自動バキューム worker が動作しているシナリオを考えてみましょう。

maintenance_work_mem を 1 GB に設定した場合、全セッションの合計で 3 GB のメモリが使われます。

maintenance_work_mem の値が高く、バキューム、インデックス作成、外部キーの追加のために複数のセッションが実行されていると、メモリ使用率が高くなる可能性があります。 Azure Database for PostgreSQL フレキシブル サーバーの maintenance_work_mem サーバー パラメーターの最大許容値は 2 GB です。

共有バッファー

shared_buffers パラメーターによって、サーバーがデータのキャッシュのみに使うメモリの量が決まります。 共有バッファーの目的は、ディスク I/O を削減することです。

共有バッファーの適切な設定は、RAM の 25% です。 ほとんどの一般的なワークロードでは、RAM の 40% を超える値を設定することはお勧めしません。

最大接続数

Azure Database for PostgreSQL フレキシブル サーバー データベース上の新規およびアイドル状態のすべての接続で、最大 2 MB のメモリが消費されます。 接続を監視する 1 つの方法は、次のクエリを使うことです。

select count(*) from pg_stat_activity;

データベースへの接続数が多い場合、メモリ消費量も増えます。

データベースの接続数が多い状況では、PgBouncer のような接続プーラーを使うことを検討してください。

PgBouncer の詳細については、以下を参照してください。

接続プーラー

ベスト プラクティス

Azure Database for PostgreSQL フレキシブル サーバーでは、組み込みの接続プール ソリューションとして PgBouncer が提供されます。 詳細については、「PgBouncer」を参照してください。

Explain Analyze

クエリ ストアからメモリ消費量が多いクエリが特定されたら、EXPLAINEXPLAIN ANALYZE を使ってさらに調査し、調整します。

EXPLAIN コマンドの詳細については、「プランの説明」を参照してください。