プライマリ・コンテンツに移動
Oracle® Call Interfaceプログラマーズ・ガイド
12c リリース1 (12.1)
B72465-07
目次へ移動
目次
索引へ移動
索引

前
次

F マルチスレッドextprocエージェント

マルチスレッドextprocエージェントについて説明します。

この付録では、マルチスレッドextprocエージェンの概要、これを使用した分散データベース・システム全体の効率向上、およびその管理方法について説明します。

マルチスレッドextprocエージェントを使用する理由

この項では、マルチスレッドextprocエージェントを使用して外部プロシージャの効率を向上する方法について説明します。

専用エージェント・アーキテクチャの問題

デフォルトでは、extprocエージェントはユーザー・セッションごとに起動され、extprocエージェント・プロセスはユーザー・セッションの終了時にのみ終了します。

このアーキテクチャでは大量のシステム・リソースが不必要に消費されることがあります。たとえば、数千のユーザー・セッションで同時にextprocエージェント・プロセスが生成されるとします。extprocエージェント・プロセスは各セッションに対して起動されるので、数千のextprocエージェント・プロセスが同時に実行されます。extprocエージェント・プロセスは、各extprocエージェント・プロセスが特定の時点でアクティブであるかどうかにかかわらず、すべて実行されます。したがって、extprocエージェント・プロセスおよびオープン接続で、過度のシステム・リソースが消費される可能性があります。セッションをOracle Databaseに接続する場合、この問題はサーバーを共有サーバー・モードで起動することで対応できます。共有サーバー・モードでは、少数のサーバー・プロセスによるデータベース接続の共有が可能です。

マルチスレッドの利点

Oracle Database共有サーバーのアーキテクチャでは、数千のユーザー・セッションがオープンである場合でも、常にこれらの接続の一部のみがアクティブであると想定されます。共有サーバー・モードでは、共有・サーバー・プロセスのプールが存在します。ユーザー・セッションは、キュー内に要求されたタスクを配置するディスパッチャ・プロセスに接続されます。これらのタスクは、最初に使用可能な共有サーバー・プロセスで取り出されます。共有サーバー・プロセスの数は、通常、ユーザー・セッションの数よりも少ないです。

マルチスレッドextprocエージェントは、外部プロシージャへの接続にも同様の機能を提供します。マルチスレッドextprocエージェントのアーキテクチャでは、共有エージェント・スレッドのプールが使用されます。ユーザー・セッションで要求されたタスクはキューに配置され、最初に使用可能なマルチスレッドextprocエージェント・スレッドによって取り出されます。一部のユーザー接続のみが常にアクティブなため、マルチスレッドextprocアーキテクチャでは、システム・リソースがより効率的に使用されます。

マルチスレッドextprocエージェントのアーキテクチャ

外部プロシージャに接続する前に、システム識別子(SID)ごとに1つのマルチスレッドextprocエージェントを起動する必要があります。これは、エージェント制御ユーティリティagtctlを使用して行います。このユーティリティは、エージェントの構成および停止にも使用します。

システムで稼働している各Oracle Netリスナーで、一連のSIDの着信接続要求がリスニングされます。着信Oracle Net接続文字列内のSIDがリスナーのリスニング対象のSIDである場合、リスナーでこの接続が処理されます。さらに、マルチスレッドextprocエージェントがそのSIDに対して起動されている場合、リスナーはリクエストをそのextprocエージェントに渡します。

マルチスレッドextprocエージェントのアーキテクチャでは、各着信接続要求が各種スレッドで処理されます。

  • 単一のモニター・スレッド。モニター・スレッドには次の役割があります。

    • リスナーとの通信のメンテナンス。

    • プロセス上のロードの監視。

    • 必要な場合にスレッドの開始および停止。

  • 複数のディスパッチャ・スレッド。ディスパッチャ・スレッドには次の役割があります。

    • Oracle Databaseとの通信の処理。

    • タスク要求をタスク・スレッドに渡す。

  • 複数のタスク・スレッド。タスク・スレッドでは、Oracle Databaseプロセスからの要求が処理されます。

