PostgreSQL メモリサイズ 見積もり方法
PostgreSQL において、メモリサイジングの方法を示します。計算方法が何種類かあるので紹介します。
1. 正式サイトの共有メモリ見積もり
http://www.postgresql.jp/document/pg814doc/html/ kernel-resources.html#SHARED-MEMORY-PARAMETERS 共有メモリ使用量の計算式 = max_connections * ( 400 + 220 * max_locks_per_transaction ) + max_prepared_transactions * ( 600 + 220 * max_locks_per_transaction ) + shared_buffers * 8300 + wal_buffers * 8200 + max_fsm_relations * 70 + max_fsm_pages * 6
2. バックエンドプロセスを簡略化しての見積もり
メモリモデルからサイズ推測すると、以下の式で判断できる。 実装メモリ * 安全率 > Shared Buffer * 8KB + WALバッファ * 8KB + max_fsm_relations * 70 + max_fsm_pages * 6 + ( sort_mem * 8KB + vacuum_mem * 1024 ) * max_connections 補足1 バックエンドプロセス (1)sort_mem(temp_buffers) (2)vacuum_mem(maintenance_work_mem) 補足2 PostgreSQLが使用する共有メモリ領域 (1)Shared Buffer (2)WALバッファ (3)FSM 補足3 Kernelの直接管理領域 (1)Kernelのバッファキャッシュ (2-1)データ領域 (2-2)WALログ領域
3. PostgreSQLメーリングリストの過去メールの見積もり
http://ml.postgresql.jp/pipermail/pgsql-jp/ 2005-January/018146.html ●各プロセスが共有するメモリ領域 (1)共有メモリ (2)postgres(postmaster)のテキストセグメント (*)共有ライブラリのテキストセグメント 共有ライブラリについては、ldd /usr/bin/postgres で見る限り、 PostgreSQL以外でも使われそうなライブラリばかりなので、無視 することにします。 ●各プロセスがプライベートに確保するメモリ領域 (3)データセグメント (4)BSS (5)共有ライブラリのデータセグメント (6)共有ライブラリのBSS (7)ヒープ (*)スタック スタックはそれほど大きくならないと思うので、無視することに します。 ●総メモリ使用量の計算 データベースへの平均同時接続数を n とすると、PostgreSQLに よって消費される総メモリ量は概ね以下のようになるはずです。 (安全な値を得たい場合は、n に max_connectionsを採用するべきかも) 総メモリ使用量 = (1) + (2) + ( (3) + (4) + (5) + (6) + (7) ) * n
実際に計算する場合には以下のコマンドを使用する。
(1) 共有メモリ 上記計算式で見積もるのも良いが、PostgreSQL 起動時に、ipcsコマンドを実行 して実共有メモリサイズを測ることができる。 # ipcs -m ------ Shared Memory Segments -------- key shmid owner perms bytes nattch status 0xf90880a7 0 root 600 189 1 0x0000bbbd 32769 root 666 126328 1 0x0052e2c1 4816898 psgadm 600 1138728960 4 (2) テキストセグメント 以下のコマンドの text 部分。(単位は bytes) # size /opt/postgresql/product/8.1/bin/postmaster text data bss dec hex filename 2419091 33856 241264 2694211 291c43 /opt/postgresql/product/8.1/bin/postmaster ------------------------------------------------------------------------ (3) データセグメント (4) BSS (5) 共有ライブラリのデータセグメント (6) 共有ライブラリのBSS これらは (2) と同様にsizeコマンドで取得可能です。が、後述の理由により 実施しない。 (7) ヒープ ソート領域などが確保されるはずだが、サイズが可変なので厳密な計算は難しい。 ※結局、PostgreSQLをある程度動かしている状態で各postgresプロセスに対して pmapを実行すると、最終行に以下のような出力が得られるので、 mapped: 14544 KB writable/private: 768 KB shared: 8464 KB "writable/private"の平均値を総メモリ使用量の計算式の (3) + (4) + (5) + (6) + (7) として採用するのが現実的な値が得られる ような気がする。
最後に上記までで計算した総量に対して2割~3割の安全率を見込めば、無視したスタック領域も吸収できて、そ れなりに妥当なメモリサイジングができるのではないかと思っています。
ご訪問頂き有難う御座います。
当サイトを効率良く使うためにまずは FrontPage を見て下さい。
検索方法、一覧表示などの各情報を纏めています。
当サイトの説明 → Frontpage