我正在解决一个性能/可扩展性问题,我们将一个asp.net应用迁移到了asp.net core 2.0。我们的应用作为应用服务在Azure上托管,并且在任何中等流量下都很容易崩溃。
有一件令我困惑的事情是如何处理多个并发请求。根据我在这里读到的,Kestrel使用多个事件循环来处理您的请求。但实际用户代码是在.NET线程池上处理的(来自此处)。
所以,作为一个实验 - 我创建了一个新的asp.net core 2.0 MVC应用程序,并添加了一个相当恶劣的操作方法:
[AllowAnonymous]
public ActionResult Wait1()
{
System.Threading.Tasks.Task.Delay(1000).Wait();
return new StatusCodeResult((int)HttpStatusCode.OK);
}
现在,当我将此推送到Azure时,如果我同时发送100个请求,那么我应该没问题,因为100个请求听起来像是轻负载,对吧?等待将发生在线程池线程上,对吗?
所以-我就这样做了,并得到了一些相当糟糕的结果-示例用红色突出:
嗯,不是我期望的结果,每个请求大约需要50秒...但是,如果我更改频率,使请求间隔一秒钟,那么响应时间就很好-回到预期的1000ms左右。似乎如果我一次超过30个请求,它就开始遇到问题,这对我来说有点低。
所以-我意识到我的恶劣作用方法会阻塞,但我本来希望它在线程池线程上阻塞,从而能够处理比我的30个更多的请求。
这是预期行为吗-如果是,那么只需确保不使用异步代码进行IO绑定工作即可吗?