図F-1に、マルチスレッドextprocエージェントのアーキテクチャを示します。ユーザー・セッション1と2で、いくつかのDLLへのコールアウト要求が発行されます。これらの要求は、異種サービスを通してマルチスレッドextprocエージェントにサービスされます。これらの要求は、エージェントのディスパッチャ・スレッドで処理された後、タスク・スレッドに渡されます。要求を実際に処理するタスク・スレッドは、それぞれのDLLをロードし、そこで関数を呼び出します。

  • ユーザー・セッションからの要求はすべて、同じディスパッチャ・スレッドによって処理されます。たとえば、ユーザー・セッション1との通信はディスパッチャ1が処理し、ユーザー・セッション2との通信はディスパッチャ2が処理します。これは、セッションの存続期間を通じて同じです。

  • 各要求は、異なるタスク・スレッドでサービスできます。たとえば、タスク・スレッド1でユーザー・セッション1からの要求が処理された後、ユーザー・セッション2からの要求を処理できます。   

関連項目:

外部プロシージャ用のプロセスの管理方法の詳細は、『Oracle Database管理者ガイド』を参照してください

図F-1 マルチスレッドextprocエージェントのアーキテクチャ

図F-1の説明は次にあります
「図F-1 マルチスレッドextprocエージェントのアーキテクチャ」の説明

これら3つのスレッド・タイプは、概してOracle Databaseマルチスレッド・サーバーPMON、ディスパッチャおよび共有サーバー・プロセスにそれぞれ対応します。

注意:

ユーザー・セッションからの要求はすべて同じディスパッチャ・スレッドで処理されますが、異なるタスク・スレッドでサービス可能です。また、複数のタスク・スレッドで同じ外部プロシージャ接続を使用することもできます。

次のトピックで、これらのスレッドの詳細を説明します。

モニター・スレッド

エージェント制御ユーティリティagtctlは、あるSIDに対してマルチスレッドextprocエージェントを起動する際、監視スレッドを作成します。モニター・スレッドは次の関数を実行します。

  • ディスパッチャ・スレッドおよびタスク・スレッドを作成します。

  • このextprocエージェントへの接続を処理するすべてのリスナーとともにディスパッチャ・スレッドを登録します。このSIDのディスパッチャが稼働している間、着信接続の取得時にリスナーでプロセスは開始されません。かわりに、リスナーからこの同じディスパッチャへの接続が与えられます。

  • その他のスレッドを監視し、ディスパッチャ・スレッドに関するロード情報をこのextprocエージェントへの接続を処理するすべてのリスナー・プロセスに送信し、リスナーから最も少ないロードのディスパッチャに着信接続が与えられるようにします。

  • 作成した各スレッドの監視を続行します。

ディスパッチャ・スレッド

ディスパッチャ・スレッドは次の関数を実行します。

  • Oracle Databaseサーバーからの着信接続およびタスク要求を受け入れます。

  • タスク・スレッドによる取出しのために着信要求をキューに配置します。

  • 要求の発行先サーバーに要求の結果を送信します。

    注意:

    ユーザー・セッションでディスパッチャとの接続が確立された後は、ユーザー・セッションからの要求はそのユーザー・セッションが終了するまですべて同じディスパッチャで処理されます。

タスク・スレッド

タスク・スレッドは次の関数を実行します。

  • キューから要求を取り出します。

  • 必要な操作を実行します。

  • ディスパッチャによる取出しのために結果をキューに配置します。

マルチスレッドextprocエージェントの管理

外部プロシージャに接続する前に、システム識別子(SID)ごとに1つのマルチスレッドextprocエージェントを起動する必要があります。

マルチスレッドextprocエージェントは、lsnrctlと同様に機能する、agtctlと呼ばれるエージェント制御ユーティリティによって起動、停止および構成されます。ただし、構成ファイル(listener.ora)を読み取るlsnrctlとは異なり、agtctlはコマンドラインから構成情報を取り出し、制御ファイルに書き込みます。

