18.4. 資源の消費

18.4.1. メモリ

shared_buffersinteger

データベースサーバが使用する共有メモリバッファのために使用するメモリ量を設定します。 デフォルトは典型的には32メガバイト(32MB)ですが、使用するカーネルの設定が(initdbの過程で)そこまでをサポートしていなければより少なくなることがあります。 最低限の設定は128キロバイトでなければならず、そして16キロバイト x max_connections以上でなければなりません。 (デフォルト以外のBLCKSZではこの最小値は変わります。) しかし、良い性能を引き出すためには、最小値よりかなり高い値の設定が通常必要です。 実運用のインストレーションでは数十メガバイト程度の値を推奨します。 このパラメータはサーバ起動時のみ設定可能です。

このパラメータを増加させると、PostgreSQLは使用しているオペレーティングシステムのデフォルト構成が許容するSystem V共有メモリの限界を越えた要求を行う要因となることがあります。必要であれば、どの様にしてこのパラメータを調整するかについて項17.4.1を参照ください。

temp_buffersinteger

それぞれのデータベースセッションが使用する一時バッファの最大数を設定します。 これらは一時テーブルにアクセスする時にのみ使用されるセッション局所バッファです。 デフォルトは8メガバイト(8MB)です。 設定はそれぞれのセッション内で変更できますが、セッション内の一時テーブルが最初に使用するまでになります。 引き続いて値の変更を試みても、そのセッションでは効果がありません。

セッションはtemp_buffersで与えられた限度まで、必要とする分一時バッファを割り当てます。実際には多くの一時バッファを必要としないセッションで、大きな値を設定する代償はtemp_buffersでの増分毎に、バッファ記述子用の分、もしくは約64バイトです。とは言っても、バッファが実際に使用されると、それに対して追加の8192バイト(もしくは、通常BLCKSZバイト)が消費されます。

max_prepared_transactionsinteger

同時に"準備された"状態におけるトランザクションの最大数を設定します。 (PREPARE TRANSACTIONを参照してください。) このパラメータをゼロに設定すると、準備されたトランザクション機能を無効にします。 デフォルトは5トランザクションです。 このパラメータはサーバ起動時のみに設定可能です。

準備されたトランザクションを使用しないのであれば、このパラメータも同様にゼロに設定されます。使用する場合、準備段階での無駄な支障を回避するためmax_prepared_transactionsを少なくともmax_connectionsと同じ大きさにしても構いません。

このパラメータを増加させると、使用しているオペレーティングシステムのデフォルト構成が許容するSystem V共有メモリの限界を越えた要求を PostgreSQLが行う原因となることがあります。必要であれば、どの様にしてこのパラメータを調整するかについて項17.4.1を参照ください。

work_meminteger

一時ディスクファイルに切替える前に、内部並べ替えとハッシュテーブル操作が使用するメモリ容量を指定します。 デフォルト値は1メガバイト(1MB)です。 複雑な問い合わせの場合、いくつかの並び替えもしくはハッシュ操作が並行して実行されることに注意してください。それぞれは、データを一時メモリに置く以前にこの値が指定したと同じ大きさのメモリ使用が認められます。さらに、いくつかの実行中のセッションはこれらの動作を同時に行います。したがって、使用されるメモリの合計は、work_memの数倍になります。値を選択する時には、この事実に留意することが必要です。並び替え操作はORDER BYDISTINCT、およびマージ結合に対して使われます。ハッシュテーブルはハッシュ結合、ハッシュに基づいた集約、およびIN副問い合わせのハッシュに基づいた処理で使用されます。

maintenance_work_meminteger

VACUUMCREATE INDEX、およびALTER TABLE ADD FOREIGN KEYの様な保守操作で使用されるメモリの最大容量を指定します。 デフォルト値は16メガバイト(16MB)です。 1つのデータベースセッションでは、一度に1つしか上記操作はできませんし、通常インストレーションでこうした操作が同時に非常に多く発生することはありませんので、これをwork_memよりもかなり多めの値にしても安全です。 大きい値を設定することでvacuum処理と、データベースダンプのリストアの性能が向上します。

