私は現在、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 秒に達するまで急速に上昇します (まだ上昇しています)。10
responseDuration
100
responseDuration
私は何か間違ったことをしているかもしれないと思ったので、標準のWeb テスト計画のセットアップでApache jMeterも実行し、ユーザーを 100 に設定しました。約 300 のサンプルの後、応答時間は約 40 秒に急上昇しました。
サーバーが限界に達しているのではないかと疑っています。サーバーのタスク マネージャーは、16GB のうち 2GB しか使用されておらず、プロセッサが約 5% の負荷でハングしていることを示しています。
- クライアント コンピュータの同時接続数が制限に達している可能性はありますか? もしそうなら、どうすればこれを変更できますか?
- コードで何かをするのを忘れていませんか? 接続をクリーンアップ/クローズしますか?
- 私のコードは問題なく、実際にトラフィックを処理できないのは私のサーバーなのでしょうか?
参考までに、上記のコードを実行しているクライアント コンピューターは Windows 7 を実行しており、テストしているサーバーと同じネットワーク上にあります。サーバーは Windows Server 2008 IIS 7.5 を実行しており、専用の 8 コア 16GB RAM マシンです。