agtctlを起動する前に、Oracle Listenerが稼働していることを確認してください。その後、例F-1に示すように、agtctlを使用してagtctl構成パラメータを設定し(デフォルト値を使用しない場合)、agtctlを起動します。

agtctlコマンドは、単一行コマンド・モードかシェル・モードのいずれでも使用できます。

トピック:

例F-1 構成パラメータの設定およびagtctlの起動

agtctl set max_dispatchers  2 ep_agt1
agtctl set tcp_dispatchers  1   ep_agt1
agtctl set max_task_threads 2  ep_agt1
agtctl set max_sessions     5 ep_agt1
agtctl unset listener_address ep_agt1
agtctl set listener_address "(address=(protocol=ipc)(key=extproc))" ep_agt1
agtctl startup extproc ep_agt1

エージェント制御ユーティリティ(agtctl)コマンド

表F-1に示す各コマンドを使用して、agtctlの起動や停止、および制御ファイルの作成やメンテナンスができます。

表F-1 エージェント制御ユーティリティ(agtctl)コマンド

コマンド 説明

startup

マルチスレッドextprocエージェントを起動します。

shutdown

マルチスレッドextprocエージェントを停止します。

set

マルチスレッドextprocエージェントの構成パラメータを設定します。

unset

パラメータのデフォルト値に戻します。

show

構成パラメータの値を表示します。

delete

制御ファイルから特定のSIDのエントリを削除します。

exit

シェル・モードを終了します。

help

使用可能なコマンドを示します。

これらのコマンドは、次の2つの方法で発行できます。

  • コマンドはUNIXまたはDOSシェルから発行できます。このモードは単一行コマンド・モードと呼ばれます。

  • agtctlと入力すると、AGTCTL>プロンプトが表示されます。その後、agtctlシェル内でコマンドを入力できます。このモードはシェル・モードと呼ばれます。

agtctlコマンドの構文およびパラメータは、どのモードで発行されるかによって異なります。

注意:

  • コマンドはすべて大/小文字が区別されます。

  • agtctlユーティリティでは、制御ファイルが2つの環境変数AGTCTL_ADMINまたはTNS_ADMINのいずれかで指定されるディレクトリ内に配置されます。これらの環境変数のうち最低いずれか1つが設定されており、エージェントによりアクセスされるディレクトリが指定されていることを確認してください。

  • マルチスレッドextprocエージェントで環境変数の設定が必要な場合、またはエージェントが専用モードで機能するようにするためにlistener.oraエントリを構成する際にENVSパラメータを使用した場合、すべての必要な環境変数をagtctlユーティリティを実行するUNIXまたはDOSシェルで設定する必要があります。

単一行コマンド・モードでのagtctlの使用について

この項では、agtctlコマンドの使用方法について説明します。

これらは単一行コマンド・モードで示されます。

マルチスレッドextprocエージェントの構成パラメータの設定

エージェントを起動する前にマルチスレッドextprocエージェントの構成パラメータを設定します。構成パラメータが特に設定されていない場合、デフォルト値が使用されます。構成パラメータおよび各デフォルト値を表F-2に示します。

setコマンドを使用して、マルチスレッドextprocエージェントの構成パラメータを設定します。

構文

agtctl set parameter parameter_value agent_sid

parameterは設定するパラメータです。

parameter_valueはそのパラメータに割り当てられている値です。

agent_sidはこのエージェントでサービスされるSIDです。これは、単一行コマンド・モードで指定する必要があります。

agtctl set max_dispatchers 5 salesDB

マルチスレッドextprocエージェントの起動

マルチスレッドextprocエージェントを起動するにはstartupコマンドを使用します。

構文

agtctl startup extproc agent_sid

agent_sidはマルチスレッドextprocエージェントでサービスされるSIDです。これは、単一行コマンド・モードで指定する必要があります。

agtctl startup extproc salesDB

マルチスレッドextprocエージェントの停止

