このコードを使用して、サーバーのストレス テストを行っています。やってみwebpound X 1000 http://local_dev.com
ました。
コードは機能しているようで、問題ありません。100 行未満で、理解するのは難しくありません。要するに、webclient を使用して、ブロックおよび非同期モードでサイトに 1 回アクセスします (したがって、その横に while ループがあります)。次に、何回成功したかを数えながらサイトに繰り返しアクセスします。
問題は、非同期モード (最初の引数として 0 を使用) で 600-850 を取得し、シングル スレッド モードでランダムに 160-350 を取得する 2 つの異なるマシンにあります。
このアプリの実行中に CPU がアイドル状態になります。タスク マネージャーによると、私の webapp は 1% に達することはありません。CPU の合計が 5% を超えることはありませんが、webpound は 2% を超えません。
ここで何が問題なのですか?サーバーはfastcgiを使用したnginxです。問題は webclient/C# にあると思われます。同じ考えを持つ私が使用できる別のツールは何ですか? または、これを変更して1秒あたりのヒット数を増やすにはどうすればよいですか?
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Net;
using System.Diagnostics;
using System.IO;
namespace webpound
{
class Program
{
static long count = 0;
static void Main(string[] args)
{
var s = new Stopwatch();
var wc = new WebClient();
int time = 100, mthread=0;
if (args.Count() == 0)
{
Console.WriteLine("[1 (for single) [ms time]] url");
return;
}
string url = null;
bool useSingle = false;
if (args.Count() == 1)
{
url = args[0];;
}
else if (args.Count() == 2)
{
useSingle = args[0] == "1";
url = args[1];
}
else if (args.Count() == 3)
{
useSingle = args[0] == "1";
time = int.Parse(args[1]);
url = args[2];
}
else
{
throw new Exception();
}
var uri = new Uri(url);
wc.Headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1";
wc.DownloadStringCompleted += DownloadStringCompletedEventHandler;
//wc.DownloadProgressChanged += DownloadProgressChangedEventHandler;
wc.DownloadString(uri);
wc.DownloadStringAsync(uri);
while (System.Threading.Interlocked.Read(ref count)==0)
{
System.Threading.Thread.Sleep(1);
}
count = 0;
WebException ex1 = null;
s.Start();
try
{
while (s.ElapsedMilliseconds < time)
{
if (useSingle)
{
wc.DownloadString(url);
count++;
}
else
{
var wwc = new WebClient();
wwc.Headers["User-Agent"] = "Mozilla/5.0 (Windows NT 6.1; WOW64; rv:2.0.1) Gecko/20100101 Firefox/4.0.1";
wwc.DownloadStringCompleted += DownloadStringCompletedEventHandler;
var url2 = url + mthread.ToString();
wwc.DownloadStringAsync(new Uri(url2));
mthread++;
System.Threading.Thread.Sleep(1);
}
}
}
catch(WebException ex)
{
ex1 = ex;
}
var mycount = count;
s.Stop();
if (ex1 == null)
{
Console.WriteLine("Finished with {0}/{1} in {2}", mycount,mthread, s.ElapsedMilliseconds);
}
else
{
var aa = new StreamReader(ex1.Response.GetResponseStream()).ReadToEnd();
Console.WriteLine(ex1.Message);
Console.WriteLine("Finished with {0}/{1} in {2}", mycount, mthread, s.ElapsedMilliseconds);
}
}
static void DownloadProgressChangedEventHandler(object sender, DownloadProgressChangedEventArgs e)
{
}
static void DownloadStringCompletedEventHandler(object sender, DownloadStringCompletedEventArgs e)
{
System.Threading.Interlocked.Increment(ref count);
}
}
}