このトピックでは、グローバルメタデータキャッシュ (Global Cache) の背景情報と使用方法について説明します。
適用範囲
この機能は、マイナーエンジンバージョンが 2.0.14.8.11.0 以降の PostgreSQL 14 を実行する PolarDB for PostgreSQL でサポートされます。
マイナーエンジンバージョン番号は、コンソールで表示するか、SHOW polardb_version; 文を実行して確認できます。マイナーエンジンバージョンが要件を満たさない場合は、マイナーエンジンバージョンをアップグレードできます。
背景情報
メタデータアクセスの効率を向上させるため、PostgreSQL は各プロセスで複数のメタデータキャッシュを使用します:
RelCache (リレーション記述子キャッシュ):リレーション記述子をキャッシュします。
CatCache/SysCache (システムカタログキャッシュ):システムテーブルをキャッシュします。
RelCache と CatCache は各プロセスにプライベートです。その結果、データベースに多数の接続やオブジェクト (テーブル、ビュー、インデックスなど) がある場合、データベースインスタンスは大量のメモリを消費します。
グローバルメタデータキャッシュ (Global Cache) は、 および PolarDB for PostgreSQL の共有メモリに存在するメタデータキャッシュの総称です。Global Cache を使用すると、すべてのプロセスが同じキャッシュエントリを共有できるため、メモリ使用率が向上し、メモリ不足 (OOM) エラーのリスクが軽減されます。現在、Global Cache には以下が含まれます:
Global RelCache:RelCache に対応するグローバルリレーション記述子キャッシュ。
Global CatCache:CatCache/SysCache に対応するグローバルシステムテーブルキャッシュ。
RelCache
RelCache は、テーブルに関連するすべてのメタデータ (ビュー、インデックス、TOAST テーブルなど) をメモリ内で再編成してキャッシュし、より効率的なアクセスを実現します。テーブルの列情報、インデックス情報、またはパーティションテーブル情報を取得する場合など、SQL 処理のすべての段階で、RelCache は直接アクセスされます。RelCache ミスが発生した場合、システムはシステムテーブルをスキャンし、データをメモリにロードします。
ネイティブの PostgreSQL の RelCache には、エビクションメカニズムがありません。通常、最初のアクセスの後、RelCache はプロセスが終了するまでキャッシュ内のデータを保持します。あるいは、データ定義言語 (DDL) 操作によってテーブルのメタデータが変更されると、キャッシュ無効化メッセージがブロードキャストされます。無効化メッセージを受信した後、RelCache は無効化されたオブジェクトをメモリから削除します。
CatCache
CatCache は、システムテーブルからのタプルをキャッシュします。CatCache の上には、キーバリュー (KV) インターフェイスを提供する別のレイヤーである SysCache が構築されています。基本的に、CatCache と SysCache は連携して、システムテーブルのデータをメモリ内で KV 形式に再編成し、クエリを簡素化します。たとえば、オブジェクト識別子 (OID) によって名前を取得したり、OID によって関数のパラメーター数を見つけたりするなど、SQL 処理中に CatCache は直接アクセスされます。CatCache ミスが発生した場合、データはシステムテーブルからロードされます。CatCache のロードおよび無効化プロセスは、RelCache のプロセスとほぼ同じです。
パラメーターの説明
パラメーター | レベル | 説明 |
polar_enable_global_catcache | PGC_USERSET | Global CatCache を有効または無効にします。有効値:
|
polar_enable_global_relcache | PGC_USERSET | Global RelCache を有効または無効にします。有効値:
|
polar_sgc_max_size | PGC_POSTMASTER | Global Cache の合計サイズを設定します。有効値の範囲:0 から INT_MAX。デフォルト値は 72 MB です。変更を有効にするには、再起動が必要です。 |
polar_global_catcache_size | PGC_SIGHUP | Global CatCache のサイズを設定します。有効値の範囲:0 から polar_sgc_max_size の値まで。デフォルト値は 32 MB です。 |
polar_global_relcache_size | PGC_SIGHUP | Global RelCache のサイズを設定します。有効値の範囲:0 から polar_sgc_max_size の値まで。デフォルト値は 32 MB です。 |
各 Global Cache の容量は、polar_sgc_max_size の値を超えない限り、オンラインでスケールアップまたはスケールダウンできます。これにより、さまざまなビジネスシナリオに柔軟に対応できます。この機能を使用する場合は、次の点にご注意ください:
Global Cache に十分な容量があることを確認してください。キャッシュは、SQL 処理のすべての段階で頻繁にアクセスされます。容量が不足している場合、エビクションがトリガーされます。エビクションされたデータに再度アクセスする場合、ファイルからロードする必要があり、余分な I/O とパフォーマンスの低下を引き起こす可能性があります。
キャッシュがすでに満杯の場合でも、パラメーターを調整することでオンラインでスケールダウンできます。対応する Global Cache は一部のデータをエビクションします。これはパフォーマンスに影響を与える可能性があるため、この操作は注意して実行してください。
polar_sgc_max_sizeで指定されたメモリは、Global RelCache と Global CatCache に割り当てられます。Global Cache が正しく動作することを保証するために、このメモリの一部は、内部ハッシュテーブルなどの管理目的のためにも予約される必要があります。したがって、polar_sgc_max_sizeの値は、polar_global_relcache_sizeとpolar_global_catcache_sizeの合計よりも大きくする必要があります。
監視インターフェイス
Global Cache のすべての監視インターフェイスは、polar_global_cache 拡張機能で利用できます。次のコマンドを実行して、拡張機能を作成します。
CREATE EXTENSION polar_global_cache;キャッシュ統計情報
Global Cache のグローバル統計情報
polar_global_cache_stat ビューで Global Cache のステータス情報を表示できます。現在、このビューには Global RelCache と Global CatCache の統計のみが含まれています。
=> SELECT * FROM polar_global_cache_stat;
-[ RECORD 1 ]----+----------------
cache_name | Global CatCache
elems | 2805
nlookup | 74233
nlookup_miss | 43576
ninsert | 9478
nmove | 0
ndelete | 0
ninvalidate | 35843
nflush | 1
nevict | 0
nevict_active | 0
nevict_fail | 0
lru_active_len | 402
lru_inactive_len | 2403
data_allocator | 2
meta_allocator | 1
component_id | 1
-[ RECORD 2 ]----+----------------
cache_name | Global RelCache
elems | 95
nlookup | 1203
nlookup_miss | 1005
ninsert | 265
nmove | 0
ndelete | 0
ninvalidate | 4404
nflush | 1
nevict | 0
nevict_active | 0
nevict_fail | 0
lru_active_len | 3
lru_inactive_len | 92
data_allocator | 3
meta_allocator | 1
component_id | 2メトリックの説明:
メトリック | 説明 |
nlookup | キャッシュルックアップの数。 |
nlookup_miss | ルックアップミスの数。このメトリックを |
ninsert | 新しいキャッシュ挿入の数。 |
nmove, ndelete | スケーリング中にキャッシュオブジェクトが移動および削除された回数。 |
ninvalidate | キャッシュ無効化の数。 |
nflush | 特別なキャッシュ無効化メッセージや |
nevict | Global Cache からエビクションされたオブジェクトの総数。 説明 Global Cache 内のオブジェクトは、Least Recently Used (LRU) ポリシーに基づいてエビクションされます。これらはアクティブリストと非アクティブリストに分割され、非アクティブリスト内のオブジェクトが最初にエビクションされます。エビクション中に、LRU ポリシーに従ってエビクションされるべきオブジェクトが、現在使用中であるか、同時実行の競合が原因でエビクションされない場合があります。これらのケースは無視してかまいません。 nevict 関連のメトリックの値がゼロでない場合は、現在の容量が不足していることを示します。パフォーマンスの問題を回避するには、 |
nevict_active | Global Cache のアクティブリストからエビクションされたオブジェクトの数。 |
nevict_fail | Global Cache からのエビクションに失敗した数。 |
lru_active_len | 内部 LRU リストのアクティブリストの長さ。 |
lru_inactive_len | 内部 LRU リストの非アクティブリストの長さ。 |
ローカルキャッシュのグローバル統計情報
polar_cache_stat ビューのメトリックは、polar_global_cache_stat ビューのメトリックのサブセットです。メトリックの詳細については、polar_global_cache_stat ビューのメトリックの説明をご参照ください。
polar_cache_stat は各プロセスのプライベートキャッシュに関する情報を表示しますが、このビューからのクエリ結果はすべてのプロセスのデータを集約します。
=> SELECT * FROM polar_cache_stat;
-[ RECORD 1 ]-+--------------
cache_name | Proc CatCache
nlookup | 779844
nlookup_miss | 82390
ninsert | 150876
ndelete | 139690
ninvalidate | 74231
nevict | 126474
nevict_active | 1808
evict_fail | 0
-[ RECORD 2 ]-+--------------
cache_name | Proc RelCache
nlookup | 295183
nlookup_miss | 4632
ninsert | 25968
ndelete | 3277
ninvalidate | 8856
nevict | 0
nevict_active | 0
evict_fail | 0CatCache 統計情報
Global CatCache の統計情報
polar_global_catcache_stat ビューで Global CatCache のステータス情報を表示できます。
polar_global_cache_stat と比較して、このビューには追加の xxx_clist フィールドが含まれています。通常、これらのメトリックは無視してかまいません。CatCache には、CatTuple と CatList の 2 種類のオブジェクトがあります。xxx_clist メトリックは、CatList オブジェクトに関するさまざまなデータを記録します。
=> SELECT * FROM polar_global_catcache_stat;
-[ RECORD 1 ]-------+----
elems | 34
nlookup | 853
nlookup_miss | 852
ninsert | 34
nmove | 0
ndelete | 0
ninvalidate | 0
nflush | 0
nevict | 0
nevict_active | 0
nevict_fail | 0
nlookup_clist | 41
nlookup_miss_clist | 41
ninsert_clist | 0
nmove_clist | 0
ndelete_clist | 0
ninvalidate_clist | 0
nevict_clist | 0
neivct_active_clist | 0
rehash_fail | 0
meta_alloc_fail | 0
data_alloc_fail | 0
lru_active_len | 0
lru_inactive_len | 34
component_id | 1ローカル CatCache の統計情報
polar_catcache_stat ビューで、プロセスのプライベート CatCache のステータス情報を表示できます。統計メトリックは polar_global_catcache_stat のサブセットであり、その意味は同じです。
=> SELECT * FROM polar_catcache_stat;
-[ RECORD 1 ]------+-----
nlookup | 2060
nlookup_miss | 898
ninsert | 883
ndelete | 753
ninvalidate | 0
nevict | 753
nevict_active | 2
evict_fail | 0
nlookup_clist | 41
nlookup_miss_clist | 41
ninsert_clist | 41
ndelete_clist | 41RelCache 統計情報
Global RelCache の統計情報
polar_global_relcache_stat ビューで Global RelCache のステータスを表示できます。
=> SELECT * FROM polar_global_relcache_stat;
-[ RECORD 1 ]----+-----
elems | 61
nlookup | 930
nlookup_miss | 836
ninsert | 221
nmove | 0
ndelete | 0
ninvalidate | 4344
nflush | 1
nevict | 0
nevict_active | 0
nevict_fail | 0
meta_alloc_fail | 0
data_alloc_fail | 0
lru_active_len | 3
lru_inactive_len | 58
component_id | 2ローカル RelCache の統計情報
polar_relcache_stat ビューで、現在のセッション内の RelCache のステータスを表示できます。
=> SELECT * FROM polar_relcache_stat;
-[ RECORD 1 ]-+-------
nlookup | 293458
nlookup_miss | 4535
ninsert | 20239
ndelete | 3277
ninvalidate | 8856
nevict | 0
nevict_active | 0
evict_fail | 0