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管理者ガイド』を参照してください