-
2016-02-20 PostgreSQLPostgreSQL チューニングPostgreSQL パラメータ
パラレルクエリ用パラメータの調整方針
パラレルクエリ用パラメータの調整方針
PostgreSQLのパラレルクエリは、PostgreSQL 9.6以降で導入された機能で、1 つのクエリを複数のワーカープロセスで分担して実行して、高速にクエリを処理することを目的とした仕組みです。
本記事では、パラレルクエリ関連の3つの主要パラメータをどのように調整すべきかという観点で方針を整理します。
調整対象のパラメータ
主な調整対象のパラメータは以下の 3 つです。
- max_parallel_workers_per_gather
- max_parallel_workers
- max_worker_processes
各パラメータの基本的な役割や仕組みについては、前回の記事( https://www.insight-ltd.co.jp/tech_blog/postgresql/pg_versionup/956 )でも説明していますので、合わせて参照してください。
本記事では、どのように調整すべきかという観点で解説します。
調整方針の基本的な考え方
パラレルクエリは、適切に使えばクエリ性能を大きく改善できます。しかし、設定次第では、「特定のクエリがパラレルクエリ用のワーカープロセスを作成しすぎてしまう」という問題が発生します。
この場合、
- 一部のクエリが CPU リソースを占有する
- 他のクエリがワーカープロセス不足で、パラレル処理できない
といった影響が出やすくなります。
そのため、パラレルクエリのパラメータは、特定のクエリだけがパラレル処理されないように調整する必要があります。
1. max_parallel_workers と max_worker_processes のバランス
max_parallel_workers と max_worker_processes は、システム全体で使用できるワーカープロセス数の上限に関わるパラメータです。
max_parallel_workers は、パラレルクエリで使用できるワーカー数の全体上限を制御するパラメータです。
max_worker_processes は PostgreSQL が起動できる(パラレルクエリ以外の用途も含む)ワーカープロセス全体の上限を制御するパラメータです。
バックグラウンドワーカーやメンテナンスタスクもこの上限に含まれるため、max_parallel_workers よりもやや大きめに設定する必要があります。
2. max_parallel_workers_per_gather の調整
max_parallel_workers_per_gather は、1 つのクエリ内の Gather ノードおよび Gather Merge ノードが使用できる、パラレルクエリ用ワーカープロセス数の上限を定義するパラメータです。
このパラメータについて大きな値を設定すると、特定のクエリが起動できるワーカープロセス数を独占してしまう可能性があります。
その結果、特定のクエリは高速化されるが、システム全体では高速化されていないという状況につながります。
max_parallel_workers_per_gather を設定する際には
- 小さめの値を設定する
- 実行計画や負荷状況を確認しながら段階的に調整する
といった設定方法が安全です。
CPU の論理コア数やシステム規模にもよりますが、最初は 2 ~ 4 の小さい値を設定し、実行計画や pg_stat_statements でパラレルクエリ用のワーカープロセスの起動状況を確認しながら、調整することが推奨となります。
また、同時にどれくらいのクエリが実行されるのかやパラレルクエリの実行頻度などを踏まえて、max_parallel_workers、max_worker_processes および max_parallel_workers_per_gather をバランスよく設定することが重要です。
3. parallel_setup_cost および parallel_tuple_cost の調整と注意点
パラレルクエリの実行されやすさは、parallel_setup_cost および parallel_tuple_cost パラメータが関連しています。これらは、パラレルクエリに伴うコストを見積もるためのパラメータです。
意図通りにパラレルクエリが実行されない場合には、これらの値を下げることで、パラレルクエリが実行されやすくなります。
パラレルクエリを行いやすくすることの影響としては
- 本来パラレル化に向かない小さなクエリまでパラレル処理される
- パラレルクエリのオーバーヘッドの方が大きくなる(パラレル処理しない方が高速に処理されるものまで、パラレル処理される)
というものが挙げられます。
基本的には parallel_setup_cost および parallel_tuple_cost はデフォルトのままで運用し、どうしてもパラレルクエリが起きにくい、といった場合に調整を検討することが推奨となります。
クエリ単位にパラメータを調整
max_parallel_workers_per_gather は、SQL 実行前に SET コマンドで一時的に変更することも可能です。
下記に SET コマンドの例を記載します。
SET max_parallel_workers_per_gather = 4;
この方法を使えば、特定のクエリだけパラレルクエリの並列度を調整することができます。
すべてのクエリに対して一律の設定を行うのではなく、必要に応じてクエリ単位で制御するのも、高速化を実現するために有効な手段となります。
まとめ
以上が、パラレルクエリ用パラメータの調整方針となります。
パラレルクエリは強力な機能ですが、パラメータ設定次第では効果がでないことや、システム遅延の原因となる可能性もあります。
繰り返しとなりますが、基本的には特定のクエリがワーカープロセス数を独占しないようにする(max_parallel_workers_per_gather を大きくしすぎない)ことと、必要に応じてクエリ単位で調整すること、が推奨の調整方法となります。