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_gpusort[型:bool/ 初期値:on]- GPU-Sortによるソートを有効化/無効化する。
- GPU-Sortの詳細は(こちら)[gpusort.md]を参照してください。
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.explain_developer_mode[型:bool/ 初期値:off]- EXPLAIN VERBOSEで表示される様々な情報のうち、開発者向けに有用な情報を表示します。これらは一般ユーザやDB管理者にとっては煩雑な情報であるため、通常は初期値のまま利用する事をお勧めします。
オプティマイザに関する設定
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.pinned_inner_buffer_partition_size[型:int/ 初期値: 自動]- GPU-JoinでPinned Inner Bufferを使用する場合、バッファのサイズがこのパラメータで指定した閾値を越えると、バッファを複数個に分割するよう試みます。このパラメータはGPUメモリの70%~80%程度に自動設定され、通常はユーザが指定する必要はありません。
- 詳しくは(こちら)[operations.md#gpujoininner-pinned-buffer]を参照してください。
pg_strom.extra_ereport_level[型:int/ 初期値: 自動]- heterodb-extraモジュールが報告するエラーのレベルを0~2で指定します。
- 初期値は環境変数
HETERODB_EXTRA_EREPORT_LEVELの値により設定され、未設定の場合は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.cuda_toolkit_basedir[型:text/ 初期値:/usr/local/cuda]- PG-Stromは起動時にCUDA Toolkitを使用してGPUコードをビルドしますが、その際に利用するCUDA Toolkitのインストールパスを指定します。通常は
/usr/local/cuda配下にCUDAツールがインストールされますが、異なるディレクトリを使用する場合は本パラメータを使って設定を変更できます。 pg_strom.cuda_stack_limit[型:int/ 初期値:32]- PG-StromがSQLワークロードをGPUで実行する際、処理の複雑さに応じてGPUスレッドの使用するスタック領域の大きさを自動的に設定します。例えば、PostGIS関数や再帰呼び出しを含む式表現には比較的大きめのスタックを割り当てます。
- このパラメータは、その場合の上限値をkB単位で指定します。
pg_strom.cuda_visible_devices[型:text/ 初期値:null]- PostgreSQLの起動時に特定のGPUデバイスだけを認識させてい場合は、カンマ区切りでGPUデバイス番号を記述します。
- これは環境変数
CUDA_VISIBLE_DEVICESを設定するのと同等です。