1

私はこの奇妙な問題を抱えています。サーバー上に 3 つの WCF サービスがあります。マネージャー サービスは、外部からの要求の主要なエントリ ポイントです。もう 1 つのサービスは、アプリケーションのロジックです。3 番目のサービスは DB 接続サービスで、両方のサービスが行き、ほとんどの作業を行っています (DB が行います)。

マネージャーへのリクエストで負荷テストを実行し、パフォーマンス テストを実行したところ、90 の異なるスレッドが同時に実行され、2 番目のサービスには約 50 があり、DB 接続には約 12 しかありませんでした。

これは、アプリケーションの主なパフォーマンスの問題だと思います。両方のサービスをプロファイリングすると、DB サービスからの応答をかなり待っていることがわかります。

DB サービスに対して直接テストを実行してみました。私は 80 のスレッドを実行し、チャネルを開いた直後とリクエストを送信する前に、ManualEventHandler でそれらを停止しました。次に、すべての準備が整ったらハンドラーを設定し、DB 接続サービスで約 25 のスレッドを実行しました。

そのため、12 を超えるスレッドを処理できます。

何が起こっているのですか?

リクエストがキューに入れられるのはなぜですか?

いくつかの追加情報:

バインディングはbasichttpbindingですが、net pipe ipcを試しても同じ結果でした。コンテキストモードと同時実行性を呼び出しごとまたはセッションごとの複数に設定すると、同じ結果が得られます。

また、サービスは自己ホスト型です。このようなアーキテクチャである理由は、他の複数のサービスまたはアプリケーションがそれらのサービスに直接リクエストを送信できるようにするためです。この特定のイベントでは、説明どおりにテストしますが、他のイベントではフローが異なる場合があります。

4

1 に答える 1

2

これは、それらのリクエストが途中でキューに入れられていることを意味します。すべてのサービスが IIS でホストされている場合、ASP.NET パフォーマンス カウンターを使用して、各サービス レベルで保留中の要求の数を確認できます (私の知る限り、WCF はそのようなパフォーマンス カウンターを提供しません)。@the coonが示唆したように、これは確かに間違ったアーキテクチャアプローチです。各サービス呼び出しは、ビジネス ロジックとデータ アクセス操作の両方を異なるレイヤーの同じサービスで実行する場合と比較して、高価なものと見なすことができます。正直なところ、そのようなアプローチを使用する理由がわかりません。

于 2012-06-28T14:17:39.200 に答える