Я пытаюсь выяснить, почему мой веб-сервис работает медленно, и найти способы заставить его реагировать быстрее.Текущее среднее время отклика без специальной обработки (то есть действие 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секунд.
Вещи, которые я пробовал
Проверено количество доступных потоков в службе 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 мс на запрос.Это так низко?
Вот журнал стека для бэкэнда с примененными выше изменениями.
Веб-служба работает медленно, работает ли она без дорогостоящего обновления оборудования или есть что-то еще, что я могу изучить, чтобы выяснить, что делает мой вебСлужба это медленно?