GUCパラメータ

本節ではPG-Stromの提供する設定パラメータについて説明します。

機能単位の有効化/無効化

pg_strom.enabled [型: bool / 初期値: on]
PG-Strom機能全体を一括して有効化/無効化する。
pg_strom.enable_gpuscan [型: bool / 初期値: on]
GpuScanによるスキャンを有効化/無効化する。
pg_strom.enable_gpuhashjoin [型: bool / 初期値: on]
GpuHashJoinによるJOINを有効化/無効化する。
pg_strom.enable_gpunestloop [型: bool / 初期値: on]
GpuNestLoopによるJOINを有効化/無効化する。
pg_strom.enable_gpupreagg [型: bool / 初期値: on]
GpuPreAggによる集約処理を有効化/無効化する。
pg_strom.enable_brin [型: bool / 初期値: on]
BRINインデックスを使ったテーブルスキャンを有効化/無効化する。
pg_strom.enable_gpucache [型: bool / 初期値: on]
PostgreSQLテーブルの代わりにGPUキャッシュを参照するかどうかを制御する。
なお、この設定値をoffにしてもトリガ関数は引き続きREDOログバッファを更新し続けます。
pg_strom.enable_partitionwise_gpujoin [型: bool / 初期値: on]
GpuJoinを各パーティションの要素へプッシュダウンするかどうかを制御する。
pg_strom.enable_partitionwise_gpupreagg [型: bool / 初期値: on]
GpuPreAggを各パーティションの要素へプッシュダウンするかどうかを制御する。
pg_strom.pullup_outer_scan [型: bool / 初期値: on]
GpuPreAgg/GpuJoin直下の実行計画が全件スキャンである場合に、上位ノードでスキャン処理も行い、CPU/RAM⇔GPU間のデータ転送を省略するかどうかを制御する。
pg_strom.pullup_outer_join [型: bool / 初期値: on]
GpuPreAgg直下がGpuJoinである場合に、JOIN処理を上位の実行計画に引き上げ、CPU⇔GPU間のデータ転送を省略するかどうかを制御する。
pg_strom.enable_numeric_aggfuncs [型: bool / 初期値: on]
numericデータ型を引数に取る集約演算をGPUで処理するかどうかを制御する。
GPUでの集約演算においてnumericデータ型は倍精度浮動小数点数にマッピングされるため、計算誤差にセンシティブな用途の場合は、この設定値を off にしてCPUで集約演算を実行し、計算誤差の発生を抑えることができます。
pg_strom.cpu_fallback [型: bool / 初期値: off]
GPUプログラムが"CPU再実行"エラーを返したときに、実際にCPUでの再実行を試みるかどうかを制御する。
pg_strom.regression_test_mode [型: bool / 初期値: off]
GPUモデル名など、実行環境に依存して表示が変わる可能性のあるEXPLAINコマンドの出力を抑制します。これはリグレッションテストにおける偽陽性を防ぐための設定で、通常は利用者が操作する必要はありません。

オプティマイザに関する設定

pg_strom.chunk_size [型: int / 初期値: 65534kB]
PG-Stromが1回のGPUカーネル呼び出しで処理するデータブロックの大きさです。かつては変更可能でしたが、ほとんど意味がないため、現在では約64MBに固定されています。
pg_strom.gpu_setup_cost [型: real / 初期値: 4000]
GPUデバイスの初期化に要するコストとして使用する値。
pg_strom.gpu_dma_cost [型: real / 初期値: 10]
チャンク(pg_strom.chunk_size = 約64MB)あたりのDMA転送に要するコストとして使用する値。
pg_strom.gpu_operator_cost [型: real / 初期値: 0.00015]
GPUの演算式あたりの処理コストとして使用する値。cpu_operator_costよりも大きな値を設定してしまうと、いかなるサイズのテーブルに対してもPG-Stromが選択されることはなくなる。

エグゼキュータに関する設定

pg_strom.max_async_tasks [型: int / 初期値: 5]
PG-StromがGPU実行キューに投入する事ができる非同期タスクのプロセス毎の最大値。
CPUパラレル処理と併用する場合、この上限値は個々のバックグラウンドワーカー毎に適用されます。したがって、バッチジョブ全体ではpg_strom.max_async_tasksよりも多くの非同期タスクが実行されることになります。
pg_strom.reuse_cuda_context [型: bool / 初期値: off]
クエリの実行に伴って作成したCUDAコンテキストを、次回のクエリ実行時に再利用します。
通常、CUDAコンテキストの作成には100~200ms程度を要するため、応答速度の改善が期待できる一方、一部のGPUデバイスメモリを占有し続けるというデメリットもあります。そのため、ベンチマーク等の用途を除いては使用すべきではありません。
また、CPUパラレルを利用する場合、ワーカープロセスでは必ずCUDAコンテキストを作成する事になりますので、効果は期待できません。

GPUダイレクトSQLの設定

