Fóruns: Open Discussion (Thread #20841)

【バッチFW】 (2008-12-01 20:23 by Anônimo #40352)

アプリケーションサーバでバッチデーモンを起動し、
上記のトランザクションモデルを使用するジョブを実行する場合、
スレッド数はいくつになりますか?計算式を教えてください。

templete/SequentialSingleTransactionBean.xml

次の計算式となることを予想していますが、なぜそのような数字になるのか判りません。

スレッド数 = 1 + 1 + Math.min(queueLengthの値, 実行ジョブ数*2*2)

Responder a #40352×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 【バッチFW】 (2008-12-05 20:39 by kuramotoki #40449)

スレッド構成に関してですが、
アーキテクチャ説明書にもあるように、入力処理を行う(コレクタ)スレッド、
ビジネスロジックを実行する(ワーカ)スレッドの2スレッドが最低でも必要になります。

分割ジョブのスレッド構成は、ワーカ側がコレクタ+ワーカの構成をとるので、以下の式で
使用する最大スレッド数が表せます。
 式A: 1(分割キー取得コレクタ)+2(子ジョブの対象データ取得コレクタ+ワーカ)×多重度

バッチデーモンで通常ジョブを実行する場合は、以下の式で使用する最大スレッド数が表せます。
 式B: 1(バッチデーモンのコレクタ)+2(実行ジョブの対象データ取得コレクタ+ワーカ)×同時実行ジョブ数

バッチデーモンで分割ジョブを実行する場合は、以下の式で使用する最大スレッド数が表せます。
 式C: 1(バッチデーモンのコレクタ)+(1(分割キー取得コレクタ)+
     2(子ジョブの対象データ取得コレクタ+ワーカ)×多重度)×同時実行ジョブ数

templete/SequentialSingleTransactionBean.xmlを使用した場合ですが、仕様として
多重度=1に設定されていますので、
上記の式Cを用いると、以下のようになります。
 1+(1+2×1)×同時実行ジョブ数=1+(1+2)×同時実行ジョブ数
queueLengthは使用するスレッド数の増減には関与しません。

また、バッチデーモンでの同時実行ジョブ数で使用されるワーカ側スレッドの上限
は、ThreadPoolContext-AsyncBatch.xmlで設定されていますので、
同時実行ジョブ数を増やしても、設定された上限を超えるスレッドは使用されませ
ん。

式Cをより厳密にあらわすと、以下になります。
 式C’: 1(バッチデーモンのコレクタ)+1(分割キー取得コレクタ)×同時
実行ジョブ数+Min(2(子ジョブの対象データ取得コレクタ+ワーカ)×多重度)×
同時実行ジョブ数, ThreadPoolContext-AsyncBatch.xmlでの設定数)

以上、よろしくお願いいたします。
Responder a #40352

Responder a #40449×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 【バッチFW】 (2008-12-11 10:37 by Anônimo #40577)

解説ありがとうございました。

なお、分割ジョブにおいて、子ジョブの対象データ取得コレクタ(以降、コレクタ)とワーカが同一のスレッドプール内で動作しますね。

同時実行ジョブ数やパーティションキーの数が多いとき、プーリングされているスレッドすべてが、コレクタの処理に割り当てられてしまうと、ワーカがいつまで経っても起動しない場合があります。

コレクタとワーカを異なるスレッドプール内で動作させるなどの改善を検討されてはどうでしょうか?
Responder a #40449

Responder a #40577×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 【バッチFW】 (2008-12-11 16:31 by kuramotoki #40587)

現在は単一のスレッドプールでコレクタ/ワーカともに動作するようにしています。

スレッドプールのスレッド枯渇についてですが、
分割ジョブでパーティションキーが大量にある場合や、
非同期実行時に実行対象ジョブがジョブ管理テーブルに大量に登録されていたとしても、
多重度の2倍のスレッドをプールするので
ワーカがいつまでたっても起動しない場合はないと考えています。

プーリングされているスレッドすべてがコレクタの処理に割り当てられてしまう状況について、
こうするとコレクタに全スレッドが割り当てられてしまったという設定例がありましたらお教えいただければと思います。

以上、よろしくお願いいたします。
Responder a #40577

Responder a #40587×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 【バッチFW】 (2008-12-11 17:12 by Anônimo #40589)

アプリケーションサーバによってはプールするスレッドの数が決められていて、ThreadPoolContext-AsyncBatch.xmlで設定しているプールサイズを確保できない場合があります。

次のようなケースです。

- アプリケーションサーバでのプールサイズ=10
- バッチデーモンの多重度(multiplicity)=8
- 同時に実行するジョブ数(分割ジョブ)=64
- 各ジョブのパーティションキーの個数=3

このとき、スレッドプールの全スレッドがコレクタに割り当てられてしまう場合があるのではないでしょうか?

# WebLogic Serverだと、ThreadPoolContext-AsyncBatch.xmlの設定が、アプリケーションサーバに反映されるのでしょうか?
Responder a #40587

Responder a #40589×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 【バッチFW】 (2008-12-11 17:48 by kuramotoki #40592)

おっしゃる状況ですと、たしかにWebアプリケーションサーバのスレッドが枯渇した結果スレッド待ちの状態になり固まる可能性があります。

このような状況はBatchFW内部のスレッド制御において
コレクタとワーカのスレッドを分離したとしても、
必要なスレッド総数を確保できないことにはかわらないので、
結局ご提示いただいた問題は解消しないと考えますがいかがでしょうか。

Webアプリケーションサーバの最大スレッド数設定の問題になるかと思います。
Responder a #40589

Responder a #40592×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 【バッチFW】 (2008-12-11 20:58 by Anônimo #40598)

コレクタ用とワーカ用それぞれにスレッドプールを用意することにより、ワーカが確実に回るようになるのではないでしょうか?
Responder a #40592

Responder a #40598×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login

RE: 【バッチFW】 (2008-12-17 12:30 by kuramotoki #40710)

WebLogicのワークマネージャを別にすることになるかと思いますが、現時点では最終的にWebLogicのスレッドの設定に関する問題になると考えています。
ご指摘の点については今後改善できるか否かについては検討させてください。
以上です。
Responder a #40352

Responder a #40710×

You can not use Wiki syntax
You are not logged in. To discriminate your posts from the rest, you need to pick a nickname. (The uniqueness of nickname is not reserved. It is possible that someone else could use the exactly same nickname. If you want assurance of your identity, you are recommended to login before posting.) Login