PostgreSQLのリソース使用キュー管理と負荷分離のためのAnalyticDB

背景

データベースのインスタンスの場合は、CPUとメモリのリソースが限られており、それらのリソースを大幅にデータベースクエリのパフォーマンスに影響を与えることができます。したがって、データベースの負荷がある程度高い場合に、より低い全体的なクエリのパフォーマンスが得られ、各個々のクエリのうちCPUリソースとメモリリソースについて競合してもよいです。これは、これらの遅延に敏感なビジネスのために、状況は耐え難いです。PostgreSQL用AnalyticDB(ADB PGと記す)には、キュー--resourceシステムリソースの負荷の管理ツールを提供します。ユーザーは、自身の事業に応じて、指定されたデータベースが実行できる同時クエリの数は、あなたが使用することができ、各クエリのメモリサイズ、およびCPUリソースを使用することができます。これは、クエリが期待に沿っにおけるクエリのパフォーマンスを、その結果、システムリソースを期待していることを保証します。

リソースキュー管理と負荷のアイソレーションを使用します

このセクションでは、ADB PGでリソースキューを作成して使用する方法について説明します。

リソースのキューを作成します。

次のように作成されたリソースキュー内のPGのための構文ADB

CREATE RESOURCE QUEUE name WITH (queue_attribute=value [, ... ])

    ACTIVE_STATEMENTS=integer
        [ MAX_COST=float [COST_OVERCOMMIT={TRUE|FALSE}] ]
        [ MIN_COST=float ]
        [ PRIORITY={MIN|LOW|MEDIUM|HIGH|MAX} ]
        [ MEMORY_LIMIT='memory_units' ]

 | MAX_COST=float [ COST_OVERCOMMIT={TRUE|FALSE} ]
        [ ACTIVE_STATEMENTS=integer ]
        [ MIN_COST=float ]
        [ PRIORITY={MIN|LOW|MEDIUM|HIGH|MAX} ]
        [ MEMORY_LIMIT='memory_units' ]

これは、ACTIVE_STATEMENTSある時点で最もアクティブなクエリ(実行されたクエリ)の数を指定したリソースキューを。MEMORY_LIMIT単一のコンピューティングノード(セグメント)上のクエリまで使用可能なすべてのメモリのセットのリソース・キュー・サイズ、単位はKB、MBまたはGB、デフォルト値は-1であり、制限なしであってもよいです。MAX_COSTは、クエリオプティマイザのコストは、クエリのPG推定コストのためにADBを指す最大リソースキュー照会コストを設定し、デフォルト値は-1、制限なしです。COST_OVERCOMMITのパラメータはMAX_COSTパラメータが設定されている場合はtrue COST_OVERCOMMITは、MAX_COSTであるがアイドルシステムで実行することができるよりも、クエリ、クエリが大きくコストことを示し、いつそれが偽である場合、その後、そのクエリは、それらクエリのMAX_COSTより大きい費用手段、MAX_COSTパラメータに関連しますそれは拒否されます。MIN_COSTは、クエリがMIN_COSTクエリよりも少ないコストと、最小のクエリコストリソースキューを設定しますが、すぐに実行されるように並んで待つことはありません。PRIORITYの設定の優先順位は、優先度の高いリソースキュー問い合わせは、優先順位を指定しない場合、デフォルトはMEDIUMである、実施のためのより多くのCPUリソースを割り当てることになります。

