Маленький тест на производительность на веб-сервисе

StackOverflow https://stackoverflow.com/questions/2610139

Вопрос

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

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

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

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

С уважением.

Это было полезно?

Решение

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

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

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

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

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

Другие советы

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

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

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top