使用ASP.NET Web API诊断性能问题

时间:2019-02-11 10:12:21

标签: asp.net asp.net-mvc performance asp.net-web-api2 iis-express

我试图弄清楚为什么我的Web服务如此之慢,并找到使它响应更快的方法。当前不涉及自定义处理(即apicontroller操作返回一个非常简单的对象)的平均响应时间约为75毫秒。

设置

机器
  • 32GB RAM,SSD磁盘,4个2.7Ghz CPU,8个逻辑处理器,x64 Windows 10
软件
  • 1个在IISEXPRESS上运行.net 4.0的asp.net mvc网站(System.Web.Mvc v5.2.7.0)
  • 1个在IISEXPRESS(System.Net.Http v4.2.0.0)上运行.net 4.0的asp.net Web API网站
  • 1条RabbitMQ消息总线

Asp.net Web API代码(Api控制器操作)

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

此方法的主体耗时2ms。 Stackify告诉我AuthenticationFilterResult.ExecuteAsync方法有很多开销,但是由于它是asp.net,因此我认为无法对其进行优化。

Asp.net MVC代码(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;
}

在后端Rest服务上尽快执行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
  1. 删除了所有RabbitMQ消息总线连接,以确保它不是罪魁祸首。我还从其余方法_messageBus.Publish<IWebsiteNotificationCreated>(new { Notification = notification });中删除了messagebus publish方法,因此它所要做的就是在包装对象内部返回1。

  2. 后端的其余部分正在使用带有承载令牌身份验证的身份框架,并且为了消除其中的大部分,我还尝试将其余服务上的控制器操作标记为AllowAnonymous。

  3. 以发布模式运行项目:无更改

  4. 对样本100进行两次请求以排除服务初始化费用:无变化

所有这些尝试之后,问题仍然存在,每个请求仍将花费大约+-75毫秒。这样低吗?

这是后端的堆栈日志,其中应用了以上更改。 stackify performance log

Web服务仍然很慢,这是不需花费昂贵的硬件升级就能达到的最快速度吗?还是我可以研究一下其他原因来弄清楚是什么使我的Web服务这么慢?

0 个答案:

没有答案