Небольшой тест производительности на веб-сервисе - PullRequest
2 голосов
/ 09 апреля 2010

Я пытаюсь разработать небольшое приложение, которое проверяет, сколько запросов в секунду может поддерживать мой сервис, но я думаю, что делаю что-то не так. Сервис находится на ранней стадии разработки, но я хотел бы иметь этот тест под рукой, чтобы время от времени проверять, не делаю ли я что-то, что снижает производительность. Проблема в том, что я не могу заставить веб-сервер или сервер базы данных перейти на 100% ЦП.

Я использую три разных компьютера, на одном - веб-сервер (WinSrv Standard 2008 x64 IIS7), в другой - база данных (Win 2K, SQL Server 2005), а последним - мой компьютер (Win7 x64 Ultimate), где Я проведу тест. Компьютеры подключены через 100 Ethernet-коммутатор. 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));
    }
}

Если я запускаю тест, ни один из компьютеров не загружает ЦП. Допустим, я получаю X запросов в секунду, если я запускаю консольное приложение два раза в одно и то же время, я получаю X / 2 запросов в секунду в каждом из них ... но веб-сервер все еще находится на 30% ЦП, сервер базы данных на 25% ...

Я пытался удалить Thread.Sleep в цикле, но это не имеет большого значения.

Я бы хотел поставить машины на максимум, чтобы проверить, сколько запросов в секунду они могут предоставить. Я догадался, что смогу сделать это таким образом ... но, видимо, я что-то здесь упускаю ... В чем проблема?

С уважением.

Ответы [ 3 ]

2 голосов
/ 10 апреля 2010

IMO, вам лучше использовать SoapUI для теста. Вы можете легко настроить тестовый набор для количества потоков, количества итераций и т. Д. И он будет отображать результаты. Когда вы попадете на плато, где вы перегружаете сервер, вы увидите это на графике. Если одного компьютера недостаточно, просто запустите их на других компьютерах. Вы можете сделать все это с бесплатной версией.

1 голос
/ 09 сентября 2010

Я согласен с Крисом и пошёл бы дальше, чтобы порекомендовать JMeter, поскольку он также может тестировать базу данных и веб-приложение в одном и том же сценарии.

1 голос
/ 09 апреля 2010

Есть много ограничивающих факторов, кроме процессора на веб-сервере. Существует множество настроек IIS, которые ограничивают количество обслуживаемых соединений.

Я бы прочитал это:

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

Я знаю, что это для IIS 6, но есть вещи, которые все еще будут применяться.

Если у вас есть доступ к MSDN и у вас VS 2010 Ultimate, я бы проверил их инструменты нагрузочного тестирования. Приобретение программы нагрузочного тестирования может быть дорогостоящим, но если вам нужно протестировать что-то конкретное, вы можете использовать пробную версию, чтобы выполнить то, что вам нужно. Вы можете использовать его для мониторинга и времени отклика, использования сервера и т. Д. На это стоит обратить внимание.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...