マルチスレッドextprocエージェントを停止するにはshutdownコマンドを使用します。3つの停止方法があります。

  • 通常(デフォルト)

    agtctlから、マルチスレッドextprocエージェントが自動的に正常に停止するように指定されます。すべてのセッションで現行の操作が完了し、停止します。

  • 即時

    agtctlから、マルチスレッドextprocエージェントが即時に停止するように要求されます。現行のセッションの状態に関係なく、エージェントが即時に終了します。

  • 異常終了

    マルチスレッドextprocエージェントに指示を送ることなく、agtctl側でシステム・コールを発行して停止します。

構文

agtctl shutdown [immediate|abort] agent_sid

agent_sidはマルチスレッドextprocエージェントでサービスされるSIDです。この指定は、単一行コマンド・モードでは必須です。

agtctl shutdown immediate salesDB

構成パラメータの値の確認

構成パラメータの値を確認するにはshowコマンドを使用します。

構文

agtctl show parameter agent_sid

parameterは確認するパラメータです。

agent_sidはマルチスレッドextprocエージェントでサービスされるSIDです。これは、単一行コマンド・モードで指定する必要があります。

agtctl show max_dispatchers salesDB

デフォルト値への構成パラメータのリセット

unsetコマンドを使用して、構成パラメータをデフォルト値にリセットできます。

構文

agtctl unset parameter agent_sid

parameterはリセット(または変更)するパラメータです。

agent_sidはマルチスレッドextprocエージェントでサービスされるSIDです。この指定は、単一行コマンド・モードでは必須です。

agtctl unset max_dispatchers salesDB

制御ファイルからの特定のSIDのエントリの削除

deleteコマンドを使用して、制御ファイルから特定のSIDのエントリを削除できます。

構文

agtctl delete agent_sid

agent_sidは削除するSIDエントリです。

agtctl delete salesDB

ヘルプの表示

agtctlの使用可能なコマンド・リストを表示したり、特定のコマンドの構文を確認したりするにはhelpコマンドを使用します。

構文

agtctl help [command]

commandは構文を表示するコマンドの名前です。デフォルトはすべてのagtctlコマンドです。

agtctl help set

シェル・モード・コマンドの使用

AGTCTL>コマンドを発行すると、プロンプトAGTCTL>が表示されます。

シェル・モードで、次を入力してagtctlを起動します。

agtctl

その後はagtctlシェルからコマンドを発行するため、コマンド文字列に接頭辞agtctlを付ける必要はありません。

次を入力してエージェントのSIDの名前を設定します。

AGTCTL> set agent_sid agent_sid

agent_sid値が変更されるまで、後続のコマンドではすべて指定のSIDに対するものであると想定されます。単一行コマンド・モードとは異なり、コマンド文字列でagent_sidは指定しません。

次のようにエラー・メッセージの言語を設定できます。

AGTCTL> set language language

コマンド自体は単一行コマンド・モードのものと同じです。シェル・モードを終了するには、exitを入力します。

次にシェル・モードのコマンドの例を示します。

例: 構成パラメータの設定

この例では、shutdown_address構成パラメータの値を設定します。

AGTCTL> set shutdown_address (address=(protocol=ipc)(key=oraDBsalesDB))

例: マルチスレッドextprocエージェントの起動

この例では、マルチスレッドextprocエージェントを起動します。

AGTCTL> startup extproc

マルチスレッドextprocエージェント制御の構成パラメータ

マルチスレッドextprocエージェント制御の構成パラメータの機能について説明します。

表F-2に、エージェント制御ユーティリティの構成パラメータおよび各デフォルト値を示します。

表F-2 agtctlの構成パラメータ

パラメータ 説明 デフォルト値

max_dispatchers

最大ディスパッチャ数。

1

tcp_dispatchers

TCPをリスニングしているディスパッチャの数(残りはIPCを使用)。

0

max_task_threads

最大タスク・スレッド数。

2

max_sessions

タスク・スレッドごとの最大セッション数。

5

listener_address

リスナーがリスニングしているアドレス(登録に必要)。

(ADDRESS_LIST=
    (ADDRESS=
        (PROTOCOL=IPC)
        (KEY=PNPKEY))
    (ADDRESS=
        (PROTOCOL=IPC)
        (KEY=listener_sid))
    (ADDRESS=
        (PROTOCOL=TCP)
        (HOST=127.0.0.1)
        (PORT=1521)))

