Диагностика проблемы с производительностью с помощью веб-API asp.net - PullRequest
0 голосов
/ 11 февраля 2019

Я пытаюсь выяснить, почему мой веб-сервис работает медленно, и найти способы заставить его реагировать быстрее.Текущее среднее время отклика без специальной обработки (то есть действие apicontroller, возвращающее очень простой объект) составляет около 75 мс.

Настройка

Машина:
  • 32 ГБ ОЗУ,SSD-диск, 4 x 2,7 ГГц ЦП, 8 логических процессоров, x64 Windows 10
Программное обеспечение:
  • 1 веб-сайт asp.net mvc, работающий с .net 4.0 на IISEXPRESS (система.Web.Mvc v5.2.7.0)
  • 1 Веб-сайт API ASP.NET, работающий с .net 4.0 на IISEXPRESS (System.Net.Http v4.2.0.0)
  • 1 Шина сообщений RabbitMQ

Код веб-API Asp.net (действие контроллера Api)

[Route("Send")]
[HttpPost]
[AllowAnonymous)
public PrimitiveTypeWrapper<long> Send(WebsiteNotificationMessageDTO notification)
{
    _messageBus.Publish<IWebsiteNotificationCreated>(new { Notification = notification });
    return new PrimitiveTypeWrapper<long>(1);
}

Тело этого метода занимает 2 мс.Stackify говорит мне, что метод AuthenticationFilterResult.ExecuteAsync требует много ресурсов, но поскольку это asp.net, я не думаю, что его можно оптимизировать слишком много.

Код MVC Asp.net (действие контроллера MVC)

Реализация RestClient показана ниже.HttpClientFactory возвращает новый экземпляр HttpClient с необходимыми заголовками и базовым путем.

public async Task<long> Send(WebsiteNotificationMessageDTO notification)
{
    var result = await _httpClientFactory.Default.PostAndReturnAsync<WebsiteNotificationMessageDTO, PrimitiveTypeWrapper<long>>("/api/WebsiteNotification/Send", notification);
    if (result.Succeeded)
        return result.Data.Value;

    return 0;
}

Выполнение 100 запросов как можно быстрее на службе бэкэнда отдыха:

[HttpPost]
public async Task SendHundredNotificationsToMqtt()
{
    var sw = new Stopwatch();
    sw.Start();
    for (int i = 0; i < 100; i++)
    {
        await _notificationsRestClient.Send(new WebsiteNotificationMessageDTO()
        {
            Severity = WebsiteNotificationSeverity.Informational,
            Message = "Test notification " + i,
            Title = "Test notification " + i,
            UserId = 1
        });
    }
    sw.Stop();
    Debug.WriteLine("100 messages sent, took {0} ms", sw.ElapsedMilliseconds);
}

Это занимает в среднем 7,5секунд.

Вещи, которые я пробовал

  1. Проверено количество доступных потоков в службе REST и на веб-сайте MVC:

    int workers; int completions; System.Threading.ThreadPool.GetMaxThreads(out workers, out completions);

, который вернулся для обоих:

Workers: 8191
Completions: 1000

Удалено все подключение к шине RabbitMQ, чтобы гарантировать, что оно не является виновником.Я также удалил метод публикации messagebus из метода rest _messageBus.Publish<IWebsiteNotificationCreated>(new { Notification = notification }); Так что все, что он делает, это возвращает 1 внутри объекта-обертки.

Остальная часть бэкэнда использует каркас идентификации с токеном носителя.аутентификации и для устранения большинства из них, я также попытался пометить действие контроллера в службе отдыха как AllowAnonymous.

Запустил проект в режиме Release: без изменений

Дважды выполнял выборку 100 запросов, чтобы исключить затраты на инициализацию службы: без изменений

После всех этих попыток проблема остается, она все равно будет занимать около + - 75 мс на запрос.Это так низко?

Вот журнал стека для бэкэнда с примененными выше изменениями.stackify performance log

Веб-служба работает медленно, работает ли она без дорогостоящего обновления оборудования или есть что-то еще, что я могу изучить, чтобы выяснить, что делает мой вебСлужба это медленно?

...