首页
学习
活动
专区
工具
TVP
发布
社区首页 >问答首页 >Azure ASP.NET WebAPI性能

Azure ASP.NET WebAPI性能
EN

Stack Overflow用户
提问于 2019-03-12 06:03:39
回答 1查看 661关注 0票数 4

当我试图调查一个真实项目中的问题时,我试图对托管在Azure web应用程序中的ASP.NET WebAPI的性能有一些了解。作为第一步,我使用默认模板在Visual Studio中创建了一个ASP.NET WebAPI项目,其中包含以下虚拟控制器:

代码语言:javascript
复制
public class ValuesController : ApiController
{
    // GET api/values
    public IEnumerable<string> Get()
    {
        return new string[] { "value1", "value2" };
    }

    // ...
}

我将该应用程序接口部署到D1 Azure web应用程序:

代码语言:javascript
复制
Shared infrastructure 
1 GB memory 
240 minutes/day compute

然后,我实现了一个简单、快速而又脏的客户端控制台应用程序:

代码语言:javascript
复制
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();

这个小的压力测试在10秒的时间范围内发送1000个请求,对于我来说,考虑到相对简单的控制器方法,这似乎不是很多。

结果是:

代码语言:javascript
复制
Average time to response: 5065.38 ms
Total duration: 23028 ms

我还尝试了一个使控制器方法异步的版本,它不会改变结果。使用WebClient而不是RestSharp也不会改变结果。

根据资源监视器的数据,网络流量仅为2.5 kB/s左右。

当以较大的间隔(>1000ms)发送请求时,响应时间约为270ms,我认为这是一个合理的数量级。

我的问题:

  • 为什么这么慢??返回{ "value1", "value2" } 1000次有多难?
  • 在给定场景下,此性能是否落在预期范围内?
  • 我的客户端应用程序中是否存在某种错误?
  • 如果这是预期行为:给定场景的大致调用速率限制是多少?
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-03-12 07:52:43

为什么这么慢??1000次返回{ "value1","value2“}能有多难?

您正在执行的测试类型是尖峰测试或突发测试。无论哪个控制器返回,基于线程池,特定服务器可以处理的请求数都是有限制的。线程池依赖于CPU,如果你有超过线程池可以处理的请求,那么你正在做的queued.The测试取决于CPU,而且由于你使用的是测试/开发基础设施,你需要扩展你的实例。超过一定限制后,您的请求将排入队列。

在这种情况下,性能是否落在预期范围内?

我相信是的。就像我说的,你正在做请求突发和非常短的提升。Azure web应用程序不适合峰值,除非您过度配置实例并对请求进行负载平衡。如果您知道有时会出现峰值,那么您需要考虑使用虚拟节点的无服务器或Kubernetes。否则你不得不过度配置azure web应用程序。

我的客户端应用程序中有没有什么bug?

您可以使用专业工具来更好地收集结果。例如,打开应用程序洞察并获得对服务器性能的实际洞察。JMeter在测试方面是不错的。您还可以查看Azure web应用程序负载测试。我建议的原因是,您可以从另一个角度来了解服务器是如何处理请求的,以及为什么它会花费这么多时间。

Load Test

Application insight

如果这是预期行为:在这种情况下,大致的呼叫速率限制是什么?

App pool limits

ASP.NET Threads

Recommendations

如果你正在进行一个全新的项目,你绝对应该研究一下asp.net核心。根据独立基准提供商的说法,asp.net核心是性能最好的框架作品之一。它始终是我们正在使用的最佳实践、基础设施和技术堆栈的平衡。基于一个测试,当我们忽略下划线的限制时,我们不能确定性能。做不同的测试组合,例如选择不同的操作系统,不同的asp.net版本,不同的地域,得出具体的结果。

techempower benchmark

ASP.NET CORE test

希望这能有所帮助!

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55111080

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档