注意: listener_sidは、リスナーがリスニングしているOracle Database上のアドレスのIPCキーです。

shutdown_address

エージェントでリスナーとの通信に使用されるアドレス。これは、agtctlからの停止メッセージを含め、エージェントですべての通信がリスニングされるアドレスです。

(ADDRESS=
    (PROTOCOL=IPC)
    (KEY=listener_sid || agent_sid))
(ADDRESS=
    (PROTOCOL=TCP)
    (HOST=127.0.0.1)
    (PORT=1521))

注意:

  • agent_sidはマルチスレッドextprocエージェントのSIDです。

  • ||は、listener_sidおよびagent_sidが1つの文字列に連結されることを示します。

max_dispatchers、tcp_dispatchers、max_task_threadsおよびmax_sessions

パフォーマンスを向上させるために、max_dispatcherstcp_dispatchersmax_task_threadsおよびmax_sessionsパラメータの一部あるいはすべての値を変更する必要がある場合があります。

max_dispatcherstcp_dispatchersmax_task_threadsの最適な値は次の式を使用して計算できます。

max_dispatchers = CEIL(x/y)
tcp_dispatchers = CEIL(x_tcpip/y)
max_task_threads = CEIL(x/max_sessions)

意味:

  • CEILは引数以上の最小の整数を戻すSQL関数です。

  • xは、extprocに同時に接続可能な最大セッション数です。

  • yは、システムで各ディスパッチャにサポート可能な最大接続数です。

  • x_tcpipは、TCP/IPでextprocに同時に接続可能な最大セッション数です。

    (x - x_tcpipは、IPCでextprocに同時に接続可能な最大セッション数です。)

max_task_threadsに影響するmax_sessionsの最適値を計算するための数式はありません。

これらのパラメータ設定は、ハードウェアの性能に基づいて微調整し、同時スレッドでオペレーティング・システムが過度に消費されないことを確認する必要があります。

max_dispatchersの値は最低1(デフォルト)である必要があります。

想定:

  • extprocに同時に接続可能な最大セッション数(x)は650です。

  • TCP/IPでextprocに同時に接続可能な最大セッション数(x_tcpip)は400です。

    (IPCでextprocに同時に接続可能な最大セッション数は650-400=250です。)

  • システムで各ディスパッチャにサポート可能な最大接続数(y)は100です。

  • タスク・スレッドごとの最大セッション数(max_sessions)は20です。

これらのパラメータの最適値は次のとおりです。

max_dispatchers = CEIL(650/100) = CEIL(6.5)  = 7
tcp_dispatchers  = CEIL(400/100) = CEIL(4)    = 4
max_task_threads = CEIL(650/20)  = CEIL(32.5) = 33

つまり、最適値は次のようになります。

  • 最大ディスパッチャ数は7です。

  • この7つのディスパッチャのうち4つがTCP/IPでリスニングし、残り3つはIPCでリスニングします。

  • 最大タスク・スレッド数は33です。

listener_addressおよびshutdown_address

表F-2および例F-1の両方で示すように、構成パラメータlistener_addressおよびshutdown_addressの値はADDRESSで指定されます。ADDRESS内で、パラメータHOSTをIPv6またはIPv4アドレス、あるいはホスト名のいずれかに指定できます。HOSTがホスト名の場合に関連するオプションのADDRESSパラメータIPの値を次に示します。

IP値 意味

FIRST

ホスト名のDNS解決で戻される最初のIPアドレスでリスニングします。

V4_ONLY

システムのIPv4インタフェースでのみリスニングします。

V6_ONLY

システムのIPv6インタフェースでのみリスニングします。

たとえば、listener_addressまたはshutdown_addressが次の値の場合、IPv6インタフェースに制限されます。

"(ADDRESS=(PROTOCOL=tcp)(HOST=sales)(PORT=1521)(IP=V6_ONLY))"

関連項目:

Oracle DatabaseでのIPv6サポートの詳細は、『Oracle Database Net Services管理者ガイド』を参照してください