线程池最大线程数的澄清

18

我在这里读到:

在v2.0、3.5和4.0中,ASP.NET使用每个处理器(core)100个线程来初始化CLR线程池。

这是正确的,我进行了检查 (我的机器有8个内核,所以8*100 = 800):

enter image description here

但是后来我看到了这个这个

maxWorkerThreads - 配置要基于每个 CPU 使用的进程的最大工作线程数。此属性的范围为5 到 100。默认值为20

问题

我看不出这些数字如何相符:

第一段说明我有每个核心最多 100 个线程(图像证明了这一点,我有8个内核)。

但是第二段说明每个核心的默认最大工作线程数为20。因此,如果我有8个内核,那么我必须有8*20 = 160个最大线程,而不是800个。

有人能解释一下吗?

更新:

我刚刚发现了一种通过C#代码获取关键元素值的方法:

在此输入图片描述

现在,数字都适合了,但是 - MSDN说默认值为20,而不是100

在此输入图片描述

然后他们确实提到了100:

在此输入图片描述

这里发生了什么?


你混淆了ThreadPool线程和ASP.NET工作线程。虽然这是一件好奇的事情,但对于所有实际应用来说都是错误的:当你询问最大线程数时,你已经在做错事情了。工作线程的数量更多地属于服务器管理员的领域,而不是开发人员的领域。 - H H
@HenkHolterman 他们不是一样的吗?asp.net使用线程池线程,这些线程是工作线程。 - Royi Namir
是的,工作线程是其中的一个子集。它们的上限可以成为服务器资源管理的有用工具。线程池限制是一个任意的高数字,永远不应该被达到。 - H H
3
@HenkHolterman,您能否用更深入的解释进一步说明一下? - hackp0int
好问题,我花了一天的时间阅读文章并尝试理解IIS的工作原理。maxWorkerThreads设置默认值是否取决于IIS版本的autoConfig?当我在IIS Express 8下运行我的应用程序时,该值约为4K,而当我在Windows 8.1上的IIS 8.5下运行它时,该值约为32K。 - Andrii Litvinov
看起来我的假设是正确的。我尝试将 maxWorkerThreads 更改为值 20,在 IIS 8.5 下线程池中的 workerThreads 值已更改为 80 - Andrii Litvinov
2个回答

10

我查看了源代码,发现MaxWorkerThreads的默认值设置为100。

private static readonly ConfigurationProperty _propMaxWorkerThreads = new ConfigurationProperty("maxWorkerThreads", typeof (int), (object) 100, (TypeConverter) null, (ConfigurationValidatorBase) new IntegerValidator(1, 2147483646), ConfigurationPropertyOptions.None);

这个字段被添加到静态构造函数中的属性集合中

ProcessModelSection._properties.Add(ProcessModelSection._propMaxWorkerThreads);

在属性定义中,他们将默认值设置为20。

[IntegerValidator(MaxValue = 2147483646, MinValue = 1)]
[ConfigurationProperty("maxWorkerThreads", DefaultValue = 20)]
public int MaxWorkerThreads

但这显然没有任何效果。也许这是某种遗留的实现。顺便说一下,只有在将autoConfig设置为false时才会表现出这种行为。当它设置为true时,我的应用程序中有32K个工作线程。可能这种行为取决于IIS版本。


因此,文档是通过属性而不是通过属性更新的吗? - Royi Namir
1
实际上,ASP.NET 在启动时没有100个线程。ThreadPood 会在需要的情况下创建新线程,直到达到 minWorkerThreads 值。然后,如果仍有工作要做并且线程不足,它将在需要时每半秒钟添加一个新线程。 - Andrii Litvinov
尝试在应用程序启动时或请求执行时调用 ThreadPool.GetMaxThreadsThreadPool.GetAvailableThreads 来检查自己。 - Andrii Litvinov
2
ThreadPool.GetMaxThreads并дёҚиғҪз»ҷеҮәзәҝзЁӢжұ дёӯеҲӣе»әзҡ„зәҝзЁӢж•°пјҢиҖҢжҳҜеҸҜд»ҘеҲӣе»әзҡ„зәҝзЁӢж•°гҖӮиҜ·е°қиҜ•жЈҖжҹҘеә”з”ЁзЁӢеәҸзҡ„еҶ…еӯҳеҚ з”Ёжғ…еҶөгҖӮжҜҸдёӘеҲҶй…Қзҡ„зәҝзЁӢеӨ§зәҰйңҖиҰҒ1MBзҡ„еҶ…еӯҳгҖӮжҲ‘дёҚи®ӨдёәжӮЁзҡ„еә”з”ЁзЁӢеәҸеңЁеҗҜеҠЁж—¶дјҡж¶ҲиҖ—1GBзҡ„еҶ…еӯҳгҖӮ - Andrii Litvinov
如果我有200个用户从服务器请求数据,他们将等待很长时间,直到线程池有足够的线程(假设先前的线程仍在工作)…… - Royi Namir
显示剩余8条评论

0
根据MSDN的说法,ASP.net服务器池中.NET 4.5的默认最大线程数为5,000。来源

2
请再仔细阅读一遍。请求(request)不等于线程(thread)。ASP.NET 每个核心设置了100个线程。该属性用于异步操作。 - Royi Namir
@RoyiNamir,也许我误解了。根据MSDN上的这个页面报告,IIS 7中的.NET 4每个CPU有5000个最大并发应用程序池线程。 - cjcurrie
7
最大并发请求数为5000!不是线程!请注意,线程不等同于请求。这是用于异步操作的,其中一个请求不会绑定到一个线程上。只有当请求是异步的(请求具有异步处理程序或管道中的模块异步完成时)时,差异才会有所影响。在此阅读确切的一行:http://blogs.msdn.com/b/tmarq/archive/2007/07/21/asp-net-thread-usage-on-iis-7-0-and-6-0.aspx - Royi Namir

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接