2

サービスがサポートできる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秒あたりのリクエスト数を確認したいと思います。私はこの方法でそれを行うことができると思いました...しかし、どうやら私はここで何かが欠けているようです...問題は何ですか?

敬具。

4

3 に答える 3

2

IMO、テストにはSoapUIを使用する方が良いでしょう。スレッド数や反復回数などのテストケースを簡単に調整できます。結果がグラフ化されます。サーバーを圧倒する高原にぶつかると、グラフに表示されます。1台のPCでは不十分な場合は、他のPCでさらに多くのPCを実行してください。あなたは無料版でこれらすべてを行うことができます。

于 2010-04-09T20:17:29.133 に答える
1

WebサーバーのCPU以外にも、多くの制限要因があります。提供できる接続の数を制限するIIS設定はたくさんあります。

私はこれを読むでしょう:

http://www.eggheadcafe.com/articles/20050613.asp

IIS 6用であることは知っていますが、まだ適用されることがあります。

MSDNにアクセスでき、VS 2010 Ultimateを使用している場合は、負荷テストツールを確認します。負荷テストプログラムの購入には費用がかかる場合がありますが、特定の何かをテストする必要がある場合は、試用版を使用して必要なことを実行できます。これを使用して、時間、サーバー使用率などを監視および応答できます。調査する価値があります。

于 2010-04-09T19:11:59.397 に答える
1

私はChrisに同意します。さらに一歩進んで、JMeterを推奨します。これは、データベースとWebアプリもすべて同じスクリプト内でテストできるためです。

于 2010-09-09T14:36:48.197 に答える