データベース 2025-06-14

PostgreSQLのメモリ設定

設定するPostgreSQLメモリ管理。shared_buffers、work_mem、maintenance_work_memの指針からOOM回避、性能向上まで段階的に解説します。

Read in: en
PostgreSQLのメモリ設定

概要

データベースの性能向上や安定運用には適切なメモリ設定が必要である。ディスクアクセスはメモリアクセスに比べ極めて遅く、可能な限りメモリから読み書きすることで応答性能を向上させたい一方、過度なメモリ割り当てはOOM(Out Of Memory、メモリ不足によるプロセス強制終了)リスクを高め、システム全体の停止につながる可能性がある。したがって、安定性を担保しつつ性能を確保するために、PostgreSQLのメモリ管理設定を慎重に行う必要がある。

本稿では、PostgreSQL公式ドキュメントや実運用の知見、Gihyo記事などを踏まえ、共有メモリ域とローカルメモリ領域の基本構成から主要パラメータの設定指針、運用上の検証手順までをまとめる。

PostgreSQLのプロセス構成とメモリ領域の区分

PostgreSQLはマルチプロセスモデルを採用しており、サーバ起動時に生成されるマスタプロセス、WAL書き込みなどを担うバックグラウンドプロセス群、クライアント接続ごとに生成されるバックエンドプロセス(セッションプロセス)から構成される。各プロセスは独自にメモリを使用し、特に接続数に比例して増加するバックエンドプロセスのメモリ割り当てが全体のメモリ消費に大きく影響する。

メモリ管理は大きく以下の2つに分かれる。

  1. 共有メモリ域(shared memory) サーバ起動時に確保量が決定し複数プロセス間で共有される領域。主な設定項目にはshared_bufferswal_buffers、Free Space MapやVisibility Mapなどがある。
  2. ローカルメモリ領域(process-local memory) 各バックエンドプロセスごとに確保される作業用メモリ。ソートやハッシュ結合、メンテナンス操作などで利用される領域で、work_memmaintenance_work_memtemp_buffersなどが該当し、動的にSET可能なものもある。

shared_buffersの設定指針

shared_buffersはPostgreSQLがデータベースキャッシュとして使用する共有メモリの量を設定するパラメータである。デフォルト128MBは小さいため、専用サーバであればシステムメモリの約25%を初期値とし、OSキャッシュとのバランスを見ながら段階的に増加を試みる。

work_memの設定指針

work_memは並び替え、ハッシュ結合などの一時操作で使用可能な上限メモリを設定する。各クエリ実行プロセス、かつ各操作ごとに上限が適用されるため、実際の消費量はwork_mem × 一時操作数 × パラレルワーカー数 × 同時セッション数といった要素に依存する。最悪の場合には大きなメモリ消費に至る可能性がある。ただしこれは理論上の最大想定であり、実際のクエリ内容やタイミングにより変動するため、あくまで目安として捉えるべきである。

その他の関連パラメータ

まとめ

PostgreSQLのメモリ管理はshared_bufferswork_memを中心に、プロセスごとの消費や同時接続数、パラレルクエリ特性を加味した総合設計が不可欠である。設定変更は段階的に行い、事前検証・リスク評価・継続監視の3点を徹底することで、安定性と性能を両立した運用を実現できる。

参考

Tags: PostgreSQL
Share: 𝕏 Post Facebook Hatena
✏️ View source / Discuss on GitHub
☕ サポート

このブログを応援していただける方は、以下からサポートをお願いします。いただいたサポートはブログ運営・技術研鑽に活用します。


関連記事