c# - Azure ASP.NET WebAPI 性能

标签 c# asp.net azure

在尝试调查现实项目中的问题时,我试图深入了解 Azure Web 应用中托管的 ASP.NET WebAPI 的性能。第一步,我使用默认模板在 Visual Studio 中创建了一个 ASP.NET WebAPI 项目,其中包含以下虚拟 Controller :

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 个请求,考虑到相对简单的 Controller 方法,这对我来说似乎并不算多。

结果是:

Average time to response: 5065.38 ms
Total duration: 23028 ms

我还尝试了一个使 Controller 方法异步的版本,这不会改变结果。使用 WebClient 代替 RestSharp 也不会改变结果。

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

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

我的问题:

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

最佳答案

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

您正在执行的测试类型是尖峰或突发测试。无论 Controller 返回什么,基于线程池,特定服务器可以处理的请求数量都是有限的。线程池取决于 CPU,如果您的请求多于线程池可以处理的请求,那么它将排队。您正在进行的测试取决于 CPU,并且由于您使用的是测试/开发基础设施,因此您需要扩展实例。在达到一定限制后,您的请求就会排队。

此性能是否在给定场景的预期范围内?

我相信是的。就像我说的,您正在以非常短的时间进行请求突发。 Azure Web 应用程序并不适合峰值,除非您过度配置实例并对请求进行负载平衡。如果您知道有时会出现峰值,那么您需要研究无服务器或具有虚拟节点的 Kubernetes。否则,您必须过度配置 Azure Web 应用程序。

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

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

Load Test

Application insight

如果这是预期行为:给定场景的大致调用速率限制是多少?

App pool limits

ASP.NET Threads

建议

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

techempower benchmark

ASP.NET CORE test

希望有帮助!

关于c# - Azure ASP.NET WebAPI 性能,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55111080/

相关文章:

c# - 对其他应用程序进行同步调用

c# - 如何在运行时更新(添加/修改/删除)web.config 的 AppSettings 部分中的键

asp.net - System.Web.Http.Authorize 与 System.Web.Mvc.Authorize

c# - HTML 代码到 C# StringBuilder 工具?

rest - 访问 Azure Active Directory 用户和角色

c# - 验证 CSS 高度/宽度的规则?

c# - 如何验证此 ADFS token ?

azure - Azure 订阅所有者是否有权访问其中的 Azure 数据库?

c# - ILogger 到应用程序洞察

c# - Redis key partitioning practices with linked items