Azure ASP.NET WebAPI性能

内容来源于 Stack Overflow,并遵循CC BY-SA 3.0许可协议进行翻译与使用

  • 回答 (1)
  • 关注 (0)
  • 查看 (34)

在尝试调查现实生活项目中的问题时,我试图获得一些在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次有多难?
  • 在给定场景的情况下,此性能是否落在预期范围内?
  • 我的客户端应用程序中是否存在某种错误?
  • 如果这是预期的行为:给定方案的近似呼叫率限制是多少?
提问于
用户回答回答于

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

您正在进行的测试类型是尖峰或爆破测试。无论控制器返回什么,根据线程池对特定服务器可以处理的请求数量进行限制。线程池依赖于CPU,如果您有比线程池更多的请求,那么它就会排队。您正在进行的测试取决于CPU,因为您使用的是Test / Dev基础架构,所以需要扩展您的实例。在某些限制之后,您的请求将排队等候。

在给定场景的情况下,此性能是否落在预期范围内?

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

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

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

负载测试

应用洞察力

如果这是预期的行为:给定方案的近似呼叫率限制是多少?

应用池限制

ASP.NET线程

建议

如果你要参加绿色领域项目,你一定要看看asp.net核心。根据独立基准测试提供商,asp.net核心是表现最好的框架之一。它始终是我们正在使用的最佳实践,基础架构和技术堆栈的平衡。基于一个测试,当忽略下划线限制时,我们无法确定性能。做不同的测试组合,例如选择不同的OS,不同的asp.net版本,不同的区域来提出具体的结果。

techempower基准

ASP.NET CORE测试

希望有所帮助!

热门问答

cos.sliceUploadFile支持断点续传吗?

如果用的是 cos-js-sdk,那么 cos.restartTask 是会断点续传的,用法没有问题。 PS: sdk 使用可以参考 demo.js https://github.com/tencentyun/cos-js-sdk-v5/blob/master/demo/demo...... 展开详请

使用独立H5接入人脸核身,在微信浏览器拍摄视频按钮无法点击?

旺仔小小鹿

社区 · 运营 (已认证)

Less is more
推荐

使用iframe会有问题 ,微信有限制,不允许使用iframe调用jsapi摄像头 ,微信里,不能用iframe

ios应该都不行的,安卓需要看是什么浏览器。

云服务器中ping不可达,请教一下如何恢复?

推荐已采纳
本地主机 ping 不通实例可能由以下问题导致: 目标服务器的设置不正确 域名没有正确解析 链路故障 在确保本地网络正常的前提下(即您可以正常 ping 通其他网站),可根据以下操作进行排查: 检查实例是否配置公网 IP 检查安全组设置 检查系统设置 检查域名是否备案 检查域名解...... 展开详请

为什么加固之后生成四个文件?

腾讯云@移动安全

腾讯 · 移动开发工程师 (已认证)

腾讯云移动安全前端开发
推荐

选择最后一个_legu_aligned_signed.apk 文件,这个是加固并已重签名的文件。

COS Javascript SDK 为何没有 getService 方法?

因为 getService 请求的是 service.cos.myqcloud.com 或 cos.<Region>.myqcloud.com 域名,前端直接请求会导致跨域问题。 前端 js sdk 直接请求 bucket/object 相关的接口,虽然也会跨域,但你可以在 你...... 展开详请

iot设备通过mqtt协议连接,没有办法设置clientid?

DylanRichard

腾讯 · 产品经理 (已认证)

万物互联的时代,欢迎来到IoT的世界
推荐

物联网接入层有设备互踢的逻辑,如果是用同一个设备 ID 在不同地方登录,会导致其中一方被另一方踢下线。因此发现设备一直上下线时,需要确认是否有不同的人或者多线程在使用同一个设备 ID 执行登录操作。

扫码关注云+社区

领取腾讯云代金券