Autonomous Databaseの接続サービスとシェアについて

Version 3

    先日、Autonomous Database のシェアの変更機能がリリースしました。

    Autonomous Database 新機能紹介

    What's New for Oracle Autonomous Transaction Processing

    What's New for Oracle Autonomous Data Warehouse

     

    新機能の紹介と、そもそもの「接続サービスとは?」「シェアとは?」について紹介します。

     

     

     

    接続サービスについて

    Autonomous Database では、事前に定義済の接続サービスが用意されています。クライアントからの接続は、基本的にそのサービスを利用してインスタンスに接続します。

     

     

    接続サービスごとの違い

    Autonomous Data Warehouse(以降ADW) では3種類、Autonomous Transaction Processing(以降ATP)では5種類の接続サービスがあります。

    各サービスごとに、パラレル実行・同時実行セッション数・リソース割り当てなどの制御について事前定義されています。そのため、接続サービスごとの違いを認識せずに処理を流すと、「処理が遅い気がする(実はパラレル実行になっていない)」「なぜか同時実行ができない(同時実行セッション数が制限されているサービスに複数セッションをはろうとしている)」ということもありえるので、ワークロードに応じて接続サービスを選択してください

    services.PNG

    (ちなみに私は、どれでもいいケースではとりあえずHIGHを利用しています)

     

     

    シェア (Share) とは

    シェアはリソースの割り当ての優先順位のことです。リソースが逼迫している状況の際に、
    どれにどれだけリソースを割り当てるかをこのシェア=優先順位順に従って、リソースが割り当てられます。

    この制御を行うことで複数の処理が実行されている際に、特定の処理にリソースが専有されて他の処理が

    動けなくなることを防いだり、大事な処理には常にリソースを全体の何割は割り当てられるように、という

    ことができるようになっています。

     

    シェアは接続サービスごとに事前定義されています。イメージとしては下記のような形になります。

    services1.PNG

     

    もう少し詳しく説明すると、これはOracle Databaseの Oracle Resource Managerという機能を利用しています。

    Resource Managerを使用したリソース割り当ての制御するには、コンシューマ・グループという事前定義したセッションのグループに、

    リソース・プラン・ディレクティブというリソースの割り当て方法を定義します。そして、コンシューマ・グループとディレクティブを

    まとめたコンテナ=リソース・プランをアクティブにすることで、定義したリソース制御が動作するようになります。これらの設定・アクティブ化が全て事前設定済なので、ユーザーは用意されている接続サービスを利用するだけ、という状態になっています。

     

    ・マニュアル Oracle Database 18c 管理者ガイド > マルチテナント環境でのOracle Resource Managerの概要

     

    接続サービスの確認方法

    用意されている接続サービスは、下記の方法で確認可能です。

     

    ・コンソールやCLIから接続文字列を確認

    コンソールから確認する場合は、『Autonomous Databaseの詳細』ページの『DB接続』をクリックすると表示されます。

    - ATPの例

    connection.PNG

     

    CLIはいくつか種類がありますが、ocicliでの結果はこちらです。

    - ATPの例

    $ oci db autonomous-database get --autonomous-database-id xxxx --query 'data.{"connection-strings":"connection-strings"}'
    {
      "connection-strings": {
        "all-connection-strings": {
          "HIGH": "adb.ap-tokyo-1.oraclecloud.com:1522/xxxx_atptokyo_high.xxxx",
          "LOW": "adb.ap-tokyo-1.oraclecloud.com:1522/xxxx_atptokyo_low.xxxx",
          "MEDIUM": "adb.ap-tokyo-1.oraclecloud.com:1522/xxxxx_atptokyo_medium.xxxx"
          "TP": "adb.ap-tokyo-1.oraclecloud.com:1522/xxxx_atptokyo_tp.xxxx",
          "TPURGENT": "adb.ap-tokyo-1.oraclecloud.com:1522/xxxx_atptokyo_tpurgent.xxxx"
        },
        "high": "adb.ap-tokyo-1.oraclecloud.com:1522/xxxx_atptokyo_high.xxxx",
        "low": "adb.ap-tokyo-1.oraclecloud.com:1522/xxxx_atptokyo_low.xxxx",
        "medium": "adb.ap-tokyo-1.oraclecloud.com:1522/xxxxx_atptokyo_medium.xxxx"
      }
    }
    

     

    ・Credentialsファイル内の tnsnames.ora に記載

    - ADWの例

    adwtokyo_high   = (description= (address=(protocol=tcps)(port=1522)(host=…
    adwtokyo_medium = (description= (address=(protocol=tcps)(port=1522)(host=…
    adwtokyo_low    = (description= (address=(protocol=tcps)(port=1522)(host=…
    
    

     

    - ATPの例

    atptokyo_tpurgent = (description= (address=(protocol=tcps)(port=1522)(host=…
    atptokyo_tp     = (description= (address=(protocol=tcps)(port=1522)(host=…
    atptokyo_high   = (description= (address=(protocol=tcps)(port=1522)(host=…
    atptokyo_medium = (description= (address=(protocol=tcps)(port=1522)(host=…
    atptokyo_low    = (description= (address=(protocol=tcps)(port=1522)(host=…
    
    

     

    シェア (Share) の変更機能

    そして2019/04の新機能として入ってきたのが、前述したリソース割り当ての優先度のシェアの変更機能です。

     

    どういうケースで用いられるのかというと、接続サービスごとに定義されているのはシェアだけではなく、

    パラレル実行や同時実行セッション数という説明をさせていただきましたが、それらの設定の組み合わせが要件と

    異なる場合、例えば自動パラレル実行で実行したいけれども優先度は低くていいという場合や、

    接続サービスごとのシェアの比率を変えたい場合などが考えられます。

     

    では、シェアの設定の変更をやってみます。ここからはADWのインスタンスを使って説明していきます。

     

    コンソールからの変更

    『Autonomous Databaseの詳細』ページの『サービス・コンソールをクリック』

    1.PNG

    次に、サービス・コンソールで『Administration』タブを選択し、『Set Resource Management Rules』をクリック

    2.PNG

    『CPU/IO Shares』をタブを選択すると、変更画面が表示されるのでシェアの値を入力して『Save changes』をクリックすると変更完了です

    4.PNG

     

    PL/SQLプロシージャでの変更

     

    下記のPL/SQLプロシージャーで、各コンシューマ・グループごとに希望のシェア(shares)の値を入れて、実行します

    - ADWの場合 (HIGH/MEDIUM/LOWの3種類)

    BEGIN
       cs_resource_manager.update_plan_directive(consumer_group => 'HIGH', shares => <シェアの数>);
       cs_resource_manager.update_plan_directive(consumer_group => 'MEDIUM', shares => <シェアの数>);
       cs_resource_manager.update_plan_directive(consumer_group => 'LOW', shares => <シェアの数>);
    END;
    /
    

     

    - ATPの場合 (TPURGENT/TP/HIGH/MEDIUM/LOWの5種類)

    BEGIN
       cs_resource_manager.update_plan_directive(consumer_group => 'TPURGENT', shares => <シェアの数>);
       cs_resource_manager.update_plan_directive(consumer_group => 'TP', shares => <シェアの数>);
       cs_resource_manager.update_plan_directive(consumer_group => 'HIGH', shares => <シェアの数>);
       cs_resource_manager.update_plan_directive(consumer_group => 'MEDIUM', shares => <シェアの数>);
       cs_resource_manager.update_plan_directive(consumer_group => 'LOW', shares => <シェアの数>);
    END;
    /
    
    

     

    シェアの動作を確認してみた

    実際に負荷をかけてみて、接続サービスごとにリソース割り当てが制御されているのか、確認してみましょう。

    今回は、Autonomous Data Warehouseで実施したので、接続サービスは HIGH / MEDIUM / LOW の3種類です。

     

    リソース・プラン・ディレクティブの設定内容は、DBA_RSRC_PLAN_DIRECTIVES で確認可能です。

    plan の値は、ADWが"DWCS_PLAN"、ATPが"OLTP_PLAN"になります。

     

    ・Case 1) デフォルトの設定状態を確認

    SQL> select plan, group_or_subplan name, mgmt_p1, parallel_server_limit, parallel_degree_limit_p1
    from dba_rsrc_plan_directives
    where plan = 'DWCS_PLAN' or plan = 'OLTP_PLAN'
    order by 1,3 desc ;
    
    PLAN       NAME            MGMT_P1 PARALLEL_SERVER_LIMIT PARALLEL_DEGREE_LIMIT_P1
    ---------- ------------ ---------- --------------------- ------------------------
    DWCS_PLAN  HIGH                  4                    50                       10
    DWCS_PLAN  MEDIUM                2                    84                        4
    DWCS_PLAN  LOW                   1                                              1
    DWCS_PLAN  OTHER_GROUPS          1                                              1
    

     

    ちなみに、OTHER_GROUPSというコンシューマ・グループがありますが、これはデフォルトのコンシューマ・グループで、明示的に定義されているコンシューマ・グループを利用しない場合はこのグループにマッピングされます。つまり、接続サービス(TP/TPURGENT/HIGH/MEDIUM/LOW)を利用しているセッション以外(例えば、データベース管理のためにバックグラウンドで動いている処理)は、OTHER_GROUPにマッピングされて実行されるので、クライアントからのトランザクションが動けないことがないようにリソース制御されます。

     

     

    デフォルト設定(High 4 / MEDIUM 2 / LOW 1)で、全サービスに対して処理を流して

    CPU使用率が100%になるような状態にしてみます。

    8core01.PNG

    このように、リソースが逼迫している状況の際に、HIGHには約4割、MEDIUMには約2割、LOWには約1割の

    リソースが割当たっているのが確認できます。

     

     

    では、新機能として入ってきたシェアの変更を実際にやってみます。

    ・Case 2) HIGH 6 / MEDIUM 2 / LOW 1

     

    BEGIN
       cs_resource_manager.update_plan_directive(consumer_group => 'HIGH', shares => 6);
       cs_resource_manager.update_plan_directive(consumer_group => 'MEDIUM', shares => 2);
       cs_resource_manager.update_plan_directive(consumer_group => 'LOW', shares => 1);
    END;
    /
    
    

     

     

    SQL> select plan, group_or_subplan name, mgmt_p1, parallel_server_limit, parallel_degree_limit_p1
    from dba_rsrc_plan_directives
    where plan = 'DWCS_PLAN' or plan = 'OLTP_PLAN'
    order by 1,3 desc ;
    PLAN       NAME            MGMT_P1 PARALLEL_SERVER_LIMIT PARALLEL_DEGREE_LIMIT_P1
    ---------- ------------ ---------- --------------------- ------------------------
    DWCS_PLAN  HIGH                  6                    50                        8
    DWCS_PLAN  MEDIUM                2                    84                        4
    DWCS_PLAN  LOW                   1                                              1
    DWCS_PLAN  OTHER_GROUPS          1                                              1
    
    

     

    処理を流してみると、デフォルトの設定の時とリソースの割り当てられている状態が変わり、

    HIGHに約6割近くもリソースを割り当てられていることがわかると思います。

    8core02.PNG

     

    ・Case 3) HIGH 4 / MEDIUM 4 / LOW 1

    次は、HIGHとMEDIUMを同じ4にしてみます。

     

    BEGIN
       cs_resource_manager.update_plan_directive(consumer_group => 'HIGH', shares => 4);
       cs_resource_manager.update_plan_directive(consumer_group => 'MEDIUM', shares => 4);
       cs_resource_manager.update_plan_directive(consumer_group => 'LOW', shares => 1);
    END;
    /
    
    

     

     

    SQL> select plan, group_or_subplan name, mgmt_p1, parallel_server_limit, parallel_degree_limit_p1
    from dba_rsrc_plan_directives
    where plan = 'DWCS_PLAN' or plan = 'OLTP_PLAN'
    order by 1,3 desc ;
    PLAN       NAME            MGMT_P1 PARALLEL_SERVER_LIMIT PARALLEL_DEGREE_LIMIT_P1
    ---------- ------------ ---------- --------------------- ------------------------
    DWCS_PLAN  HIGH                  4                    50                        8
    DWCS_PLAN  MEDIUM                4                    84                        4
    DWCS_PLAN  LOW                   1                                              1
    DWCS_PLAN  OTHER_GROUPS          1                                              1
    
    

     

    すると、HIGHとMEDIUMでほぼ同じくらいのリソースを使っているのが確認できました。

    8core03.PNG

     

     

    ちなみに、空きリソースがあれば制御されることはないので、

    例えば、MEDIUMのサービスのみを使っていれば、MEDIUMで全てのリソースを使えます。

    あくまでリソースが逼迫している際に制御されます。

     

    8core_medium.PNG

     

    参考リンク

    ・マニュアル Manage CPU/IO shares on Autonomous Transaction Processing

    ・マニュアル Manage CPU/IO shares on Autonomous Data Warehouse

     

    関連リンク

    Oracle Autonomous Data Warehouse Cloud(ADWC):データウェアハウス(DWH)・クラウド - 概要/価格/マニュアル/トライアル/事例