このトピックでは、 PolarDB for PostgreSQL (Compatible with Oracle) のリソースマネージャー機能について説明します。
前提条件
PolarDB for PostgreSQL (Compatible with Oracle) クラスターは、次のエンジンを実行します。
Oracle 2.0 (バージョン2.0.14.1.0以降)
次のステートメントを実行して、PolarDB for PostgreSQL (Compatible with Oracle) クラスターのマイナーバージョンを表示できます。
SHOW polar_version;
背景情報
PolarDB for PostgreSQL (Compatible with Oracle) クラスターのメモリには、次の部分が含まれています。
共有メモリ
ダイナミック共有メモリ領域
プロセスグローバルエリア
動的共有メモリ領域およびプロセス・グローバル領域は、動的に割り当てられる。 それらの使用量は、クラスターのワークロードによって異なります。 動的共有メモリ領域を過度に使用すると、オペレーティングシステムの制限に達する可能性があります。 これにより、カーネルメモリ制限メカニズム、クラスタープロセスのクラッシュ、クラスターの再起動、およびイベントクラスターが利用できなくなります。
プロセスグローバル領域のメモリコンテキストは、さらに次の部分に分けられます。
ワークエリアメモリ: 業務に必要なメモリ。 メモリのこの部分は、ビジネスの通常の動作に影響します。
キャッシュメモリ: データベースは、プロセス内の内部メタデータの一部を格納します。 メモリのこの部分は、データベースのパフォーマンスにのみ影響します。
上記の問題を解決するために、 PolarDB for PostgreSQL (Compatible with Oracle) には、クラスターの実行中にリソースの使用状況を定期的にチェックするリソースマネージャー機能があります。 プロセスがリソースしきい値を超えると、リソース制限が課され、クラスターが利用できなくなるリスクが軽減されます。
リソースマネージャー機能は、メモリ、CPU、およびI/Oのリソースを制限できます。 現在、メモリリソースのみを制限できます。
仕組み
メモリ制限はcgroupsに依存します。 使用可能なcgroupがない場合、メモリ制限はブロックされます。 PolarDB for PostgreSQL (Compatible with Oracle) のバックグラウンドプロセスとして、リソースマネージャー機能は定期的にcgroupsからメモリ使用量データを読み取り、そのデータをメモリ制限の基準として使用します。 特定のプロセスのメモリ使用量が指定したしきい値を超えると, プロセスごとにメモリ使用量レコードを読み込み, メモリサイズを並べ替え, メモリ使用量が指定したしきい値を超えるプロセスに対して順番に割り込み処理信号 (SIGTERM) または操作解除信号 (SIGINT) を送信します。
メモリ制限方法
リソースマネージャーデーモンは、クラスターの起動時に作成され、プライマリ、読み取り専用、およびセカンダリノードで動作します。 次のパラメーターを変更することで、リソースマネージャーの動作を変更できます。
リソースマネージャー機能は、リソースマネージャーパラメーターを使用して指定されたしきい値を超えるメモリを使用しているプロセスにSIGTERM信号を送信し、プロセスを終了してメモリを解放します。 下表に、各パラメーターを説明します。
パラメーター | 説明 |
enable_resource_manager | リソースマネージャー機能を有効にするかどうかを指定します。 デフォルト値 : on。 有効な値:
|
stat_interval | メモリ使用量をチェックする間隔。 単位:ミリ秒。 有効な値: 10 ~ 10000 デフォルト値: 500。 |
total_mem_limit_rate | クラスターのメモリ使用率 (パーセンテージ) 。 指定されたパーセンテージに達すると、メモリ制限が課されます。 デフォルト値: 95。 |
total_mem_limit_remain_size | クラスターの予約済みメモリサイズ。 指定された値に達すると、メモリ制限が課される。 (単位:KB) 有効値: MAX_KILOBYTES (最大整数値) に131072ます。 デフォルト値: 524288 |
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]