ヘッダーをスキップ
Oracle® Databaseアドバンスト・アプリケーション開発者ガイド
11gリリース2 (11.2)
B56259-09
  目次へ移動
目次
索引へ移動
索引

前
 
次
 

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

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

内容は次のとおりです。

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

この項では、マルチスレッドextprocエージェントが外部プロシージャの効率の向上にどのように役立つかについて説明します。

内容は次のとおりです。

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

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

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

マルチスレッド化のメリット

Oracle Database共有サーバー・アーキテクチャは、数千のユーザー・セッションがオープンしている場合でも、特定の時点でアクティブになる接続の割合が小さいことを前提にしています。共有サーバー・モードでは、共有サーバー・プロセスのプールが存在します。ユーザー・セッションは、リクエストされたタスクをキューに置くディスパッチャ・プロセスに接続します。このタスクは、使用可能な最初の共有サーバー・プロセスによって取得されます。共有サーバー・プロセスの数は、通常、ユーザー・セッションの数より少なくなります。

マルチスレッドextprocエージェントは、これに類似した機能を外部プロシージャへの接続に提供します。マルチスレッドextprocエージェントのアーキテクチャでは、共有エージェント・スレッドのプールを使用します。ユーザー・セッションによってリクエストされたタスクは、キューに置かれ、使用可能な最初のマルチスレッドextprocエージェント・スレッドによって取得されます。特定の時点でアクティブなユーザー接続の割合は小さいため、マルチスレッドextprocアーキテクチャでは、システム・リソースをより効率的に使用できます。

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

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

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

マルチスレッドextprocエージェントのアーキテクチャでは、着信した各接続リクエストは次の種類のスレッドにより処理されます。

  • 単一の監視スレッド。監視スレッドは次の処理を行います。

    • リスナーとの通信の管理

    • プロセスの負荷の監視

    • 必要に応じたスレッドの起動および停止

  • 複数のディスパッチャ・スレッド。ディスパッチャ・スレッドは次の処理を行います。

    • Oracle Databaseとの通信の処理

    • タスク・スレッドへのタスク・リクエストの受渡し

  • 複数のタスク・スレッド。タスク・スレッドは、Oracle Databaseプロセスからのリクエストを処理します。

図A-1に、マルチスレッドextprocエージェントのアーキテクチャを示します。ユーザー・セッション1および2から、いくつかのDLL内にあるファンクションへのコールアウトの要求が発行されます。これらの要求は、異機種間サービスを介してマルチスレッドのextprocエージェントに送られます。エージェントのディスパッチャ・スレッドがこれらの要求を処理し、タスク・スレッドに渡します。タスク・スレッドが実際に要求を処理し、DLLをそれぞれロードし、そこに含まれているファンクションをコールします。

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

  • 個々の要求については、異なるタスク・スレッドで処理できます。たとえば、タスク・スレッド1はユーザー・セッション1からの要求を処理し、その後、ユーザー・セッション2からの要求を処理することができます。


参照:

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

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

図A-1の説明
「図A-1 マルチスレッドextprocエージェントのアーキテクチャ」の説明

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


注意:

あるユーザー・セッションからのリクエストはすべて、同じディスパッチャ・スレッドによって処理されますが、異なるタスク・スレッドで処理できます。また、複数のタスク・スレッドで外部プロシージャに対して同じ接続を使用できます。

次の各項では、各種スレッドについてより詳細に説明します。

監視スレッド

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

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

  • ディスパッチャ・スレッドを、このextprocエージェントへの接続を処理している全リスナーに登録します。このSIDに対するディスパッチャが実行中の場合、リスナーは着信接続要求の取得時にプロセスを起動しません。かわりに、リスナーはこの同じディスパッチャに接続を渡します。

  • 他のスレッドを監視し、ディスパッチャ・スレッドに関する負荷情報をこのextprocエージェントへの接続を処理しているすべてのリスナー・プロセスに送信します。これにより、リスナーは着信要求接続を負荷が最小のディスパッチャに渡すことができます。

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

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

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

  • 着信接続リクエストおよびタスク・リクエストをOracle Databaseサーバーから受け入れます。

  • 着信リクエストをキューに入れ、タスク・スレッドがこれを取得できるようにします。

  • リクエストの結果を、そのリクエストの発行元のサーバーに戻します。


    注意:

    ユーザー・セッションがディスパッチャとの接続を確立した後は、そのユーザー・セッションからのすべてのリクエストはユーザー・セッションが終了するまで同じディスパッチャに送信されます。

タスク・スレッド

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

  • リクエストをキューから取得します。

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

  • 結果をキューに入れ、ディスパッチャがそれを取得できるようにします。

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

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

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

agtctlを起動する前にOracle Listenerが実行していることを確認します。次に、例A-1のようにagtctlコマンドを使用して、agtctl構成パラメータを設定し(デフォルト値を使用しない場合)、agtctlを起動します。

例A-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コマンドは、単一行コマンド・モードでもシェル・モードでも使用できます。

内容は次のとおりです。

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

agtctlの起動と停止、およびその制御ファイルの作成と管理は、表A-1に示すコマンドを使用して実行できます。

表A-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のいずれかで指定されるディレクトリに制御ファイルを配置します。これらの2つの環境変数のうち少なくとも一方が設定され、エージェントがアクセスするディレクトリを指していることを確認してください。

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


単一行コマンド・モードでのagtctlの使用

この項では、agtctlコマンドの使用について説明します。これらのコマンドは単一行コマンド・モードで表示されます。

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

マルチスレッドextprocエージェントを起動する前に、その構成パラメータを設定します。構成パラメータが特に設定されていない場合は、デフォルト値が使用されます。構成パラメータとそのデフォルト値については、表A-2を参照してください。

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

構文

agtctl set parameter parameter_value agent_sid

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

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

agent_sidは、このエージェントで処理するSIDです。この指定は、単一行コマンド・モードでは必須です。

agtctl set max_dispatchers 5 salesDB

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

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

構文

agtctl startup extproc agent_sid

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

agtctl startup extproc salesDB

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

shutdownコマンドを使用して、マルチスレッドextprocエージェントを停止します。次の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のエントリの削除

指定したSIDエントリを制御ファイルから削除するには、deleteコマンドを使用します。

構文

agtctl delete agent_sid

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

agtctl delete salesDB

ヘルプのリクエスト

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

構文

agtctl help [command]

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

agtctl help set

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

シェル・モードで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エージェント制御用の構成パラメータ

表A-2では、エージェント制御ユーティリティの構成パラメータについて説明しデフォルト値を示します。

表A-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_sessionsの最適な値を計算するための式はありません。これは、max_task_threadsに影響します。

ハードウェアの性能に応じてこれらのパラメータ設定を微調整する必要があります。同時スレッドによってオペレーティング・システムに負荷がかかりすぎないようにしてください。

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

構成パラメータlistener_addressおよびshutdown_addressの値が、表A-2例A-1の両方で示すように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管理者ガイド』を参照してください。