Amazon Redshiftの同時接続数、クエリ実行数、カーソル数まとめ

2016.03.31

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

本日はよくお問合せいただくRedshiftの同時接続数やクエリ実行数、カーソル数についてまとめてみました。公式マニュアルにある制限と、実際の推奨値や試算方法についても解説します。

最大同時接続数

クラスタに対して同時に接続可能なユーザー数は500です。これといった推奨値が規定されていませんが、経験的には50未満をおすすめします。

Amazon Redshift における制限

クラスタの接続数はマネジメントコンソールのPerformanceタブから参照できます。

redshift-performance-connections-20160331

設計上の制限は500ですが、RedshiftはPostgreSQLと同様に接続毎にプロセスが生成されることをご注意ください。なお、マルチノードクラスタの接続先はリーダーノードへの接続になり、リーダーノードが唯一のエンドポイントになります。シングルポイントになるリーダーノードに対して、無駄な接続や、接続・切断繰り返すなどは避けていただきたいものです。

最大クエリ同時実行数

クラスタに対して同時に可能な最大実行数は50です。Redshiftにクエリを投げるとクエリキューに積まれ、順次実行します。デフォルトのパラメタではデフォルトキューのみ用意され、同時実行数は5に設定されていますので、一般には同時実行数5となります。この同時実行数を増やすには、デフォルトキューの同時実行数を増やす方法と、クエリキューを作って同時実行数を設定する方法があります。各クエリキュー(※1)は、最大で同時実行50に設定できますが、全てのクエリキューの同時実行数の合計が、予約された Superuser キューを除き、50以内となります。

つまり、

クラスタの同時実行数は50 ≧ 全てのクエリキューの合計同時実行数50(Superuserキューを除く)

以下の情報によりますと25を上回ると並列数の増加に伴い性能の低下が見られるようです。

またその裏付けとして、以下のマニュアルにおいても、15 以下が推奨されています。

ベストプラクティスとして、15 以下の同時実行レベルを使用することをお勧めします。クラスターのすべてのコンピューティングノードおよびノードのすべてのスライスは、並列クエリ実行に関与します。同時実行レベルを引き上げると、システムリソースの競合が増え、全体的なスループットが制限されます。

参考:クエリキューの定義

最大同時実行カーソル数

2015年の7月にカーソル数制限が緩和される仕様変更(Amazon Redshift: 気付いたらクラスタの『カーソル数設定』の仕様が変わっていた件)がありましたので、この制限はあまり気にする必要はありません。上記の同時実行クエリ数50がありますので、最大50を超えることはありません。

カーソル数は正確に確認することはできませんが、概算としてはSTV_ACTIVE_CURSORS からクエリごとの利用データサイズを実績として取得し、STV_CURSOR_CONFIGURATION から現在利用可能なデータサイズを算出できます。

(利用可能データサイズ) / (カーソル毎の過去の実績値)

を計算し利用可能なカーソル数を試算することが可能です。

Redshiftは、静的にカーソル数を固定するよりも、並列で利用可能なカーソル数を増加させることを目的として設計されています。

補足:WLM(Work Load Management)

ユースケースに合わせてキューを作成し、キューに対してメモリ(%)やタイムアウト時間、並列実行数などを指定することが可能です。 キューごとにリソース(メモリ)を割り当て、並列して実行することで、長いバッチ実行中にrest apiの応答が全く返ってこないといった問題の改善が期待できます。 一方で利用しない状態でも指定したリソースがキューに割り当てられてしまいますのでご注意ください。

WLMは、ユーザグループ(接続アカウント)とクエリグループ(実行時前後のSQLに対して指定)と2種類存在します。なお、2つの異なる種類のグループに属する場合はユーザグループが優先されます。 このグループ毎にクエリが実行される際の並列度を制御することが可能です。最大で8つのキューを定義することが可能で、全てのキューの並列度の合計は50までとなっています。この8つのキューの1つはデフォルトキューに設定しないといけないため、グループを割り当てることが出来るのは7つとなります。 また、暗黙的に並列度1のSuperuserキュー(クエリグループ)というものが存在します。

最後に

最大同時接続数(500)や最大同時実行カーソル数については、制約はあまり感じないと思います。最大クエリ同時実行数は50ですが、同時実行が多いユースケースではRedshiftの長所が活かされませんので、ショートクエリーとロングクエリーを分けて実行できるようにWLMを設定して、同時実行の効率化や応答遅延の改善をご検討ください。