とき、リソースキュー、ACTIVE_STATEMENTS MAX_COSTと指定しなければならないパラメータを作成。

  • あなたは、クエリの数にリソースキューを作成するときに、ユーザーが同時に実行できるリソースのキューを指定することができます

    CREATE RESOURCE QUEUE adhoc WITH (ACTIVE_STATEMENTS=3);

    ここではアドホックと呼ばれるリソースキュー。時間内に与えられた点では、ユーザ、高々、3つだけのクエリの実行このリソース・キューを作成しました。ユーザーが新しいクエリを開始した場合は、前のクエリが終了するまで、クエリが待機状態になります。

  • あなたは、リソースのキューを作成するときに使用するクエリで、このリソースキューのメモリ制限を指定することができます

    CREATE RESOURCE QUEUE myqueue WITH (ACTIVE_STATEMENTS=20, MEMORY_LIMIT='2000MB');

    ここでは、メモリサイズの2000メガバイトまでのリソースキューで使用することができ、このクエリでMYQUEUEすべての名前付きリソースのキューを作成しました。各クエリのMYQUEUEこのリソース・キューはメモリの2000メガバイト/ 20 = 100メガバイトを取り上げるための実装の過程で、これらのクエリの各々は、計算ノード(セグメント)にMEMORY_LIMIT / ACTIVE_STATEMENTSメモリを取ります。いくつかのクエリのためのクエリが使用可能な別のメモリサイズを必要とする場合、使用することができstatement_mem設定するには、しかしMEMORY_LIMITとのリソースキューを超えないことを確認する必要がありmax_statement_memを例としては、次のとおりです:

    SET statement_mem='1GB';
    SELECT * FROM test_adbpg WHERE col='adb4pg' ORDER BY id;
    RESET statement_mem;
  • プライオリティキューを設定して
    異なるリソースキュー優先度には、CPUリソースを使用して、リソースキュークエリを制御するように設定することができます。例えば、同時クエリの大規模システムでは、リソース・キュー・クエリは、このように高い優先順位を確保し、低優先順位リソースキュークエリよりも多くのCPUリソースを使用する高い優先度がより完全にCPUを照会するとき実行するためのリソース。リソースキュープライオリティキューの設定やあなたが変更される文で...作成時に作成した後に変更使用することができます。例としては、次のとおりです:

    CREATE RESOURCE QUEUE executive WITH (ACTIVE_STATEMENTS=3, PRIORITY=MAX);
    
    ALTER RESOURCE QUEUE adhoc WITH (PRIORITY=LOW);
    ALTER RESOURCE QUEUE reporting WITH (PRIORITY=HIGH);

異なるメカニズムと優先順位とACTIVE_STATEMENTS MEMORY_LIMITは、次のとおりです。ACTIVE_STATEMENTSとMEMORY_LIMITは、クエリの実行前に実行することを許可するかどうかを判断します。クエリが開始された後、優先順位メカニズムは、システムの動作状態を動的優先度キューの割り当てに従って、それに利用できる対応するCPUリソースを照会します。例えば、PGのためのいくつかのポイントADBで、その後いくつかの優先度の低いクエリの実行、PGのためのADBへの優先度の高い照会および実行する準備があります。だから、ADBは、PGのクエリは、CPUのためのより多くのリソースを割り当て、CPUリソースに優先度の低いクエリを低減するために。次のようにCPUリソース割り当て規則は、次のとおり一貫した同じ優先クエリがCPUリソースに割り当てることができます。システムはまた、高中、低優先度のクエリで利用可能である場合、優先度の高いクエリ分配システムは、CPUリソースの90%を取得し、残りの10%の中、低優先度のクエリのために予約されたとき分布は、そのシステムのCPUリソースの10%が、優先クエリはCPUリソースの90%、残りの10%が得られた低優先クエリであろう。

リソースキューが作成された後、システムはgp_toolkit.gp_resqueue_statusリミットの設定を使用することができると、次のように、リソース・キューの現在の状態を表示します。

postgres=> SELECT * from gp_toolkit.gp_resqueue_status WHERE
postgres->   rsqname='adhoc';
 queueid | rsqname | rsqcountlimit | rsqcountvalue | rsqcostlimit | rsqcostvalue | rsqmemorylimit | rsqmemoryvalue | rsqwaiters | rsqholders
