マルチスレッドextprocエージェントについて説明します。
この付録では、マルチスレッドextproc
エージェンの概要、これを使用した分散データベース・システム全体の効率向上、およびその管理方法について説明します。
この項には次のトピックが含まれます:
この項では、マルチスレッドextproc
エージェントを使用して外部プロシージャの効率を向上する方法について説明します。
この項には次のトピックが含まれます:
デフォルトでは、extproc
エージェントはユーザー・セッションごとに起動され、extproc
エージェント・プロセスはユーザー・セッションの終了時にのみ終了します。
このアーキテクチャでは大量のシステム・リソースが不必要に消費されることがあります。たとえば、数千のユーザー・セッションで同時にextproc
エージェント・プロセスが生成されるとします。extproc
エージェント・プロセスは各セッションに対して起動されるので、数千のextproc
エージェント・プロセスが同時に実行されます。extproc
エージェント・プロセスは、各extproc
エージェント・プロセスが特定の時点でアクティブであるかどうかにかかわらず、すべて実行されます。したがって、extproc
エージェント・プロセスおよびオープン接続で、過度のシステム・リソースが消費される可能性があります。セッションをOracle Databaseに接続する場合、この問題はサーバーを共有サーバー・モードで起動することで対応できます。共有サーバー・モードでは、少数のサーバー・プロセスによるデータベース接続の共有が可能です。
Oracle Database共有サーバーのアーキテクチャでは、数千のユーザー・セッションがオープンである場合でも、常にこれらの接続の一部のみがアクティブであると想定されます。共有サーバー・モードでは、共有・サーバー・プロセスのプールが存在します。ユーザー・セッションは、キュー内に要求されたタスクを配置するディスパッチャ・プロセスに接続されます。これらのタスクは、最初に使用可能な共有サーバー・プロセスで取り出されます。共有サーバー・プロセスの数は、通常、ユーザー・セッションの数よりも少ないです。
マルチスレッド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管理者ガイド』を参照してください
これら3つのスレッド・タイプは、概してOracle Databaseマルチスレッド・サーバーPMON、ディスパッチャおよび共有サーバー・プロセスにそれぞれ対応します。
注意:
ユーザー・セッションからの要求はすべて同じディスパッチャ・スレッドで処理されますが、異なるタスク・スレッドでサービス可能です。また、複数のタスク・スレッドで同じ外部プロシージャ接続を使用することもできます。
次のトピックで、これらのスレッドの詳細を説明します。
関連項目:
エージェント制御ユーティリティagtctl
を使用したマルチスレッドexproc
エージェントの起動および停止の詳細は、「マルチスレッドextprocエージェントの管理」を参照してください
エージェント制御ユーティリティagtctl
は、あるSIDに対してマルチスレッドextproc
エージェントを起動する際、監視スレッドを作成します。モニター・スレッドは次の関数を実行します。
ディスパッチャ・スレッドおよびタスク・スレッドを作成します。
このextproc
エージェントへの接続を処理するすべてのリスナーとともにディスパッチャ・スレッドを登録します。このSIDのディスパッチャが稼働している間、着信接続の取得時にリスナーでプロセスは開始されません。かわりに、リスナーからこの同じディスパッチャへの接続が与えられます。
その他のスレッドを監視し、ディスパッチャ・スレッドに関するロード情報をこのextproc
エージェントへの接続を処理するすべてのリスナー・プロセスに送信し、リスナーから最も少ないロードのディスパッチャに着信接続が与えられるようにします。
作成した各スレッドの監視を続行します。
ディスパッチャ・スレッドは次の関数を実行します。
Oracle Databaseサーバーからの着信接続およびタスク要求を受け入れます。
タスク・スレッドによる取出しのために着信要求をキューに配置します。
要求の発行先サーバーに要求の結果を送信します。
注意:
ユーザー・セッションでディスパッチャとの接続が確立された後は、ユーザー・セッションからの要求はそのユーザー・セッションが終了するまですべて同じディスパッチャで処理されます。
外部プロシージャに接続する前に、システム識別子(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
表F-1に示す各コマンドを使用して、agtctl
の起動や停止、および制御ファイルの作成やメンテナンスができます。
表F-1 エージェント制御ユーティリティ(agtctl)コマンド
コマンド | 説明 |
---|---|
|
マルチスレッド |
|
マルチスレッド |
|
マルチスレッド |
|
パラメータのデフォルト値に戻します。 |
|
構成パラメータの値を表示します。 |
|
制御ファイルから特定のSIDのエントリを削除します。 |
|
シェル・モードを終了します。 |
|
使用可能なコマンドを示します。 |
これらのコマンドは、次の2つの方法で発行できます。
コマンドはUNIXまたはDOSシェルから発行できます。このモードは単一行コマンド・モードと呼ばれます。
agtctl
と入力すると、AGTCTL>
プロンプトが表示されます。その後、agtctl
シェル内でコマンドを入力できます。このモードはシェル・モードと呼ばれます。
agtctl
コマンドの構文およびパラメータは、どのモードで発行されるかによって異なります。
注意:
コマンドはすべて大/小文字が区別されます。
agtctl
ユーティリティでは、制御ファイルが2つの環境変数AGTCTL_ADMIN
またはTNS_ADMIN
のいずれかで指定されるディレクトリ内に配置されます。これらの環境変数のうち最低いずれか1つが設定されており、エージェントによりアクセスされるディレクトリが指定されていることを確認してください。
マルチスレッドextproc
エージェントで環境変数の設定が必要な場合、またはエージェントが専用モードで機能するようにするためにlistener.ora
エントリを構成する際にENVS
パラメータを使用した場合、すべての必要な環境変数をagtctl
ユーティリティを実行するUNIXまたはDOSシェルで設定する必要があります。
この項では、agtctl
コマンドの使用方法について説明します。
これらは単一行コマンド・モードで示されます。
エージェントを起動する前にマルチスレッド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
エージェントを起動するにはstartup
コマンドを使用します。
構文
agtctl startup extproc agent_sid
agent_sid
はマルチスレッドextproc
エージェントでサービスされるSIDです。これは、単一行コマンド・モードで指定する必要があります。
例
agtctl startup extproc salesDB
マルチスレッド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
delete
コマンドを使用して、制御ファイルから特定のSIDのエントリを削除できます。
構文
agtctl delete agent_sid
agent_sid
は削除するSIDエントリです。
例
agtctl delete salesDB
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エージェント制御の構成パラメータの機能について説明します。
表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_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値 | 意味 |
---|---|
|
ホスト名の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管理者ガイド』を参照してください