pg_strom.gpudirect_driver [型: text]
GPUダイレクトSQLのドライバソフトウェア名を示す読み取り専用パラメータです。
nvidia cufileまたはheterodb nvme-stromのどちらかです。
pg_strom.gpudirect_enabled [型: bool / 初期値: on]
GPUダイレクトSQL機能を有効化/無効化する。
pg_strom.gpudirect_threshold [型: int / 初期値: 自動]
GPUダイレクトSQL機能を発動させるテーブルサイズの閾値を設定する。
初期値は自動設定で、システムの物理メモリとshared_buffers設定値から計算した閾値を設定します。
pg_strom.cufile_io_unitsz [型: int / 初期値: 16MB]
cuFile APIを使用してデータを読み出す際のI/Oサイズを指定する。通常は変更の必要はありません。
nvidia cufileドライバを使用する場合のみ有効です。
pg_strom.nvme_distance_map [型: text / 初期値: null]
NVMEデバイスやNFS区画など、ストレージ区画ごとに最も近傍のGPUを手動で設定します。
書式は<gpuX>=(<nvmeX>|<sfdvX>|</path/to/nfsmount>)[;<gpuY>=...]で、NVMEデバイスなどストレージと対応するGPUのペアをセミコロン区切りの文字列で記述します。
(例:gpu0=nvme1; gpu1=/mnt/nfs_volume
  • <gpuX>はデバイス番号Xを持つGPUです。
  • <nvmeX>はローカルのNVME-SSDまたはリモートのNVME-oFデバイスを意味します。
  • <sfdvX>はScaleFlux社製CSDドライブ用の専用デバイスを意味します。
  • /path/to/nfsmountはNFS-over-RDMAを用いてマウントしたNFS区画のマウントポイントです。
ローカルのNVME-SSDに対しては多くの場合自動設定で十分ですが、NVME-oFデバイスやNFS-over-RDMAを使用する場合、機械的に近傍のGPUを特定する事ができないため、手動で近傍のGPUを指定する必要があります。

Arrow_Fdw関連の設定

arrow_fdw.enabled [型: bool / 初期値: on]
推定コスト値を調整し、Arrow_Fdwの有効/無効を切り替えます。ただし、GpuScanが利用できない場合には、Arrow_FdwによるForeign ScanだけがArrowファイルをスキャンできるという事に留意してください。
arrow_fdw.metadata_cache_size [型: int / 初期値: 128MB]
Arrowファイルのメタ情報をキャッシュする共有メモリ領域の大きさを指定します。共有メモリの消費量がこのサイズを越えると、古いメタ情報から順に解放されます。
arrow_fdw.record_batch_size [型: int / 初期値: 256MB]
Arrow_Fdw外部テーブルへ書き込む際の RecordBatch の大きさの閾値です。INSERTコマンドが完了していなくとも、Arrow_Fdwは総書き込みサイズがこの値を越えるとバッファの内容をApache Arrowファイルへと書き出します。

GPUキャッシュの設定

pg_strom.enable_gpucache [型: bool / 初期値: on]
検索/分析系のクエリでGPUキャッシュを使用するかどうかを制御します。
なお、本設定はトリガによるREDOログバッファへの追記には影響しません。
pg_strom.gpucache_auto_preload [型: text / 初期値: null]
PostgreSQLの起動直後にGPUキャッシュをロードすべきテーブル名を指定します。
書式は DATABASE_NAME.SCHEMA_NAME.TABLE_NAME で、複数個のテーブルを指定する場合はこれをカンマ区切りで並べます。
GPUキャッシュの初回ロードは相応に時間のかかる処理ですが、事前に初回ロードを済ませておく事で、検索/分析クエリの初回実行時に応答速度が遅延するのを避けることができます。
なお、本パラメータを '*' に設定すると、GPUキャッシュを持つ全てのテーブルの内容を順にGPUへロードしようと試みます。

GPUコードの生成、およびJITコンパイルの設定

pg_strom.program_cache_size [型: int / 初期値: 256MB]
ビルド済みのGPUプログラムをキャッシュしておくための共有メモリ領域のサイズです。パラメータの更新には再起動が必要です。
pg_strom.num_program_builders [型: int / 初期値: 2]
GPUプログラムを非同期ビルドするためのバックグラウンドプロセスの数を指定します。パラメータの更新には再起動が必要です。
pg_strom.debug_jit_compile_options [型: bool / 初期値: off]
GPUプログラムのJITコンパイル時に、デバッグオプション(行番号とシンボル情報)を含めるかどうかを指定します。GPUコアダンプ等を用いた複雑なバグの解析に有用ですが、性能のデグレードを引き起こすため、通常は使用すべきでありません。
pg_strom.extra_kernel_stack_size [型: int / 初期値: 0]
GPUカーネルの実行時にスレッド毎に追加的に割り当てるスタックの大きさをバイト単位で指定します。通常は初期値を変更する必要はありません。

GPUデバイスに関連する設定

pg_strom.cuda_visible_devices [型: text / 初期値: null]
PostgreSQLの起動時に特定のGPUデバイスだけを認識させてい場合は、カンマ区切りでGPUデバイス番号を記述します。
これは環境変数CUDA_VISIBLE_DEVICESを設定するのと同等です。
pg_strom.gpu_memory_segment_size [型: int / 初期値: 512MB]
PG-StromがGPUメモリをアロケーションする際に、1回のCUDA API呼び出しで獲得するGPUデバイスメモリのサイズを指定します。
この値が大きいとAPI呼び出しのオーバーヘッドは減らせますが、デバイスメモリのロスは大きくなります。

PG-Strom共有メモリに関連する設定

shmbuf.segment_size [型: int / 初期値: 256MB]
ポータブルな仮想アドレスを持つ共有メモリセグメントの単位長を指定します。
通常は初期値を変更する必要はありませんが、GPUキャッシュのREDOログバッファに256MB以上の大きさを指定する場合には、本パラメータも併せて拡大する必要があります。
本パラメータの設定値は2のべき乗だけが許されます。
shmbuf.num_logical_segments [型: int / 初期値: 自動]
ポータブルな仮想アドレスを持つ共有メモリのセグメント数を指定します。
PG-Stromは起動時に(shmbuf.segment_size x shmbuf.num_logical_segments)バイトの領域をPROT_NONE属性でmmap(2)し、その後、シグナルハンドラを利用してオンデマンドの割当てを行います。
デフォルトの論理セグメントサイズは自動設定で、システム搭載物理メモリの2倍の大きさです。