オートバキュームを稼動させると、最大autovacuum_max_workers倍ほどこのメモリーが配分されるので、デフォルトの値をあまり高く設定しないよう注意することを覚えておいてください。

max_stack_depthinteger

サーバの実行スタックの最大安全深度を指定します。 このパラメータの理想的な設定はカーネルにより強要される実際のスタック容量の(ulimit -sもしくは局所での同等の値で設定された)限界から、1メガバイト程度の安全余地を差し引いたものです。 安全余地は、スタック深度はサーバが各ルーチンで検査をせず、数式評価などの主要な潜在的に再帰的なルーチンの場合のみのため、必要となるものです。 デフォルト設定は2メガバイト(2MB)で、かなり控え目で、クラッシュの危険はなさそうです。 とは言っても、複雑な関数の実行を許容するには小さ過ぎるかも知れません。 スーパーユーザのみがこの設定を変更することができます。

max_stack_depthを実際のカーネルの制限よりも高い値に設定した場合、暴走した再帰関数により、個々のバックエンドプロセスがクラッシュするかもしれません。 PostgreSQLによりカーネルの制限を決定することができるプラットフォームでも、この変数を危険な値に設定させません。 しかし、すべてのプラットフォームがこの情報を提供できるわけではありません。 このため、値を選ぶ時には注意が必要です。

18.4.2. 空き領域マップ

これらパラメータは、データベースの未使用領域の場所を追跡し、共有空き領域マップ(FSM)の大きさを管理します。 マップに記載の無い空き領域は再使用されないため、通常より小さくされた空き領域は、時間の経過につれ、データベースが増加するディスク領域容量を消費する原因になります。 PostgreSQLは、そうはしないで、新規データの格納が必要になった場合、オペレーティングシステムに大きなディスク領域を要求します。データベースに渡るVACUUM VERBOSEコマンドが表示する最後の数行は、現在の設定が適切でない時の助けになります。現在の設定が著しく小さい場合、NOTICEメッセージが、この操作の実行中同様に表示されます。

これらのパラメータを増加させると、使用しているオペレーティングシステムのデフォルト構成が許容するSystem V共有メモリの限界を越えた要求を PostgreSQLが行う原因となることがあります。必要であれば、どの様にしてこのパラメータを調整するかについて項17.4.1を参照ください。

max_fsm_pagesinteger

空き領域が共有空き領域マップ内でで追跡されるディスクページの最大数を設定します。 6バイトの共有メモリがそれぞれのページスロットで消費されます。 この設定は少なくとも、16 * max_fsm_relationsより大きくなければなりません。 デフォルトは利用可能なメモリ量に応じてinitdbが決定し、20kから200kの値になります。 このパラメータはサーバ起動時のみ設定可能です。

max_fsm_relationsinteger

空き領域が共有空き領域マップ内で追跡されるリレーション(テーブルとインデックス)の最大数を設定します。 おおよそ、70バイトの共有メモリがそれぞれのスロットに対して消費されます。 デフォルトは1000リレーションです。 このパラメータはサーバ起動時のみ設定可能です。

注意: このパラメータの設定に関する情報についてはVACUUMコマンドを参照してください。

18.4.3. カーネル資源使用

max_files_per_processinteger

それぞれのサーバ子プロセスが同時にオープンできるファイル数の最大値をセットします。 デフォルトは1000ファイルです。 もしもカーネルがプロセス毎の安全制限を強要している場合、この設定を気にかける必要はありません。 しかし、いくつかのプラットフォーム(特にほとんどのBSDシステム)では、非常に多くのプロセス全てが多くのファイルを開こうとした時に、カーネルは個々のプロセスがシステムが実際にサポートできるファイル数より多くを開くことを許しています。 もしも"Too many open files"エラーが発生した場合、この設定を減少してみてください。 このパラメータはサーバ起動時のみ設定可能です。