---------+---------+---------------+---------------+--------------+--------------+----------------+----------------+------------+------------
   19283 | adhoc   |             3 |             0 |           -1 |            0 |             -1 |              0 |          0 |          0
(1 行记录)

また、リソースキューはトランザクションブロック内で作成することができません。

postgres=> begin;
BEGIN
postgres=> CREATE RESOURCE QUEUE test_q WITH (ACTIVE_STATEMENTS=3, PRIORITY=MAX);
ERROR:  CREATE RESOURCE QUEUE cannot run inside a transaction block

いないすべてのSQLは、リソースキュー制限されますresource_select_onlyが上、場合にのみ、SELECT INTOを選択して、CREATE TABLE ASをするように設定されている SELECT、およびカーソルはDECLARE 制約されます。resource_select_onlyは、リソースを管理するためのキューになるとき、INSERT、UPDATE、およびDELETEオフになっています。PGのためADBでは、resource_select_onlyデフォルトの設定ではオフになって。

リソースキューに割り当てられた役割

リソースキューを作成した後、我々は、リソースキューに1人以上のユーザーを割り当てる必要があり、したがって、このリソースキューリソース管理には、ユーザーのクエリになります。ユーザーがリソースのキューを割り当てるかを指定するために表示されない場合は、PGのためADBは、リソースのキューをpg_defaultために彼を割り当てるためにデフォルト設定されます。pg_defaultは500アクティブクエリを実行することができ、制限なしのコスト制限、媒体のための優先順位はありません。

postgres=> SELECT * from gp_toolkit.gp_resqueue_status WHERE rsqname='pg_default';
 queueid |  rsqname   | rsqcountlimit | rsqcountvalue | rsqcostlimit | rsqcostvalue | rsqmemorylimit | rsqmemoryvalue | rsqwaiters | rsqholders
---------+------------+---------------+---------------+--------------+--------------+----------------+----------------+------------+------------
    6055 | pg_default |           500 |             1 |           -1 |          126 |             -1 |   2.096128e+09 |          0 |          1
(1 行记录)

次のようにリソースキューの構文に割り当てられた役割は次のとおりです。

ALTER ROLE name RESOURCE QUEUE queue_name;
CREATE ROLE name WITH LOGIN RESOURCE QUEUE queue_name;

ユーザーは、役割を作成した後に役割を作成するとき、あなたはリソースのキューを割り当てることができ属するリソースキューを変更することができます。いつでも役割が唯一のリソースキューに帰することができることに留意すべきです。

リソースキューの所有権の役割を削除するには

役割は、あなたが使用することができ、我々は指定されたresouceキューの役割を削除し、このresouceキューpg_default戻す必要があるときに、resouceキューに属している必要があります

ALTER ROLE role_name RESOURCE QUEUE none;

リソースキュー設定を変更します。

リソースキューは一度作成次のように、あなたは、変更するリソースキューリソース割当リソースキューを使用することができます。

修改活跃的查询数:
ALTER RESOURCE QUEUE adhoc WITH (ACTIVE_STATEMENTS=5);
修改resource queue优先级:
ALTER RESOURCE QUEUE exec WITH (PRIORITY=MAX);
修改resource queue内存和计划代价约束:
ALTER RESOURCE QUEUE adhoc WITH (MAX_COST=-1.0, MEMORY_LIMIT='2GB');

リソースキューを削除します。

resouceキューを削除する前に、我々は、このリソースキューが割り当てられていないその役割を確認する必要があり、そして何のお問い合わせは、待機状態ではありません。そうでない場合、削除は成功しません。

DROP RESOURCE QUEUE name;

参考資料

https://gp-docs-cn.github.io/docs/ref_guide/sql_commands/CREATE_RESOURCE_QUEUE.html
http://gpdb.docs.pivotal.io/43330/admin_guide/workload_mgmt.html#topic9

おすすめ

転載: yq.aliyun.com/articles/709443