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