繁体   English   中英

如果我们对 asp.net/web api 使用非异步而不是异步,内存消耗会有什么不同?

[英]What would be the memory consumption difference if we use non-async instead of async for asp.net/web api?

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

每当所有线程池线程都被阻塞时,CLR 不会创建新线程。 它在一定范围内“不情愿地”增加线程池。

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

托管线程池

在内存消耗方面使用异步有什么好处吗?

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

每秒 10,000 个请求 * 每个请求 0.1 秒 = 平均并发服务 1,000 个请求。

通过不使用异步,每个请求将使用ThreadPool一个线程,因此最终 1,000 个线程将由ThreadPool创建以满足需求。 所以你的问题的答案是不使用异步的成本,并假设异步情况下的线程数小到可以忽略不计,是 1,000 x 1MB = 1GB of extra memory

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM