【问题标题】:What would be the memory consumption difference if we use non-async instead of async for asp.net/web api?如果我们对 asp.net/web api 使用非异步而不是异步,那么内存消耗的差异是什么?
【发布时间】:2020-12-22 01:38:56
【问题描述】:

据我所知,当线程池的线程被阻塞时,CLR 必须创建一个新线程。每个线程占用大约 1mb 的内存。假设服务器每秒收到 10K 请求。就内存消耗而言,在这种情况下不使用异步的成本是多少?

【问题讨论】:

  • 服务一个请求平均需要多少时间?
  • 请求最终会进行 1-2 db 调用。假设 50-150 毫秒。

标签: c# asp.net-web-api async-await


【解决方案1】:

每秒 10,000 个请求 * 每个请求 0.1 秒 = 平均同时处理 1,000 个请求。

由于不使用异步,每个请求将使用ThreadPool 中的一个线程,因此ThreadPool 最终会创建大约 1,000 个线程来满足需求。因此,您的问题的答案,即不使用异步的成本,并假设异步情况下的线程数足够小可以忽略不计,是 1,000 x 1MB = 1GB 额外内存强>.

¹ 或立即,如果您配置了按需立即创建的线程数,则使用ThreadPool.SetMinThreads 方法。

【讨论】:

    【解决方案2】:

    当所有线程池线程都被阻塞时,CLR 不会创建新线程。它“不情愿地”在界限内增长线程池。

    从 .NET Framework 4 开始,线程池创建和 销毁工作线程以优化吞吐量,即 定义为单位时间内完成的任务数。太少了 线程可能无法最佳利用可用资源,而 许多线程可能会增加资源争用。

    The managed thread pool

    就内存消耗而言,使用异步有什么好处吗?

    也许吧。如果您有大量并发请求正在等待后端资源,则 async 允许您处理具有较少线程的请求。更少的线程意味着更少的线程堆栈内存。然而并发请求自身会消耗内存。因此,如果线程池减少了并发请求的数量,它也可以减少使用的内存量。

    【讨论】:

    • 感谢您的回复!在内存消耗方面使用异步有什么好处吗?
    • 是的,线程池队列可以在线程池决定扩展之前吸收大量待处理的工作。当您发现自己摆弄线程池参数以“使其更快”时,您可能需要重新设计。我听说async 很适合这种事情:)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-03-10
    • 2015-07-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多