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