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_gpugistindex
[型:bool
/ 初期値:on]
- GpuGiSTIndexによるJOINを有効化/無効化する。
pg_strom.enable_gpujoin
[型:bool
/ 初期値:on]
- GpuJoinによるJOINを一括で有効化/無効化する。(GpuHashJoinとGpuGiSTIndexを含む)
pg_strom.enable_gpupreagg
[型:bool
/ 初期値:on]
- GpuPreAggによる集約処理を有効化/無効化する。
pg_strom.enable_numeric_aggfuncs
[型:bool
/ 初期値:on]
numeric
データ型を引数に取る集約演算をGPUで処理するかどうかを制御する。- GPUでの集約演算において
numeric
データ型は128bit固定小数点変数にマッピングされるため、極端に大きな数、あるいは高精度な数の集計を行う場合はエラーとなってしまいます。そのようなワークロードに対しては、この設定値をoff
にしてCPUで集約演算を実行するよう強制する事ができます。 pg_strom.enable_brin
[型:bool
/ 初期値:on]
- BRINインデックスを使ったテーブルスキャンを有効化/無効化する。
pg_strom.cpu_fallback
[型:enum
/ 初期値:notice
]- GPUプログラムが"CPU再実行"エラーを返したときに、実際にCPUでの再実行を試みるかどうかを制御する。
notice
... メッセージを出力した上でCPUでの再実行を行うon
,true
... メッセージを出力せずCPUでの再実行を行うoff
,false
... エラーを発生させCPUでの再実行を行わないpg_strom.regression_test_mode
[型:bool
/ 初期値:off]
- GPUモデル名など、実行環境に依存して表示が変わる可能性のある
EXPLAIN
コマンドの出力を抑制します。これはリグレッションテストにおける偽陽性を防ぐための設定で、通常は利用者が操作する必要はありません。
オプティマイザに関する設定
pg_strom.gpu_setup_cost
[型:real
/ 初期値:100 * DEFAULT_SEQ_PAGE_COST
]- GPUデバイスの初期化に要するコストとして使用する値。
pg_strom.gpu_tuple_cost
[型:real
/ 初期値:DEFAULT_CPU_TUPLE_COST
]- GPUへ送出する/受け取るタプル一個あたりのコストとして使用する値。
pg_strom.gpu_operator_cost
[型:real
/ 初期値:DEFAULT_CPU_OPERATOR_COST / 16
]- GPUの演算式あたりの処理コストとして使用する値。
cpu_operator_cost
よりも大きな値を設定してしまうと、いかなるサイズのテーブルに対してもPG-Stromが選択されることはなくなる。 pg_strom.enable_partitionwise_gpujoin
[型:bool
/ 初期値:on]
- GpuJoinを各パーティションの要素へプッシュダウンするかどうかを制御する。
pg_strom.enable_partitionwise_gpupreagg
[型:bool
/ 初期値:on]
- GpuPreAggを各パーティションの要素へプッシュダウンするかどうかを制御する。
pg_strom.pinned_inner_buffer_threshold
[型:int
/ 初期値:0
]- GpuJoinのINNER表がGpuScanまたはGpuJoinである場合、処理結果の推定サイズがこの設定値よりも大きければ、結果をいったんCPUに戻すことなく、そのままGPU側に保持した上で、続くGpuJoinのINNERバッファとして使用する。
- 設定値が
0
の場合、本機能は無効となる。
エグゼキュータに関する設定
pg_strom.max_async_tasks
[型:int
/ 初期値:12
]- PG-StromがGPU実行キューに投入する事ができる非同期タスクのGPUデバイス毎の最大値で、GPU Serviceのワーカースレッド数でもあります。
GPUダイレクトSQLの設定
pg_strom.gpudirect_driver
[型:text
]- GPUダイレクトSQLのドライバソフトウェア名を示すパラメータです。
cufile
、nvme-strom
、もしくはvfs
のどれかです。pg_strom.gpudirect_enabled
[型:bool
/ 初期値:on
]- GPUダイレクトSQL機能を有効化/無効化する。
pg_strom.gpu_direct_seq_page_cost
[型:real
/ 初期値:DEFAULT_SEQ_PAGE_COST / 4
]- オプティマイザが実行プランのコストを計算する際に、GPU-Direct SQLを用いてテーブルをスキャンする場合のコストとして
seq_page_cost
の代わりに使用される値。 pg_strom.gpudirect_threshold
[型:int
/ 初期値: 自動]- GPUダイレクトSQL機能を発動させるテーブルサイズの閾値を設定する。
- 初期値は自動設定で、システムの物理メモリと
shared_buffers
設定値から計算した閾値を設定します。 pg_strom.manual_optimal_gpus
[型:text
/ 初期値: なし]- NVMEデバイスやNFS区画など、ストレージ区画ごとに最も近傍と判定されるGPUを手動で設定します。
- 書式は
{<nvmeX>|/path/to/tablespace}=gpuX[:gpuX...]
で、NVMEデバイスまたはテーブルスペースのパスと、その近傍であるGPU(複数可)を記述します。カンマで区切って複数の設定を記述する事も可能です。 - 例:
pg_strom.manual_optimal_gpus = 'nvme1=gpu0,nvme2=gpu1,/mnt/nfsroot=gpu0'
-
<gpuX>
はデバイス番号Xを持つGPUです。
-
<nvmeX>
はローカルのNVME-SSDまたはリモートのNVME-oFデバイスを意味します。
-
/path/to/tablespace
は、テーブルスペースに紐づいたディレクトリのフルパスです。
-
ローカルの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.stats_hint_enabled
[型:bool
/ 初期値:on
]- Arrowファイルがmin/max統計情報を持っており、それを用いて不必要なrecord-batchを読み飛ばすかどうかを制御します。
arrow_fdw.metadata_cache_size
[型:int
/ 初期値:512MB
]- Arrowファイルのメタ情報をキャッシュする共有メモリ領域の大きさを指定します。共有メモリの消費量がこのサイズを越えると、古いメタ情報から順に解放されます。
GPUキャッシュの設定
pg_strom.enable_gpucache
[型:bool
/ 初期値:on
]- 検索/分析系のクエリでGPUキャッシュを使用するかどうかを制御します。
- なお、この設定値を
off
にしてもトリガ関数は引き続きREDOログバッファを更新し続けます。 pg_strom.gpucache_auto_preload
[型:text
/ 初期値:null
]- PostgreSQLの起動直後にGPUキャッシュをロードすべきテーブル名を指定します。
- 書式は
DATABASE_NAME.SCHEMA_NAME.TABLE_NAME
で、複数個のテーブルを指定する場合はこれをカンマ区切りで並べます。 - GPUキャッシュの初回ロードは相応に時間のかかる処理ですが、事前に初回ロードを済ませておく事で、検索/分析クエリの初回実行時に応答速度が遅延するのを避けることができます。
- なお、本パラメータを '*' に設定すると、GPUキャッシュを持つ全てのテーブルの内容を順にGPUへロードしようと試みます。
GPUデバイスに関連する設定
pg_strom.gpu_mempool_segment_sz
[型:int
/ 初期値:1GB
]- GPU Serviceがメモリプール用にGPUメモリを確保する際のセグメントサイズです。
- GPUデバイスメモリの割当ては比較的ヘビーな処理であるため、メモリプールを使用してメモリを使い回す事が推奨されています。
pg_strom.gpu_mempool_max_ratio
[型:real
/ 初期値:50%
]- GPUデバイスメモリのメモリプール用に使用する事のできるデバイスメモリの割合を指定します。
- メモリプールによる過剰なGPUデバイスメモリの消費を抑制し、ワーキングメモリを十分に確保する事が目的です。
pg_strom.gpu_mempool_min_ratio
[型:real
/ 初期値:5%
]- メモリプールに確保したGPUデバイスメモリのうち、利用終了後も解放せずに確保したままにしておくデバイスメモリの割合を指定します。
- 最小限度のメモリプールを保持しておくことにより、次のクエリを速やかに実行する事ができます。
pg_strom.gpu_mempool_release_delay
[型:int
/ 初期値:5000
]- GPU Serviceは、あるメモリプール上のセグメントが空になっても、これを直ちに開放しません。そのセグメントが最後に利用されてから、本パラメータで指定された時間(ミリ秒単位)を経過すると、これを開放してシステムに返却します。
- 一定の遅延を挟む事で、GPUデバイスメモリの割当/解放の頻度を減らす事ができます。
pg_strom.gpuserv_debug_output
[型:bool
/ 初期値:false
]- GPU Serviceのデバッグメッセージ出力を有効化/無効化します。このメッセージはデバッグにおいて有効である場合がありますが、通常は初期値のまま変更しないで下さい。
pg_strom.cuda_visible_devices
[型:text
/ 初期値:null
]- PostgreSQLの起動時に特定のGPUデバイスだけを認識させてい場合は、カンマ区切りでGPUデバイス番号を記述します。
- これは環境変数
CUDA_VISIBLE_DEVICES
を設定するのと同等です。