2

Web サービスの速度が低下しています。私の (Web) サービスは gsoap とマネージド C++ です。IIS/apache でホストされているわけではありませんが、xml を話します。私のクライアントは .NET です サービスの計算時間は短いです (応答を準備するのに 0.1 秒未満)。サービスがスムーズで高速で、可用性が高いことを期待しています。約 100 のクライアントがあり、応答時間は 1 秒です。クライアントには、1 分あたり約 1 つのリクエストがあります。クライアントは、tcp オープン ポート テストによって Web サービスの存在をチェックしています。したがって、輻輳の可能性を回避するために、gSoap KeepAlive を false に変更しました。そこまではすべて正常に実行されます: TCPView (sysinternals) で接続がほとんど表示されません

新しい特別な同期プログラムは、サービスをループで呼び出すようになりました。負荷は高くなりますが、すべてが 30 秒未満で処理されます。sysinternals TCPView では、約 1,000 の接続が TIME_WAIT にあることがわかります。彼らはサービスを遅くし、サービスが応答するのに数秒かかります.

SoapHttpClientProtocol 接続をリセットする必要があるのでしょうか? 誰かがループ内の Web サービス呼び出しで TIME_WAIT ゴーストを持っていますか?

4

2 に答える 2

1

通話後に接続を閉じたり、リクエストごとに新しい接続を開いたりしていないようです。接続を閉じるか、開いている接続を再利用します。

于 2009-02-05T08:23:59.873 に答える
0

上記の実装には十分注意してください。それらには深刻な問題があります。

  1. yakkowarner.blogspot.com/2008/11/calling-web-service-in-loop.html (COMMENT ABOVE) で説明されている実装:

    問題:次に wsdl.exe を使用して Web サービスを再生成すると、すべての作業が消去されます。また、この修正がメッセージ文字列に依存してアクションを実行するというかなりハックであることを忘れてしまいます。

  2. forums.asp.net/t/1003135.aspx で説明されている実装 (上記のコメント):

    問題: 5000 から 65535 の間のエンドポイントを選択しているので、表面的にはこれが良いアイデアのように見えます。考えてみると、後で使用するためにポートを予約する方法はありません (少なくとも私が考えることができる方法はありません)。リストの次のポートが現在使用されていないことをどのように保証できますか? 使用するポートを順番に選択していて、他のアプリケーションがリストの次のポートを選択した場合、あなたは混乱しています。または、クライアント マシンで実行されている他のアプリケーションが接続にランダムなポートを使用し始めた場合はどうなるでしょうか。「リモートホストに到達できないか、利用できません」などのエラーメッセージがランダムに表示され、トラブルシューティングがさらに困難になります。

この問題に対する適切な解決策を提供することはできませんが、次のことを行うことができます。

  1. Web サービス要求の数を最小限に抑えるか、より長い期間にわたってそれらを分散するようにしてください。
  2. お使いのアプリのタイプでは、Web サービスが正しいアーキテクチャではなかった可能性があります。応答時間が 1 ミリ秒の場合は、Web サービスではなく、メッセージング システムを使用する必要があります。
  3. Windows のようにレジストリを使用して、OS の許可される接続数を 65K に設定します。
  4. ソケットが TIME_WAIT に留まる OS の時間を、より低い数値に設定します (これは、独自の問題のリストを示します)。
于 2010-12-31T20:12:31.617 に答える