【发布时间】:2017-11-16 15:32:57
【问题描述】:
我正在解决我们已迁移到 asp.net core 2.0 的 asp.net 应用程序的性能/可扩展性问题。我们的应用作为应用服务托管在 azure 上,在任何中等流量的情况下都非常容易崩溃。
让我感到困惑的一件事是如何处理多个并发请求。从 I've read here 开始,Kestrel 使用多个事件循环来处理您的请求。但实际的用户代码是在 .net 线程池 (that's from here) 上处理的。
所以,作为一个实验 - 我创建了一个新的 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 秒...但是,如果我更改频率以使请求间隔一秒,那么响应时间很好 - 回到刚刚超过 1000 毫秒的预期.如果我同时处理超过 30 个请求,它似乎开始受到影响,这对我来说似乎有点低。
所以 - 我意识到我讨厌的操作方法会阻塞,但我希望它会阻塞线程池线程,因此能够处理超过 30 个的问题。
这是预期的行为吗?如果是这样,是否只是确保在不使用异步代码的情况下不会完成任何 IO 绑定工作?
【问题讨论】:
-
您的应用服务在什么实例类型上运行?
-
S3 标准,虽然它是 3 个插槽,因此流量在非核心 aspnet Web 应用程序和此应用程序之间共享,外加一个暂存插槽
-
是的,应该没问题。如果您正在运行 F1 或 D1 实例之一,我只是想排除一个明显的原因。
标签: multithreading azure asp.net-core azure-web-app-service kestrel-http-server