Azure ASP.NET WebAPI 性能

5

在尝试解决一个真实项目中的问题时,我正在努力了解托管在 Azure Web 应用程序中的 ASP.NET WebAPI 的性能。作为第一步,我使用 Visual Studio 中的默认模板创建了一个 ASP.NET WebAPI 项目,其中包含以下虚拟控制器之一:

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

    // ...
}

我将API部署到了一个D1的Azure Web应用程序:

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();

这个小型压力测试在10秒的时间范围内发送了1000个请求,考虑到相对简单的控制器方法,这似乎并不算太多。
结果是:
Average time to response: 5065.38 ms
Total duration: 23028 ms

我还尝试了一个版本,将控制器方法变为异步,但结果并没有改变。使用WebClient而不是RestSharp也不会改变结果。

根据资源监视器的显示,网络流量很小,约为2.5 kB/s。

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

我的问题:

  • 为什么速度这么慢?返回 { "value1", "value2" } 1000 次有这么难吗?
  • 在这种情况下,这种性能是否在预期范围内?
  • 我的客户端应用程序是否存在某种错误?
  • 如果这是预期行为:在这种情况下,近似调用速率限制是多少?
1个回答

4

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

你正在进行的测试是一种突发或爆发测试。无论控制器返回什么,都有一个基于线程池的特定服务器可以处理的请求数量限制。线程池取决于 CPU,如果您的请求超过线程池可以处理的数量,则会排队。您正在进行的测试取决于 CPU,并且由于您正在使用测试/开发基础结构,因此需要扩展实例。在某些限制之后,您的请求正在排队。

这种性能是否符合场景的预期范围?

我认为是的。就像我所说的,您正在进行请求突发,并且上升时间非常短。Azure Web 应用程序不适合突发,除非您过度提供实例并负载平衡请求。如果您知道自己有时会出现峰值,则需要查看具有虚拟节点的无服务器或 Kubernetes。否则,您必须过度提供 Azure Web 应用程序。

我的客户端应用程序中是否存在某种错误?

您可以使用专业工具来获得更好的结果收集。例如,打开应用程序洞察并获取服务器性能的实际洞察。JMeter在测试方面表现不错。您还可以查看Azure Web应用程序负载测试。我建议这么做的原因是您可以从另一个角度了解服务器如何处理请求以及为什么需要这么长时间。 负载测试 应用程序洞察 如果这是预期行为:给定场景下的大致调用率限制是多少? 应用程序池限制 ASP.NET线程 建议 如果你正在进行绿地项目,你应该一定要考虑使用asp.net core。根据独立的基准测试提供者,asp.net core是最高性能的框架之一。我们使用的最佳实践、基础设施和技术堆栈总是需要平衡。根据一个测试,当我们忽略了下划线限制时,我们不能确定性能。进行不同的测试组合,例如选择不同的操作系统、不同的asp.net版本、不同的地区,以得出具体的结果。 techempower benchmark ASP.NET CORE test 希望这可以帮到你!

1
非常感谢您提供如此全面的回答!我会仔细研究您提供的链接和建议! - Marc
很高兴能够帮到你! - Imran Arshad
1
@kamran Azure Web Apps在幕后启动虚拟机,需要一些时间来准备并处理请求。这可能需要几秒钟到几分钟的时间。如果您遇到突发流量,并且您的自动缩放器尝试在扩展期间缩放任何请求,则会丢弃该请求,如果您现有的实例已经负载过高。因此,通常情况下Azure Web Apps与预测性负载配合良好。对于突发流量,您可以预先配置实例,但这是一种昂贵的方法。 - Imran Arshad

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接