このトピックでは、PolarDB for PostgreSQL (Oracle 互換) のリソース マネージャー機能について説明します。
前提条件
PolarDB for PostgreSQL (Oracle 互換) クラスタが、PolarDB for PostgreSQL (Oracle 互換) 2.0 (リビジョン バージョン 2.0.14.5.1.0 以降) で実行されていること。
コンソールでリビジョン バージョンを表示するか、SHOW polardb_version; 文を実行して表示します。必要に応じて、リビジョン バージョンをアップグレードします。
背景情報
PolarDB for PostgreSQL (Oracle 互換) クラスタのメモリは、次の部分で構成されています。
共有メモリ
動的共有メモリ領域
プロセス グローバル領域
動的共有メモリ領域とプロセス グローバル領域は、動的に割り当てられます。これらの使用量は、クラスタのワークロードによって異なります。動的共有メモリ領域を過剰に使用すると、オペレーティング システムの制限に達する可能性があります。これにより、カーネル メモリ制限メカニズムがトリガーされ、クラスタ プロセスのクラッシュ、クラスタの再起動、さらにはクラスタの可用性停止が発生する可能性があります。
プロセス グローバル領域のメモリ コンテキストは、さらに次の部分に分割できます。
作業領域メモリ: ビジネス オペレーションに必要なメモリ。このメモリ部分は、ビジネスの通常のオペレーションに影響します。
キャッシュ メモリ: データベースは、内部メタデータの一部をプロセスに格納します。このメモリ部分は、データベースのパフォーマンスにのみ影響します。
前述の問題を解決するために、PolarDB for PostgreSQL (Oracle 互換) は、クラスタの実行中にリソースの使用量を定期的にチェックするリソース マネージャー機能を提供しています。プロセスがリソースしきい値を超えた場合、リソース制限が課され、クラスタの可用性停止のリスクが軽減されます。
リソース マネージャー機能は、メモリ、CPU、I/O などのリソースを制限できます。現在、制限できるのはメモリ リソースのみです。
仕組み
メモリ制限は cgroup に依存します。cgroup が使用できない場合、メモリ制限はブロックされます。 PolarDB for PostgreSQL (Oracle 互換) のバックグラウンド プロセスとして、リソース マネージャー機能は cgroup からメモリ使用量データを定期的に読み取り、そのデータをメモリ制限の基準として使用します。特定のプロセスのメモリ使用量が指定されたしきい値を超えると、リソース マネージャー機能はプロセスごとにメモリ使用量レコードを読み取り、メモリ サイズをソートし、メモリ使用量が指定されたしきい値を超えたプロセスに、プロセス割り込みシグナル (SIGTERM) または操作キャンセル シグナル (SIGINT) を順番に送信します。
メモリ制限方式
リソース マネージャー デーモンは、クラスタの起動時に作成され、プライマリ ノード、読み取り専用ノード、セカンダリ ノードで動作します。次のパラメーターを変更することで、リソース マネージャーの動作を変更できます。
リソース マネージャー機能は、リソース マネージャー パラメーターを使用して指定されたしきい値を超えるメモリを使用しているプロセスに SIGTERM シグナルを送信して、プロセスを終了し、メモリを解放します。次の表に、パラメーターを示します。
パラメーター | 説明 |
polar_resource_manager.enable_resource_manager | リソース マネージャー機能を有効にするかどうかを指定します。デフォルト値: on。有効な値:
|
polar_resource_manager.stat_interval | メモリ使用量をチェックする間隔。単位: ミリ秒。有効な値: 10 ~ 10000。デフォルト値: 500。 |
polar_resource_manager.total_mem_limit_rate | クラスタのメモリ使用率 (%)。指定されたパーセンテージに達すると、メモリ制限が課されます。デフォルト値: 95。 |
polar_resource_manager.total_mem_limit_remain_size | クラスタの予約メモリ サイズ。指定された値に達すると、メモリ制限が課されます。単位: KB。有効な値: 0 ~ MAX_KILOBYTES (最大整数値)。デフォルト値: 262144。 |
polar_resource_manager.mem_release_policy | メモリ リソースを制限するために使用されるポリシー。有効な値:
|
例
セッション プロセスが SIGTERM シグナルを受信すると、現在のプロセスが終了し、終了情報がログに書き込まれます。ログの例:
2022-11-28 14:07:56.929 UTC [18179] LOG: [polar_resource_manager] terminate process 13461 release memory 65434123 bytes
2022-11-28 14:08:17.143 UTC [35472] FATAL: terminating connection due to out of memory
2022-11-28 14:08:17.143 UTC [35472] BACKTRACE:
postgres: primary: postgres postgres [local] idle(ProcessInterrupts+0x34c) [0xae5fda]
postgres: primary: postgres postgres [local] idle(ProcessClientReadInterrupt+0x3a) [0xae1ad6]
postgres: primary: postgres postgres [local] idle(secure_read+0x209) [0x8c9070]
postgres: primary: postgres postgres [local] idle() [0x8d4565]
postgres: primary: postgres postgres [local] idle(pq_getbyte+0x30) [0x8d4613]
postgres: primary: postgres postgres [local] idle() [0xae1861]
postgres: primary: postgres postgres [local] idle() [0xae1a83]
postgres: primary: postgres postgres [local] idle(PostgresMain+0x8df) [0xae7949]
postgres: primary: postgres postgres [local] idle() [0x9f4c4c]
postgres: primary: postgres postgres [local] idle() [0x9f440c]
postgres: primary: postgres postgres [local] idle() [0x9ef963]
postgres: primary: postgres postgres [local] idle(PostmasterMain+0x1321) [0x9ef18a]
postgres: primary: postgres postgres [local] idle() [0x8dc1f6]
/lib64/libc.so.6(__libc_start_main+0xf5) [0x7f888afff445]
postgres: primary: postgres postgres [local] idle() [0x49d209]