Fujitsu Enterprise Postgresで使用するメモリの見積り式について説明します。
Fujitsu Enterprise Postgresの使用メモリ量の概算は、次の式で見積もってください。
Fujitsu Enterprise Postgresの使用メモリ量 = 共有メモリ量 + ローカルメモリ量
共有メモリ量
共有メモリ量 = 1523444 + 8518 × x + 7154 × (a + b + c + d + 1) + 405 × (a + b + c + d + e) × f + (1208 + g) × (a + b + c + d + 9) + 64 × b + 568 × c + 104 × d + 5666 × e + 112 × h + 8200 × i + 512 × j + 4 × (k + 10) + 1097984 × m + 258 × (a + b + c + d + 1 + e) × o + (1024 × 1024) × p + n + 128 × q
上記の単位はByteです。
x = shared_buffer/8 注:shared_bufferの単位(kB) 例:shared_buffer=128MBの場合、x=16384 (128×1024/8) MBをKBに変換してxを算出します。 a = max_connections b = autovacuum_max_workers c = max_worker_processes d = max_wal_senders e = max_prepared_transactions f = max_locks_per_transaction g = track_activity_query_size (バイト) h = max_logical_replication_workers i = wal_buffers/8 注:wal_buffersがデフォルト値(-1)の場合、i = x/32で算出してください。 ただし、2048以上となった場合は、最大値2048としてください。 i = x/32の場合、iの最大値の制限があります。 iの最大値 = WALセグメントサイズ / 8 WALセグメントサイズはinitdbのオプション「--wal-segsize」で設定できます。 WALセグメントサイズの単位はKBです。 (WALセグメントサイズのデフォルトは16MBです。iを算出する際にはKBに変換してください) 例: shared_buffer=128MB、かつ、wal_buffers=-1の場合、i=512(16384/32) shared_buffer=2GB、かつ、wal_buffers=-1の場合、i=2048(2×1024×1024/8/32 = 8192ですが、 iの最大値は2048になります) wal_buffers=512kBの場合、i=64(512/8) wal_buffers=32MBの場合、i=4096(32 ×1024/8) MBをKBに変換してiを算出します。 j = max_replication_slots k = old_snapshot_threshold 注:old_snapshot_threshold がデフォルト値(-1)場合、見積式に「4×(k+10)」の加算は不要です。 old_snapshot_thresholdの単位(min) 例:old_snapshot_threshold=1hの場合、k=60(1×60) hをminに変換してkを算出します。 m = pgx_global_metacache (メガバイト) n = プラグインから要求されたメモリサイズ (プラグイン側で決めたもの) o = max_pred_locks_per_transaction p = min_dynamic_shared_memory (MB) q = データベースロール数
WebAdminを使用してインスタンスを作成している場合は、下記のパラメータがインスタンスの作成時に自動的に設定されていることを考慮して、共有メモリ量を算出してください。
パラメータ名 | 設定されている値 |
---|---|
shared_buffers | マシンの搭載メモリ量の30%が設定されます。(注) |
max_connections | 100が設定されています。 |
max_prepared_transactions | 100が設定されています。 |
注) この値が2097151MBを超える場合、2097151MBが設定されます。
ローカルメモリ量
ローカルメモリ量 = プロセスのスタック領域 + 一時テーブルを使用するデータベースセッションで消費されるメモリ + ソートやハッシュテーブル操作を行うデータベースセッションで消費されるメモリ + 保守操作で消費されるメモリ + プロセス毎に消費される基礎メモリ + データアクセスの準備のために消費されるメモリ
プロセスのスタック領域 = max_stack_depth × (max_connections + autovacuum_max_workers + 9)
これは上限値です。
実際にスタックが成長するに従って消費されます。
“9”は、様々なサーバ側にある特定の役割を担うプロセスの数です。
一時テーブルを使用するデータベースセッションで消費されるメモリ = temp_buffers × max_connections
これは上限値です。
実際に一時バッファを使用するときに徐々にメモリが消費され、セッションが終了されたときに解放されます。
ソートやハッシュテーブル操作を行うデータベースセッションで消費されるメモリ = work_mem (注) × max_connections
注) ハッシュテーブル操作の場合、work_memをhash_mem_multiplierで乗算します。
これは上限値です。
実際にソートなどを行ったときに徐々にメモリが消費され、クエリが終了したときに解放されます。
保守操作で消費されるメモリ = maintenance_work_mem × (同時に保守操作を行うセッション数 + autovacuum_max_workers)
保守操作とは、VACUUM、CREATE INDEX、およびALTER TABLE ADD FOREIGN KEYのような操作を意味します。
プロセス毎に消費される基礎メモリ = 1プロセスで消費される基礎メモリ× (max_connections + autovacuum_max_workers + 9)
1プロセス当たりの消費メモリ量は、以下の計算式の結果を使用してください。サーバプロセスが動作している間は常に消費されます。
“9”は、様々なサーバ側にある特定の役割を担うプロセスの数です。
1プロセス当たりの消費メモリ量は、そのプロセスがアクセスする、テーブル、インデックスや、全テーブルの全カラムなどの数によって決まります。テーブルの数が100程度のシステムならば、3MBと見積もって構いませんが、そうでないならば、以下の見積もり式を使用してください。
1プロセスで消費される基礎メモリ = (1.9キロバイト×全ユーザーテーブル個数 + 2.9キロバイト × 全ユーザーインデックス個数 + 1.0キロバイト ×全ユーザーカラム数) × 1.5 (注) もし、Global Meta Cache機能を有効にした場合は以下の計算式を使ってください。 1プロセスで消費される基礎メモリ = (全ユーザーテーブル個数 + 全ユーザーインデックス個数 + 全ユーザーカラム数) × 0.1キロバイト× 1.5(※) + (1.4キロバイト×全ユーザーテーブル個数 + 2.4キロバイト × 全ユーザーインデックス個数) × 1.5 (注)
注) 安全係数(1.5)
基礎メモリにのる情報には、可変長の情報が含まれています。それを考慮した値です。
データアクセスの準備のために消費されるメモリ =変動量 × (max_connections + autovacuum_max_workers + 4) 変動量 = shared_buffers / 8キロバイト(ページ長) × 4バイト(ページ管理データのサイズ)
共有メモリ上のデータベースキャッシュにアクセスするときに必要とします。
“4”は、様々なサーバ側にある特定の役割を担うプロセスのうち、データベースにアクセスするプロセスの数です。