shared_preload_libraries (string)

この変数はサーバが稼働する時点で事前に読み込まれなければならない1つもしくはそれ以上の共有ライブラリを指定します。 複数のライブラリをロードする場合は、ライブラリ名をコンマで区切ってください。 たとえば、'$libdir/mylib'mylib.so(一部のプラットフォームではmylib.sl)をインストレーションの共有ライブラリディレクトリから事前読み込みします。 このパラメータはサーバ起動時にのみ設定可能です。

PostgreSQLの手続き言語ライブラリはこのようにして、典型的には構文'$libdir/plXXX'を使用し、事前読み込みされます。 ここで、XXXpgsqlperltcl、もしくはpythonです。

共有ライブラリを事前読み込みすることで、ライブラリが最初に使用される時、ライブラリの立上り時間を省略できます。 とは言っても、それぞれの新規サーバプロセスを開始させる時間は、そのプロセスがライブラリを使用しないとしても、多少増加することがあります。 ですから、このパラメータはほとんどのセッションで使用されそうなライブラリにのみ限定することをお勧めします。

注意: Windowsでは、サーバ起動時にライブラリを事前読み込みしても、新しいサーバプロセスの起動に要する時間は減りません。 各サーバプロセスは事前に読み込まれたライブラリをすべて、再度読み込みます。 しかし、shared_preload_librariesはWindowsホストでも有用です。 共有ライブラリの中には、postmaster起動時にのみ特定の操作を行わなければならないものがあるためです。 (例えば、共有ライブラリは、postmasterの起動が終わった後に実行することができない、軽量ロックや共有メモリの予約を行う必要があるかもしれません。)

指定したライブラリが存在しないと、サーバの起動に失敗します。

PostgreSQLがサポートするライブラリはすべて、互換性を保証するために検査される"マジックブロック"を持ちます。 このため、この方法でPostgresQL以外のライブラリが読み込まれることはありません。

18.4.4. コストに基づくVacuum遅延

VACUUM および ANALYZE コマンドの実行中、実行される各種I/O操作の予測コストを追跡し続ける内部加算器をシステムが保守します。累積されたコストが(vacuum_cost_limitで指定された)限度に達すると、操作を実行しているプロセスは(vacuum_cost_delayで指定された)ちょっとの間スリープします。その後、加算器をリセットし、実行を継続します。

この機能の目的は、同時的データベース活動に対するこれらのコマンドのI/Oに対する影響を管理者から軽減させます。VACUUM および ANALYZEの様な保守用コマンドが、即座に終了することが対して重要でない情況が多くあります。とは言っても、他のデータベースの操作を行うに当たってこれらのコマンドがシステムの能力に多大な阻害を与えないことは通常とても重要です。コストに基づいたvacuum遅延はこれを実現するための方法を管理者に提供します。

デフォルトでこの機能は無効になっています。有効にするには、vacuum_cost_delay変数をゼロでない値に設定します。

vacuum_cost_delayinteger

コストの限度を越えた場合、プロセスがスリープするミリ秒単位の時間の長さです。 デフォルトの値は0で、コストに基づいたvacuum遅延機能を無効にします。 正の整数はコストに基づいたvacuumを有効にします。 多くのシステムで、スリープ遅延の有効な分解能は10ミリ秒です。 vacuum_cost_delayの値の設定を10の倍数としない場合、次に大きい10の倍数に設定した結果と同一になるかもしれないことを覚えておいてください。

vacuum_cost_page_hitinteger

共有バッファキャッシュの中のバッファにvacuumを掛ける予測コストです。バッファプールのロック、共有ハッシュテーブルの検索、およびページ内容走査のコストを示します。デフォルトの値は1です。

vacuum_cost_page_missinteger

ディスクから読み込まれなければならないバッファにvacuumを掛ける予測コストです。これが示すものは、バッファプールロックの試み、共有ハッシュテーブルの参照、ディスクから目的ブロックの読み込み、そしてその内容走査です。デフォルトの値は10です。

