在尝试解决一个真实项目中的问题时,我正在努力了解托管在 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 次有这么难吗? - 在这种情况下,这种性能是否在预期范围内?
- 我的客户端应用程序是否存在某种错误?
- 如果这是预期行为:在这种情况下,近似调用速率限制是多少?