PostgreSQL 共有メモリについて
PostgreSQL では、次のように分類できるメモリが使用されます。
- ローカル メモリ - 各プロセスに割り当てられます
- 共有メモリ - すべてのプロセスで使用されます
ローカル メモリ
PostgreSQL の各プロセスには、クエリ処理用のメモリが必要です。 次のサーバー パラメーターを使用すると、メモリ使用量を定義できます。
work_mem は、ORDER BY および DISTINCT 操作のタプルを並べ替えるために必要なメモリを定義します。 このパラメーターは、内部の並べ替え操作とハッシュ テーブルで使用できるメモリの量を決定します。 使用可能なメモリが大量にあり、ワークロードに複雑な並べ替えを伴うクエリがある場合、このパラメーター値を大きくすると、ディスクにスピルする前にメモリ内でより大きなスキャンを実行できるため、パフォーマンスが向上する可能性があります。
ただし、1 つの複雑なクエリでは、多数の並べ替え操作とハッシュ操作が同時に実行される可能性があります。 各操作では、ディスク ベースの一時ファイルへの書き込みを開始する前に、この値で許容される量のメモリが使用されます。 したがって、ビジー状態のシステムでは、総メモリ使用量は個々の work_mem パラメーターのメモリ使用量の何倍にもなります。
この値を調整するには、初期値として合計 RAM * 0.25/max_connections を使用します。
maintenance_work_mem は、バキューム と 再インデックス作成に必要なメモリです。 このパラメーターは、内部の並べ替え操作とハッシュ テーブルで使用できるメモリの量を決定します。 既定値は 64 KB ですが、この値を大きくすると、バキューム処理のパフォーマンスが向上します。
autovacuum_work_mem は、各自動バキューム プロセスで使用される最大メモリを設定します。
temp_buffers は、一時テーブルを格納するためのメモリを定義します。 このパラメーターは、各データベース セッションで使用される一時バッファーの最大数を設定します。
effective_cache_size は、オペレーティング システムとデータベース内でディスク キャッシュに使用できるメモリの量を定義します。 PostgreSQL クエリ プランナーは、このメモリが RAM で固定されているかどうかを判断します。 インデックススキャンは、より高い値に対して使用される可能性が最も高いです。それ以外の場合は、値が低い場合はシーケンシャル スキャンが使用されます。
マシンの合計 RAM の 50% に effective_cache_size を設定します。
共有メモリ
共有メモリは起動時に割り当てられます。 共有メモリは次の目的で使用されます。
shared_buffers は、サーバーによって使用される共有メモリ バッファーを定義します。 PostgreSQL は、永続ストレージから共有バッファー プールにテーブルとインデックスのページを読み込み、メモリ内でそれらを処理します。 この共有バッファー プールは、サーバーによって使用される共有メモリの主要なコンポーネントです。 既定値は 128 MB です (コンピューティング レベルによって異なります)。 より多くのメモリを割り当てる場合は、サーバーを再起動する必要があります。
wal_buffers は、永続ストレージに書き込む前に、先書きログ (WAL) 用の共有メモリ内のディスク ページ バッファーの数を定義します。
まとめると、チューニングが必要なメモリに関連する重要なサーバー パラメーターは次のとおりです。
- 共有バッファ(shared_buffers)
- 作業メモリ
- 有効キャッシュサイズ