2

私は現在、Web サイトの負荷テストを行うための小さなアプリケーションを作成していますが、いくつか問題があります。

List<string> pageUrls = new List<string();
// NOT SHOWN ... populate the pageUrls with thousands of links

var parallelOptions = new System.Threading.Tasks.ParallelOptions();
parallelOptions.MaxDegreeOfParallelism = 100;
System.Threading.Tasks.Parallel.ForEach(pageUrls, parallelOptions, pageUrl =>
{
    var startedOn = DateTime.UtcNow;

    var request = System.Net.HttpWebRequest.Create(pageUrl);

    var responseTimeBefore = DateTime.UtcNow;

    try
    {
        var response = (System.Net.HttpWebResponse)request.GetResponse();
        responseCode = response.StatusCode.ToString();
        response.Close();
    }
    catch (System.Net.WebException ex)
    {
        // NOT SHOWN ... write to the error log
    }

    var responseTimeAfter = DateTime.UtcNow;

    var responseDuration = responseTimeAfter - responseTimeBefore;

    // NOT SHOWN ... write the response duration out to a file

    var endedOn = DateTime.UtcNow;

    var threadDuration = endedOn - startedOn;

    // sleep for one second
    var oneSecond = new TimeSpan(0, 0, 1);
    if (threadDuration < oneSecond)
    {
        System.Threading.Thread.Sleep(oneSecond - threadDuration);
    }
}
);

すべて正常に動作するMaxDegreeOfParallelismように を低い値に設定すると、は 1 秒から 3 秒の間に留まります。値を(例のように)に増やすと、約 300 の要求の後、25 秒に達するまで急速に上昇します (まだ上昇しています)。10responseDuration100responseDuration

私は何か間違ったことをしているかもしれないと思ったので、標準のWeb テスト計画のセットアップでApache jMeterも実行し、ユーザーを 100 に設定しました。約 300 のサンプルの後、応答時間は約 40 秒に急上昇しました。

サーバーが限界に達しているのではないかと疑っています。サーバーのタスク マネージャーは、16GB のうち 2GB しか使用されておらず、プロセッサが約 5% の負荷でハングしていることを示しています。

  1. クライアント コンピュータの同時接続数が制限に達している可能性はありますか? もしそうなら、どうすればこれを変更できますか?
  2. コードで何かをするのを忘れていませんか? 接続をクリーンアップ/クローズしますか?
  3. 私のコードは問題なく、実際にトラフィックを処理できないのは私のサーバーなのでしょうか?

参考までに、上記のコードを実行しているクライアント コンピューターは Windows 7 を実行しており、テストしているサーバーと同じネットワーク上にあります。サーバーは Windows Server 2008 IIS 7.5 を実行しており、専用の 8 コア 16GB RAM マシンです。

4

2 に答える 2

2

MaxDegreeOfParallelism は、プログラム戦略の一部として使用するコア数を制限しようとしている場合にのみ使用してください。

デフォルトでは、Parallel ライブラリは利用可能なスレッドの最大数を利用します。そのため、このオプションを任意の数に設定すると、ほとんどの場合、それを実行している環境に応じてパフォーマンスが制限されます。

このオプションを設定せずにこのコードを実行すると、パフォーマンスが向上するはずです。

MSDN の ParallelOptions.MaxDegreeOfParallelism プロパティ- 詳細については、備考セクションを参照してください。

于 2012-12-10T18:42:00.340 に答える
1

いくつかの提案:

  1. 記録されたJmeterテストスクリプトの大きさはどれくらいですか?思考時間を挿入しましたか?テストが大きいほど、負荷は重くなります。
  2. テスト実行中に競合するトラフィックによってLANが使用されていないことを確認してください。ギガビットイーサネットスイッチが必須です。
  3. 2〜3台のスレーブマシンを使用し、ツリーのようなJmeterで重い結果ロガーを使用しないようにしてください。これらのグラフと結果を最小化するのは正しいことです。
于 2012-12-12T11:16:17.473 に答える