0

Stackoverflow と Google を検索しましたが、自分の状況に対する答えが見つかりませんでした。これが私のデザインです。

1) 2 つのステート マシン ワークフローが定義されています (親と子)。親 WWF は子 WWF のステータスを監視し、子 WWF は特定のメッセージのタスクを実際に実行するものです。

2) 親 WWF が子 WWF (instance.Start()) を 500 個生成します。次に、親 WWF 内のレプリケーター アクティビティ コントロール (並列実行モード) を使用して、子の開始イベントがトリガーされます。

3) コードは VM (8 GB RAM、4 つの CPU コア、独自のアプリケーション プールを備えた IIS 7.0) でホストされます。

同じコードの実行で 2 つの異なる動作があることに気付きました。

A) 500 のすべての子 WWF の処理を​​完了するのにわずか 8 秒しかかからない場合があります。これはすばらしいことです。

B) ただし、500 のすべての子に対して親 WWF で Instance.Start() を実行した後、レプリケーター アクティビティが 30 ~ 40 秒間何もせずにハングアップし、その後、各子 WWF がほぼ順番に処理されることがあります。そのため、以前は 8 秒で完了していた同じジョブを完了するには、約 300 ~ 400 秒かかります。

私の調査結果に基づくと、すべてはスレッド プールの管理にかかっていると思います。私のコードは ThreadPool.QueueWorkItem() を直接処理しておらず、WWF は実際には舞台裏の別のスレッドで動作するため、WWF のスレッド管理についてはほとんどまたはまったく制御できません。

シナリオ B では、システム パフォーマンスを監視すると、CPU が数秒間 80% まで上昇し、その後低下します。その後、実際に各子 WWF プロセスの処理を開始する前に、30 ~ 40 秒間アクティビティがありません。

では、ボトルネック/遅さはどこにあり、このときどき発生する動作の一時停止をどのように解決すればよいのでしょうか?

助言がありますか?

御時間ありがとうございます。

4

0 に答える 0