F マルチスレッドextprocエージェント
マルチスレッドextprocエージェントについて説明します。
この付録では、マルチスレッドextprocエージェンの概要、これを使用した分散データベース・システム全体の効率向上、およびその管理方法について説明します。
この項には次のトピックが含まれます:
F.1 マルチスレッドextprocエージェントを使用する理由
この項では、マルチスレッドextprocエージェントが外部プロシージャの効率の向上にどのように役立つかについて説明します。
この項には次のトピックが含まれます:
F.1.1 専用エージェント・アーキテクチャの問題
デフォルトでは、extprocエージェントはユーザー・セッションごとに起動され、extprocエージェント・プロセスはユーザー・セッションの終了時にのみ終了します。
このアーキテクチャでは、過度にシステム・リソースが消費される場合があります。たとえば、数千のユーザー・セッションによってextprocエージェント・プロセスが同時に起動されるとします。extprocエージェント・プロセスは各セッションに対して起動されるので、数千のextprocエージェント・プロセスが同時に実行されます。extprocエージェント・プロセスは、各extprocエージェント・プロセスが特定の時点でアクティブであるかどうかにかかわらず、すべて実行されます。このため、extprocエージェント・プロセスとオープン接続により、過度にシステム・リソースが消費される場合があります。この問題は、セッションのOracle Databaseへの接続時に、サーバーを共有サーバー・モードで起動することで対処します。共有サーバー・モードでは、データベース接続を少ない数のサーバー・プロセスで共有できます。
F.1.2 マルチスレッドの利点
Oracle Database共有サーバーのアーキテクチャでは、数千のユーザー・セッションがオープンである場合でも、常にこれらの接続の一部のみがアクティブであると想定されます。
共有サーバー・モードでは、共有・サーバー・プロセスのプールが存在します。ユーザー・セッションは、キュー内に要求されたタスクを配置するディスパッチャ・プロセスに接続されます。これらのタスクは、最初に使用可能な共有サーバー・プロセスで取り出されます。共有サーバー・プロセスの数は、通常、ユーザー・セッションの数よりも少ないです。
マルチスレッドextprocエージェントは、これに類似した機能を外部プロシージャへの接続に提供します。マルチスレッドextprocエージェントのアーキテクチャでは、共有エージェント・スレッドのプールを使用します。ユーザー・セッションによってリクエストされたタスクは、キューに置かれ、使用可能な最初のマルチスレッドextprocエージェント・スレッドによって取得されます。特定の時点でアクティブなユーザー接続の割合は小さいため、マルチスレッドextprocアーキテクチャでは、システム・リソースをより効率的に使用できます。
F.2 マルチスレッドextprocエージェントのアーキテクチャ
マルチスレッドextprocエージェントは、外部プロシージャへの接続を試行する前に、システム識別子(SID)ごとに起動する必要があります。これは、エージェント制御ユーティリティ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管理者ガイド』を参照してください
これら3つのスレッド・タイプは、概してOracle Databaseマルチスレッド・サーバーPMON、ディスパッチャおよび共有サーバー・プロセスにそれぞれ対応します。
注意:
ユーザー・セッションからの要求はすべて同じディスパッチャ・スレッドで処理されますが、異なるタスク・スレッドでサービス可能です。また、複数のタスク・スレッドで同じ外部プロシージャ接続を使用することもできます。
次のトピックで、これらのスレッドの詳細を説明します。
-
関連項目:
エージェント制御ユーティリティ
agtctlを使用したマルチスレッドexprocエージェントの起動および停止の詳細は、「マルチスレッドextprocエージェントの管理」を参照してください
F.2.1 モニター・スレッド
エージェント制御ユーティリティagtctlは、あるSIDに対してマルチスレッドextprocエージェントを起動する際、監視スレッドを作成します。
監視スレッドは次の機能を実行します。
-
ディスパッチャ・スレッドおよびタスク・スレッドを作成します。
-
ディスパッチャ・スレッドを、この
extprocエージェントへの接続を処理している全リスナーに登録します。このSIDに対するディスパッチャが実行中の場合、リスナーは着信接続要求の取得時にプロセスを起動しません。かわりに、リスナーはこの同じディスパッチャに接続を渡します。 -
他のスレッドを監視し、ディスパッチャ・スレッドに関する負荷情報をこの
extprocエージェントへの接続を処理しているすべてのリスナー・プロセスに送信します。これにより、リスナーは着信要求接続を負荷が最小のディスパッチャに渡すことができます。 -
作成した各スレッドの監視を続行します。
F.2.2 ディスパッチャ・スレッド
ディスパッチャ・スレッドの使用方法について説明します。
ディスパッチャ・スレッドは次の関数を実行します。
-
Oracle Databaseサーバーからの着信接続およびタスク要求を受け入れます。
-
タスク・スレッドによる取出しのために着信要求をキューに配置します。
-
要求の発行先サーバーに要求の結果を送信します。
注意:
ユーザー・セッションでディスパッチャとの接続が確立された後は、ユーザー・セッションからの要求はそのユーザー・セッションが終了するまですべて同じディスパッチャで処理されます。
F.3 マルチスレッドextprocエージェントの管理
マルチスレッドextprocエージェントは、外部プロシージャへの接続を試行する前に、システム識別子(SID)ごとに起動する必要があります。
マルチスレッドextprocエージェントは、lsnrctlと同様に機能する、agtctlと呼ばれるエージェント制御ユーティリティによって起動、停止および構成されます。ただし、lsnrctlが構成ファイル(listener.ora)を読み取るのに対して、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
F.3.1 エージェント制御ユーティリティ(agtctl)コマンド
エージェント制御ユーティリティ・コマンドの概要とその用途について説明します。
表F-1に示す各コマンドを使用して、agtctlの起動や停止、および制御ファイルの作成やメンテナンスができます。
表F-1 エージェント制御ユーティリティ(agtctl)コマンド
| コマンド | 説明 |
|---|---|
|
|
マルチスレッド |
|
|
マルチスレッド |
|
|
マルチスレッド |
|
|
パラメータのデフォルト値に戻します。 |
|
|
構成パラメータの値を表示します。 |
|
|
制御ファイルから特定のSIDのエントリを削除します。 |
|
|
シェル・モードを終了します |
|
|
使用可能なコマンドを示します |
これらのコマンドは、次の2つの方法で発行できます。
-
コマンドはUNIXまたはDOSシェルから発行できます。このモードは単一行コマンド・モードと呼ばれます。
-
agtctlと入力すると、AGTCTL>プロンプトが表示されます。その後は、agtctlシェル内からコマンドを入力できます。このモードはシェル・モードと呼ばれます。
agtctlコマンドの構文とパラメータは、発行時のモードに応じて異なります。
注意:
-
コマンドはすべて大/小文字が区別されます。
-
agtctlユーティリティは、2つの環境変数AGTCTL_ADMINまたはTNS_ADMINのいずれかで指定されるディレクトリに制御ファイルを配置します。これらの2つの環境変数のうち少なくとも一方が設定され、エージェントがアクセスするディレクトリを指していることを確認してください。 -
マルチスレッド
extprocエージェントで環境変数の設定が必要な場合、または専用モードで動作するエージェントのlistener.oraエントリの構成時にENVSパラメータを使用した場合は、agtctlユーティリティを実行するUNIXまたはDOSシェル内で必須のすべての環境変数を設定する必要があります。
F.3.2 単一行コマンド・モードでのagtctlの使用について
この項では、agtctlコマンドの使用方法について説明します。
これらは単一行コマンド・モードで示されます。
F.3.2.1 マルチスレッド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
F.3.2.2 マルチスレッドextprocエージェントの起動
startupコマンドを使用して、マルチスレッドextprocエージェントを起動します。
構文
agtctl startup extproc agent_sid
agent_sidはマルチスレッドextprocエージェントでサービスされるSIDです。この指定は、単一行コマンド・モードでは必須です。
例
agtctl startup extproc salesDB
F.3.2.3 マルチスレッドextprocエージェントの停止
shutdownコマンドを使用して、マルチスレッドextprocエージェントを停止します。
次の3つの停止形式があります。
-
通常(デフォルト)
agtctlは、マルチスレッドextprocエージェントにエージェント自体を正常終了するように要求します。すべてのセッションは、実行中の操作を完了してから停止します。 -
即時
agtctlは、マルチスレッドextprocエージェントに即時に終了するように指示します。エージェントは、現行のセッションの状態に関係なく即時に終了します。 -
異常終了
マルチスレッド
extprocエージェントと対話をせずに、agtctlはシステム・コールを発行してエージェントを停止します。
構文
agtctl shutdown [immediate|abort] agent_sid
agent_sidは、このマルチスレッドextprocエージェントで処理するSIDです。この指定は、単一行コマンド・モードでは必須です。
例
agtctl shutdown immediate salesDB
F.3.2.4 構成パラメータの値の確認
構成パラメータの値を確認するには、showコマンドを使用します。
構文
agtctl show parameter agent_sid
parameterは確認するパラメータです。
agent_sidはマルチスレッドextprocエージェントでサービスされるSIDです。この指定は、単一行コマンド・モードでは必須です。
例
agtctl show max_dispatchers salesDB
F.3.2.5 デフォルト値への構成パラメータのリセット
unsetコマンドを使用すると、構成パラメータをデフォルト値にリセットできます。
構文
agtctl unset parameter agent_sid
parameterはリセット(または変更)するパラメータです。
agent_sidはマルチスレッドextprocエージェントでサービスされるSIDです。この指定は、単一行コマンド・モードでは必須です。
例
agtctl unset max_dispatchers salesDB
F.3.2.6 制御ファイルからの特定のSIDのエントリの削除
指定したSIDエントリを制御ファイルから削除するには、deleteコマンドを使用します。
構文
agtctl delete agent_sid
agent_sidは削除するSIDエントリです。
例
agtctl delete salesDB
F.3.3 シェル・モード・コマンドの使用
AGTCTL>コマンドを発行すると、プロンプトAGTCTL>が表示されます。
agtctl
その後はagtctlシェルからコマンドを発行するため、コマンド文字列に接頭辞agtctlを付ける必要はありません。
次を入力してエージェントのSIDの名前を設定します。
AGTCTL> set agent_sid agent_sid
これ以降に発行するコマンドはすべて、agent_sid値を変更するまでは、指定したSIDに対するものとみなされます。単一行コマンド・モードとは異なり、コマンド文字列でagent_sidは指定しません。
次のようにエラー・メッセージの言語を設定できます。
AGTCTL> set language language
コマンド自体は、単一行コマンド・モードの場合と同じです。シェル・モードを終了するには、exitと入力します。
F.3.3.1 例: 構成パラメータの設定
shutdown_address構成パラメータの値の設定方法について説明します。
この例では、shutdown_address構成パラメータに値を設定しています。
AGTCTL> set shutdown_address (address=(protocol=ipc)(key=oraDBsalesDB))
F.3.4 マルチスレッドextprocエージェント制御の構成パラメータ
マルチスレッドextprocエージェント制御の構成パラメータの機能について説明します。
表F-2に、エージェント制御ユーティリティの構成パラメータおよび各デフォルト値を示します。
表F-2 agtctlの構成パラメータ
| パラメータ | 説明 | デフォルト値 |
|---|---|---|
|
|
最大ディスパッチャ数。 |
1 |
|
|
TCPをリスニングしているディスパッチャの数(残りはIPCを使用)。 |
0 |
|
|
最大タスク・スレッド数。 |
2 |
|
|
タスク・スレッドごとの最大セッション数。 |
5 |
|
|
リスナーがリスニングしているアドレス(登録に必要)。 |
(ADDRESS_LIST=
(ADDRESS=
(PROTOCOL=IPC)
(KEY=PNPKEY))
(ADDRESS=
(PROTOCOL=IPC)
(KEY=listener_sid))
(ADDRESS=
(PROTOCOL=TCP)
(HOST=127.0.0.1)
(PORT=1521)))注意: |
|
|
リスナーと通信するためにエージェントが使用するアドレス。エージェントはこのアドレスで、 |
(ADDRESS=
(PROTOCOL=IPC)
(KEY=listener_sid || agent_sid))
(ADDRESS=
(PROTOCOL=TCP)
(HOST=127.0.0.1)
(PORT=1521))注意:
|
max_dispatchers、tcp_dispatchers、max_task_threadsおよびmax_sessions
パフォーマンスを向上させるために、max_dispatchers、tcp_dispatchers、max_task_threadsおよびmax_sessionsパラメータの一部あるいはすべての値を変更する必要がある場合があります。
max_dispatchers、tcp_dispatchers、max_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
表F-2および例F-1の両方で示すように、構成パラメータlistener_addressおよびshutdown_addressの値はADDRESSで指定されます。ADDRESSには、パラメータHOSTを指定できます。これは、IPv6またはIPv4アドレス、あるいはホスト名です。HOSTがホスト名の場合は、ADDRESSのオプション・パラメータIPの次の値が対応します。
| IP値 | 意味 |
|---|---|
|
|
ホスト名のDNS解決で返された最初のIPアドレスをリスニングします。 |
|
|
システムのIPv4インタフェースでのみリスニングします。 |
|
|
システムのIPv6インタフェースでのみリスニングします。 |
たとえば、listener_addressまたはshutdown_addressに次の値を指定するとIPv6インタフェースに限定されます。
"(ADDRESS=(PROTOCOL=tcp)(HOST=sales)(PORT=1521)(IP=V6_ONLY))"
関連項目:
Oracle DatabaseでのIPv6サポートの詳細は、『Oracle Database Net Services管理者ガイド』を参照してください
