Amazon Redshiftの同時接続数、クエリ実行数、カーソル数まとめ
本日はよくお問合せいただくRedshiftの同時接続数やクエリ実行数、カーソル数についてまとめてみました。公式マニュアルにある制限と、実際の推奨値や試算方法についても解説します。
最大同時接続数
クラスタに対して同時に接続可能なユーザー数は500です。これといった推奨値が規定されていませんが、経験的には50未満をおすすめします。
クラスタの接続数はマネジメントコンソールのPerformanceタブから参照できます。
設計上の制限は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を設定して、同時実行の効率化や応答遅延の改善をご検討ください。