首页新闻找找看学习计划

如何让 ASP.NET Core 应用启动时线程池满血

0
悬赏园豆:200 [已解决问题] 解决于 2019-09-03 15:15

在默认配置下,ASP.NET Core 应用启动时线程池中的线程数等于 CPU 的核心数,比如4核服务器的线程数就是4,详见之前的博文 ASP.NET Core 默认线程池大小是多少

ThreadPool.ThreadCount: 4, Minimum work threads: 4, Minimum completion port threads: 4

而这点线程对高并发应用来说都不够塞牙缝。虽然 ASP.NET Core runtime 会在线程不够用时自动创建线程,但是每秒只能创建1-2个线程,等它创建好,黄花菜都凉了。

为了解决高并发场景下应用刚刚启动后的一段时间内线程不够用的问题,想在启动时就让线程池满血,比如让线程池有50个线程,请问有什么预热方法可以实现?

检查线程池线程数量的代码如下(放在 Startup.Configure 方法中):

logger.LogInformation($"ThreadPool.ThreadCount: {ThreadPool.ThreadCount}");

注:
1)ThreadPool.SetMinThreads(50, 50) 代码与 COMPlus_ThreadPool_ForceMinWorkerThreads=32 环境变量都是黄花菜都凉的方法,不可行。

Sets the minimum number of threads the thread pool creates on demand, as new requests are made, before switching to an algorithm for managing thread creation and destruction.

2)检验方法是在 Startup 中得到 ThreadPool.ThreadCount 的值为 50 。
3).NET Core 的版本 3.0 Preview 8 。

问题补充:

线程不够用现场证据

ThreadPool.ThreadCount: 5, Pending work item count: 851
dudu的主页 dudu | 高人七级 | 园豆:41025
提问于:2019-09-03 09:44

为啥我的ThreadPool.ThreadCount报错呢,没找到这个定义

MrNice 1个月前

@MrNice: 我用的是 .NET Core 3.0

dudu 1个月前
< >
分享
最佳答案
0

直接在 Startup 里开 50 个线程呗。

if (ThreadPool.SetMinThreads(50, 50))
{
    Parallel.For(0, 50, a => Thread.Sleep(1000));
}
收获园豆:150
沈星繁 | 小虾三级 |园豆:552 | 2019-09-03 12:49

好方法。

Shendu.CC | 园豆:1965 (小虾三级) | 2019-09-03 14:13
其他回答(3)
0

通常的线程池(因为自己可以搞一套实现线程池)是用到那么多,才有那么多线程,超过阀值则等待池内有可用时去使用。

因此想 在启动就有很多线程,那么你可以在启动时,去使用 很多线程【姑且叫任务TaskAs】(每个线程需保证一定时间,这个不同机器,不同指令集cpu肯定无法完全预知),但是 如果 到了TaskAs 已经跑到差不多,线程池开始回收释放了(线程数又开始下降),你的Core任务TaskBs还没来...,那么仍然无法达到一个峰值线程数。

当然实际上Task应该没你说的那么夸张 —— Task为了节约已经不是从前的用完去销毁线程本身。

因此一个比较好的方式是,自行构建线程池,策略都可以自己定义,你可以定40,而且让这40不回收。Core里面TaskBs的调用使用自己的线程池。

收获园豆:50
花飘水流兮 | 园豆:9761 (大侠五级) | 2019-09-03 10:47

自己定义线程池 可还行 2333

支持(0) 反对(0) winds_随风 | 园豆:153 (初学一级) | 2019-09-03 10:52
0

自己定义应该没问题,虽然会占用一定的资源,但是胜在比较稳定,线程用不用都会在哪里准备着。

乐途 | 园豆:206 (菜鸟二级) | 2019-09-03 16:47
0

据说,orleans里面的调度器,1秒内是可以创建1K的线程的。看博客是这么介绍的,但是没看源码。不知道它是怎么做到的。

forhells | 园豆:965 (小虾三级) | 2019-09-09 14:27
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册