Производительность веб-интерфейса Azure ASP.NET - PullRequest
4 голосов
/ 12 марта 2019

Пытаясь исследовать проблему в реальном проекте, я пытаюсь получить представление о производительности ASP.NET WebAPI, размещенного в веб-приложении Azure. В качестве первого шага я создал проект ASP.NET WebAPI в Visual Studio, используя шаблон по умолчанию, который содержит, среди прочего, следующий фиктивный контроллер:

public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // ...
}

Я развернул API в веб-приложении D1 Azure:

Shared infrastructure 
1 GB memory 
240 minutes/day compute

Затем я реализовал простое, быстрое и грязное клиентское консольное приложение:

var client = new RestClient("https://foo.azurewebsites.net/api/");
var request = new RestRequest("values", Method.GET);

var callsToExecute = 1000;
var totalElapsed = .0;
var responseCount = 0;

var totalSw = new Stopwatch();
totalSw.Start();

for (var i = 0; i < callsToExecute; i++)
{
    var sw = new Stopwatch();
    sw.Start();
    client.ExecuteAsync(request, (r, h) => {
        sw.Stop();
        totalElapsed += sw.ElapsedMilliseconds;
        responseCount++;
        if (responseCount == callsToExecute) totalSw.Stop();
    });

    Thread.Sleep(10);
}

while(responseCount < callsToExecute)
{
    Thread.Sleep(1000);
}

System.Console.WriteLine("Average time to response: " + totalElapsed / callsToExecute);
System.Console.WriteLine("Total duration: " + totalSw.ElapsedMilliseconds);
System.Console.ReadLine();

Этот небольшой стресс-тест отправляет 1000 запросов с интервалом в 10 секунд, что не так уж много для меня, учитывая сравнительно простой метод контроллера.

Результат:

Average time to response: 5065.38 ms
Total duration: 23028 ms

Я также попробовал версию, делающую метод контроллера асинхронным, который не меняет результаты. Использование WebClient вместо RestSharp также не меняет результаты.

По данным Resource Monitor, сетевой трафик незначителен и составляет около 2,5 кБ / с.

Время ответа при отправке запросов с большими интервалами (> 1000 мс) составляет около 270 мс, что на порядок я считаю разумным.

Мои вопросы:

  • Почему это так медленно ?? Насколько сложно вернуть { "value1", "value2" } 1000 раз?
  • Достигается ли эта производительность в ожидаемом диапазоне с учетом сценария?
  • Есть ли какая-то ошибка в моем клиентском приложении?
  • Если это ожидаемое поведение: каковы приблизительные пределы скорости вызовов с учетом сценария?

1 Ответ

3 голосов
/ 12 марта 2019

Почему это так медленно ??Насколько сложно может быть 1000 {? Value1 ',' value2 '} 1000 раз?

Тип теста, который вы выполняете, - тест на скачок или разрыв.Независимо от того, что возвращает контроллер, существует ограничение на количество запросов, которые конкретный сервер может обработать на основе пула потоков.Пул потоков зависит от ЦП. Если у вас больше запросов, чем может обработать пул потоков, он будет поставлен в очередь. Тест, который вы выполняете, зависит от ЦП, и, поскольку вы используете инфраструктуру Test / Dev, вам необходимо увеличить свой экземпляр.После определенных ограничений ваши запросы будут поставлены в очередь.

Достигается ли эта производительность в ожидаемом диапазоне с учетом сценария?

Я считаю, что да.Как я уже сказал, вы делаете запрос с очень коротким увеличением.Веб-приложения Azure не идеальны для всплесков, если вы не предоставили слишком много экземпляров и не сбалансировали запросы.Если вы знаете, что время от времени вы будете получать всплески, вам нужно изучить виртуальные узлы без серверов или Kubernetes.Иначе вам придется перезаписать лазурные веб-приложения.

Есть ли какая-то ошибка в моем клиентском приложении?

Вы можете использовать профессиональные инструменты для лучшего сбора результатов.например, включите понимание приложения и получите фактическое представление о производительности сервера.JMeter приличный с точки зрения тестирования.Вы также можете посмотреть нагрузочный тест веб-приложения Azure.Причина, по которой я предлагаю, заключается в том, что у вас есть еще один взгляд на то, как сервер обрабатывает запрос и почему это займет так много времени.

нагрузочный тест

понимание приложения

Если это ожидаемое поведение: каковы приблизительные пределы скорости вызововс учетом сценария?

Ограничения пула приложений

Потоки ASP.NET

Рекомендации

Если вы идете с проектом зеленого поля, вам определенно стоит заглянуть в ядро ​​asp.net.По мнению независимых поставщиков тестов, ядро ​​asp.net является одним из самых эффективных фреймворков.Это всегда баланс лучших практик, инфраструктуры и технического стека, который мы используем.Основываясь на одном тесте, мы не можем определить производительность, игнорируя подчеркнутые ограничения.Выполните различные комбинации тестирования, например, выберите другую ОС, другую версию asp.net, другой регион, чтобы получить конкретные результаты.

тест Techempower

Тест ASP.NET CORE

Надеюсь, что помогает!

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