【问题标题】:Thread management in asp.net core / kestrelasp.net core / kestrel中的线程管理
【发布时间】: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


【解决方案1】:

这是预期的行为吗?如果是这样,是否只是确保在不使用异步代码的情况下不会完成任何 IO 绑定工作?

根据我的经验,这似乎是预期的行为。我们可以从这个blog得到答案。

现在假设您在 IIS 上运行 ASP.Net 应用程序,并且您的 Web 服务器总共有四个 CPU。假设在任何给定时间点,有 100 个请求需要处理。默认情况下,运行时将创建四个线程,它们可用于服务前四个请求。因为在 500 毫秒 过去之前不会添加额外的线程,所以其他 96 个请求将不得不在队列中等待。 500 毫秒 过后,会创建一个新线程。

如您所见,要赶上工作负载需要 100*500ms 个间隔。

这是使用asynchronous programming 的一个很好的理由。使用异步编程,在处理请求时线程不会被阻塞,因此几乎可以立即释放四个线程。

我建议您可以使用异步代码来提高性能。

public async Task<ActionResult> Wait1()
{
    await Task.Delay(TimeSpan.FromSeconds(15));
    return new StatusCodeResult((int)HttpStatusCode.OK);
}

我还找到了另一个SO thread,你可以参考一下。

【讨论】:

  • 干杯。奇怪的是,我有这个站点的 asp.net(非核心)版本,它处理负载比 asp.net 核心版本好得多。我同意异步是部分答案,但我仍然困惑为什么核心在处理这个测试方面做得如此糟糕。
  • 您的 oldschool 应用程序可能配置为使用一些较高的 minthreads 值——这对于现代异步应用程序来说是不合适的。一个设计良好的应用只使用与内核数量相当的线程数。
猜你喜欢
  • 2017-07-19
  • 1970-01-01
  • 2017-02-18
  • 2020-07-05
  • 2022-10-09
  • 2019-10-10
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多