サービスがサポートできる1秒あたりのリクエスト数をテストする小さなアプリケーションを開発しようとしていますが、何か間違っていると思います。サービスは開発の初期段階ですが、パフォーマンスを低下させるようなことをしていないことを時々確認するために、このテストを手元に置いておきたいと思います。問題は、WebサーバーまたはデータベースサーバーをCPUの100%に接続できないことです。
私は3つの異なるコンピューターを使用しています。1つはWebサーバー(WinSrv Standard 2008 x64 IIS7)、もう1つはデータベース(Win 2K、SQL Server 2005)、最後は私のコンピューター(Win7 x64 Ultimate)です。テストを実行します。コンピューターは100イーサネットスイッチを介して接続されています。要求POSTは9バイトで、応答は842バイトになります。
テストは複数のスレッドを起動し、各スレッドにはwhile
ループがあり、各ループでWebRequest
オブジェクトを作成し、呼び出しを実行し、共通カウンターをインクリメントして1〜5ミリ秒待機してから、再度実行します。
static int counter = 0;
static void Main(string[] args)
{
ServicePointManager.DefaultConnectionLimit = 250;
Console.WriteLine("Ready. Press any key...");
Console.ReadKey();
Console.WriteLine("Running...");
string localhost = "localhost";
string linuxmono = "192.168.1.74";
string server = "192.168.1.5:8080";
DateTime start = DateTime.Now;
Random r = new Random(DateTime.Now.Millisecond);
for (int i = 0; i < 50; i++)
{
new Thread(new ParameterizedThreadStart(Test)).Start(server);
Thread.Sleep(r.Next(1, 3));
}
Thread.Sleep(2000);
while (true)
{
Console.WriteLine("Request per second :"
+ counter / DateTime.Now.Subtract(start).TotalSeconds);
Thread.Sleep(3000);
}
}
public static void Test(object ip)
{
Guid guid = Guid.NewGuid();
Random r = new Random(DateTime.Now.Millisecond);
while (true)
{
String test = "<lalala/>";
WebRequest req = WebRequest.Create("http://"
+ (string) ip + "/WebApp/" + guid.ToString()
+ "/Data/Tables=whatever");
req.Method = "POST";
req.ContentType = "application/xml";
req.Credentials = new NetworkCredential("aaa", "aaa","domain");
byte[] array = Encoding.UTF8.GetBytes(test);
req.ContentLength = array.Length;
using (Stream reqStream = req.GetRequestStream())
{
reqStream.Write(array, 0, array.Length);
reqStream.Close();
}
using (Stream responseStream = req.GetResponse().GetResponseStream())
{
String response = new StreamReader(responseStream).ReadToEnd();
if (response.Length != 842) Console.Write(" EEEE ");
}
Interlocked.Increment(ref counter);
Thread.Sleep(r.Next(1,5));
}
}
テストを実行すると、どちらのコンピューターもCPUを過度に使用しません。たとえば、1秒あたりXリクエストを取得し、コンソールアプリケーションを同時に2回実行すると、それぞれで1秒あたりX / 2リクエストを取得します...それでもWebサーバーはCPUの30%であり、 25%のデータベースサーバー...
ループ内のを削除しようとしましたThread.Sleep
が、大きな違いはありません。
マシンを最大限に活用して、1秒あたりのリクエスト数を確認したいと思います。私はこの方法でそれを行うことができると思いました...しかし、どうやら私はここで何かが欠けているようです...問題は何ですか?
敬具。