30

Web サービスのスループットを測定しようとしています。

そのために、リクエストを継続的に送信し、多数のスレッドからレスポンスを読み取る小さなツールを作成しました。

各スレッドの内部ループの内容は次のようになります。

public void PerformRequest()
{
  WebRequest webRequest = WebRequest.Create(_uri);

  webRequest.ContentType = "application/ocsp-request";
  webRequest.Method = "POST";
  webRequest.Credentials = _credentials;
  webRequest.ContentLength = _request.Length;
  ((HttpWebRequest)webRequest).KeepAlive = false;

  using (Stream st = webRequest.GetRequestStream())
    st.Write(_request, 0, _request.Length);

  using (HttpWebResponse httpWebResponse = (HttpWebResponse)webRequest.GetResponse())
  using (Stream responseStream = httpWebResponse.GetResponseStream())
  using (BufferedStream bufferedStream = new BufferedStream(responseStream))
  using (BinaryReader reader = new BinaryReader(bufferedStream))
  {
    if (httpWebResponse.StatusCode != HttpStatusCode.OK)
      throw new WebException("Got response status code: " + httpWebResponse.StatusCode);

    byte[] response = reader.ReadBytes((int)httpWebResponse.ContentLength);
    httpWebResponse.Close();
  }      
}

何かがツールを制限しているように見えることを除いて、問題なく動作しているようです。ツールの 2 つのインスタンスを 40 スレッドごとに実行すると、80 スレッドの 1 つのインスタンスよりもスループットが大幅に向上します。

ServicePointManager.DefaultConnectionLimit プロパティを見つけました。これを 10000 に設定しました ( Jader Dias の提案に従ってapp.config で設定しても違いはありません)。

.NET または私のマシンに、パフォーマンスに影響を与える可能性のある他の設定はありますか? (Vista を実行していますが、Windows Server 2003 でも同じ問題が発生します)。

おそらく、単一のプロセスが確立できる接続の数にいくつかの制限がありますか?

4

6 に答える 6

40

app.config または web.config ファイルで maxconnection パラメータを設定する必要があります。

<?xml version="1.0" encoding="utf-8" ?>
<configuration>
  <system.net>
    <connectionManagement>
      <add address="*" maxconnection="80"/>
    </connectionManagement>
  </system.net>
</configuration>

Windows XP では、100 までの値が適切に機能します。

更新:上記の方法が System.Net.ServicePointManager.DefaultConnectionLimit を設定する別の方法であることがわかりました。

于 2009-01-12T18:32:52.883 に答える
2

最近課された接続制限である可能性があります。

http://www.speedguide.net/read_articles.php?id=1497

http://www.mydigitallife.info/2007/04/09/windows-vista-tcpipsys-connection-limit-patch-for-event-id-4226/

于 2008-12-23T14:09:22.507 に答える
2

ネットワーク設定で最大接続数を増やしてみましたか?

http://msdn.microsoft.com/en-us/library/fb6y0fyc.aspx

于 2008-12-23T16:43:16.067 に答える
1

マルチスレッド コードは常に共有リソースで競合を引き起こす可能性があることに注意してください。明示的に何かを共有していなくても、隠れてリソースを共有しているクラスを使用している可能性があります。

1 つの 80 スレッド exe よりも 2 つの 40 スレッド exe で実際に優れたパフォーマンスが得られる場合は、共有リソースを使用して調査を開始する必要があります。その場合、あなたが引用したコードは、スレッドを作成および管理するコードよりもはるかに興味深いものではありません。

私がそこに捨てるもう1つのことは、一般的にこの種のことを行うために入手できるツールがいくつかあるということです。http://support.microsoft.com/kb/231282を参照してください。また、Visual Studio (どの skus かはわかりません) には、新世代の Web アプリケーション パフォーマンス テスト ツールが含まれています。また、MS 以外のものも見つけられると思います。

于 2008-12-23T17:17:35.733 に答える
0

パフォーマンスに関して 2 つの重要な側面があります。

  1. 1つの側面は、クライアントによって使用されたTCP接続の数です(これらの接続が永続化されている場合(keep alive = true))、詳細については、次を参照して ください。 http://msdn.microsoft.com/en-us /library/system.net.servicepoint.connectionlimit(v=vs.110).aspxTCP 接続が httpwebrequest で作成された方法と場所、およびサービスポイントとの関係は? クライアントが「localhost」のサービスに接続するときに、System.Net.ServicePoint.ConnectionLimit が「7FFFFFFF」(Int32.MaxValue/2147483647) を使用するのはなぜですか? System.Net.ServicePointManager.DefaultConnectionLimit および .MaxServicePointIdleTime )

  2. 2 番目の側面は、複数の新しいスレッドを使用したり、ワーカー スレッドを使用してコード スニペットで同期呼び出し (httpwebrequest.getrequeststream など) を使用して並列処理を行ったりするのではなく、非同期モデルを完全に採用することです (ex、begin/endrequeststream、または新しいタスクのバリエーション)。 . この方法では、CPU は常にビジー状態になり、I/O 完了ポート スレッドは、コールバックを呼び出すことによって、単純にワーカー (スレッド プール) スレッドで応答を送信できます。(以下を参照してください: How does .NET make use of IO Threads or IO Completion Ports?http://blog.marcgravell.com/2009/02/async-without-pain.htmlHttpWebRequest および I/O 完了ポート)

于 2014-06-22T04:21:48.457 に答える
-1

どのようにスレッドを作成していますか? スレッドが 80 個あることがわかっているので、スレッドプール マネージャーを使用していないと思います。スレッドプール マネージャーを使用すると、好きなだけスレッドを要求でき、一度に 25 個のアクティブなスレッドしか取得できないためです。配列を使用してスレッドを手動で作成すると、実際には必要な数だけ取得できますが、それらは同じプロセス空間にあるため、別のプロセスで実行されているスレッドに制限される可能性があります。

また、スレッドがどのアパートメント スタイルで作成されているかを調べることもできます。Thread クラスの ctor はデフォルトで STA を使用していると思います。MTA を試して、パフォーマンスに影響するかどうかを確認してください。

于 2008-12-23T16:51:47.140 に答える