vacuum_cost_page_dirtyinteger

vacuumが、先だって掃除したブロックを変更する時に果たされた予測コストです。ダーティブロックを再度ディスクに吐き出すのに必要な余分なI/Oを表します。デフォルトの値は20です。

vacuum_cost_limitinteger

vacuumを掛けるプロセスをスリープさせることになる累計されたコストです。デフォルトの値は200です。

注意: 重要なロックを保有し可能なかぎり早急に完了しなければならないある種の操作があります。コストに基づいたvacuum遅延はこの様な操作では起こりません。したがって、コストの累計が指定された限度をかなり高く越える可能性があります。このような場合無駄な長い遅延を防止するため、実際の遅延は以下の様にして計算されます。 vacuum_cost_delay * accumulated_balance / vacuum_cost_delay * 4 の最大値を所有する vacuum_cost_limit

18.4.5. バックグラウンドライタ

バックグラウンドライタと呼ばれる分離したサーバプロセスがあり、その機能は"ダーティ"共有バッファの書き込み処理を行うことです。 その目的は、ユーザの問い合わせに対応しているサーバプロセスは発生する書き込みを、バックグラウンドライタが受け持つことにより、ほぼ待状態にならないようにすることです。 しかし、繰り返し変更されるページでは、これがないとチェックポイント間隔に一度だけ書き出される可能性がありましたが、バックグラウンドライタは同じ間隔内で複数回書き出しますので、全体としてのI/O負荷は多くなります。 本節で説明したこのパラメータはサイト独自の必要に応じて動作を変更することに使用できます。

bgwriter_delayinteger

バックグラウンドライタの動作周期間の遅延を指定します。 それぞれの周期でライタは、(以下のパラメータで管理される)一部のダーティバッファの書き込みを行います。 そしてbgwriter_delayミリ秒スリープした後、これを繰りかえします。 デフォルトの値は200ミリ秒(200ms)です。 多くのシステムで、スリープ遅延の実精度は10ミリ秒です。 bgwriter_delayの値の設定を10の倍数としない場合、次に大きい10の倍数に設定した結果と同一になるかもしれないことを覚えておいてください。 このパラメータはpostgresql.confファイル内、または、サーバのコマンドラインで設定可能です。

bgwriter_lru_maxpagesinteger

それぞれの周期で、この数以上のバッファはバックグランドライタにより書き込まれません。 ゼロに設定することで(チェックポイント活動を除く)バックグランド書き込みは無効になります。 デフォルト値は100バッファです。 このパラメータはpostgresql.confファイル内、または、サーバのコマンドラインでのみで設定可能です。

bgwriter_lru_multiplier (floating point)

各周期で書き出されるダーティバッファ数は、最近の周期でサーバプロセスが必要とした新しいバッファ数を基にします。 次の周期で必要となるバッファ数を推定するために、最近必要とされた平均がbgwriter_lru_multiplierと掛け合わせられます。 ダーティバッファの書き出しは、同数の整理済み、再利用可能なバッファが利用できるようになるまで行われます。 (しかし1周期にbgwriter_lru_maxpagesを越えるバッファ数を書き出しません。) したがって、1.0と設定することは、必要と予想されるバッファ数の書き込みについて"必要なときに必要なだけ"というポリシーを表します。 より大きな値は突発的な要求に対する多少の緩衝材を提供します。 より小さな値はサーバプロセスでなされる書き込みを意図的に残します。 デフォルトは1.0です。 このパラメータはpostgresql.confファイル内、または、サーバのコマンドラインでのみで設定可能です。

bgwriter_lru_maxpagesおよびbgwriter_lru_multiplierの値がより少ないと、バックグラウンドライタで引き起こされる追加のI/O負荷を軽減しますが、サーバプロセスが自分自身で行わなければならない書き込みが増加することになり、会話型問い合わせを遅らせることになります。

アダルトレンタルサーバー