はじめに
リソースプールは、あらかじめ用意されている定義済みのリソースプール以外に、任意にプールを作成し、特定のユーザにリソースを割り当てることができます。※リソースプールについては、以下の記事をご参照ください。
Verticaのリソース管理について
定義済みリソースプールの種類
例えば営業用ユーザの処理が他の処理と競合してクエリがキューに入ることを防ぐために、営業用ユーザに対しプールを作成し、優先的にリソースを割り当てることができます。
これにより営業用ユーザは常に専用のプールが使用できるためリソースの競合を防ぐことができます。
ユーザ定義のリソースプールを作成する
ユーザ定義のリソースプールはCREATE RESOURCE POOL文にて作成することができます。
1 2 3 4 5 6 7 8 9 |
//構文 CREATE RESOURCE POOL <プール名> <パラメータ名> <設定内容>; //例)想定されるクエリの同時実行数は「5」、ただしピーク時以外は同時実行数は「4」を想定。 // また、クエリの実行には最低「1G」のメモリを割り当て、 // CPU/IO帯域のリソースを他のプールより優先させたい場合 dbadmin=> CREATE RESOURCE POOL eigyo_pool dbadmin-> MEMORYSIZE '4G' PLANNEDCONCURRENCY 4 MAXCONCURRENCY 5 dbadmin-> RUNTIMEPRIORITY HIGH; |
各パラメータの意味
パラメータ名 | 説明 |
---|---|
MEMORYSIZE | 予約済みのメモリサイズです。 指定しない場合(0%)は、必要になった時点でGENERALプールから必要な メモリ リソースを借ります。 |
PLANNEDCONCURRENCY | プールに対して想定されるクエリ実行数です。 デフォルト値は1ノード当たりのCPUコア数です。 本パラメータは1セッションあたりのメモリの初期割当サイズを決定するために 使用されます。 |
MAXCONCURRENCY | 同時実行処理の最大数です。 同時実行数が本パラメータの設定値を超えた場合、以降の処理はキュー(待ち状態)に 入ります。 |
RUNTIMEPRIORITY | CPU / IO帯域の優先度です。デフォルトはMEDIUMです。 (有効値:HIGH、MEDIUM、LOW) 処理を実行する際に割り当てられるCPU / IO帯域の優先度を決定するために 使用されます。 |
※上記は用意されているパラメータの一部です。
パラメータの詳細については、以下のマニュアルをご参照ください。
CREATE RESOURCE POOL
上述の例では、ピーク時以外は同時実行数は「4」で想定しているため、 PLANNEDCONCURRENCYは「4」、MEMORYSIZEは「4G」にします。これにより、1セッション当たりのメモリの初期割当サイズは1GBとなります。
また、MAXCONCURRENCYは「5」に設定されているため、eigyo_poolは5つ目のクエリも受け入れます。ただし、eigyo_poolのメモリリソースがすでにいっぱいの場合は、GENERALプールのリソースを使用します。
このように、 PLANNEDCONCURRENCYよりMAXCONCURRENCYの値を大きくすることで、ピーク時以外(同時実行数が4以下)にeigyo_poolが必要以上にリソースを確保することを防ぐことができます。
もし、同時クエリ実行数が6になった場合は、6つ目のクエリはキューに入り、他のクエリが完了するのを待ちます。タイムアウト時間(Queue Timeout)を超えてもキューにいる場合は、該当クエリはタイムアウトになります。
※デフォルトのタイムアウト時間は300秒です。
なお、RUNTIMEPRIORITYを「HIGH」に設定しているため、 CPU/IO帯域のリソースが優先的に割り当てられます。
eigyo_poolを使用するユーザからの同時クエリ実行数が6の場合のリソースプール使用イメージ
作成したリソースプールを任意のユーザに割り当てる
リソースプールは、CREATE USER文またはALTER USER文でユーザに割り当てることができます。
1 2 3 4 5 |
//例)eigyo_poolプールをeigyo_userユーザに割り当てる場合 //CREATE USER文 dbadmin=> CREATE USER eigyo_user RESOURCE POOL eigyo_pool; //ALTER USER文 dbadmin=> ALTER USER eigyo_user RESOURCE POOL eigyo_pool; |
作成したリソースプールには、複数のユーザを割り当てることができますが、ひとつのユーザに対して複数のリソースプールを割り当てることはできません。
ユーザに割り当てられたリソースプールを確認する
ユーザに割り当てられたリソースプールは、USERSシステムテーブルにて確認することができます。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 |
//例)eigyo_userに割り当てられているプールを確認する場合 dbadmin=> SELECT * FROM users WHERE user_name ='eigyo_user'; -[ RECORD 1 ]---------+-------------------------------------------------- user_id | 45035996273707624 user_name | eigyo_user is_super_user | f profile_name | default is_locked | f lock_time | resource_pool | eigyo_pool //eigyo_poolが割り当てられている memory_cap_kb | unlimited temp_space_cap_kb | unlimited run_time_cap | unlimited max_connections | unlimited connection_limit_mode | database idle_session_timeout | unlimited all_roles | default_roles | search_path | "$user", public, v_catalog, v_monitor, v_internal ldap_dn | ldap_uri_hash | 0 is_orphaned_from_ldap | f |