【发布时间】:2012-09-16 07:34:22
【问题描述】:
出于好奇,我想知道 .NET 任务调度程序支持多少个处理器内核。
Windows Server 2012 最多支持 640 个内核。 .NET 是否限制为 64 个,还是会使用所有可用的内核?
【问题讨论】:
标签: .net multithreading task-parallel-library
出于好奇,我想知道 .NET 任务调度程序支持多少个处理器内核。
Windows Server 2012 最多支持 640 个内核。 .NET 是否限制为 64 个,还是会使用所有可用的内核?
【问题讨论】:
标签: .net multithreading task-parallel-library
.NET 确实支持所有内核。 Stehphen Toub 在MSDN Parallel Extensions Forum 中的回答:
默认 TPL
TaskScheduler以 .NETThreadPool为目标。默认情况下,池限制为单个 processor group,因此限制为 64 个内核。但是,在 .NET 4.5 中,您可以设置<Thread_UseAllCpuGroups enabled="true"/>标志。当您的计算机有多个 CPU 组时,启用此元素会导致运行时将托管线程分布到所有 CPU 组,而不是仅限于一个,因此默认调度程序可以针对操作系统支持的任何内容。 (还必须启用GCCpuGroup才能使此设置生效。)
【讨论】:
<Thread_UseAllCpuGroups enabled="true"/> 不适用于我们在 Server 2016 上使用 .net 4.6.2 的 2s/16c/32T 机器。(是的,我们完成了整个设置:<gcServer enabled="true"/><GCCpuGroup enabled="true"/><Thread_UseAllCpuGroups enabled="true"/>)
埃里克·利珀特 (source)
对于 CLR 4.0 的 Beta 1,TPL 的默认调度程序将是 CLR 线程池
这大致意味着工作进入一个 FIFO 队列,每个核心将一个工作负载项出列。换句话说,现在 CLR 线程池支持的内核数量没有固定的上限。此上限由其他方强制执行 - 操作系统、硬件和 CPU 平台。
池中的默认线程数(每个this answer)
- Framework 4.0(32 位环境)中的 1023
- Framework 4.0(64 位环境)中的 32768
- Framework 3.5 中每个内核 250 个
- Framework 2.0 中每个核心 25 个
这技术上允许在专用内核上进行如此多的并行执行。
注意这并不意味着在任何给定时刻,池中有那么多线程。 CLR 和 OS 通常会尝试缓慢减少池中的线程数以释放未使用的资源。
【讨论】:
根据CLR via C#, 3rd ed.,第25章线程基础:
如今,CLR […] 在 64 位 Windows 上运行时最多只能使用 64 个内核。 [... M]在 32 位版本的 Windows 上运行时,托管应用程序最多可以使用 32 个内核。
这本书写于 2010 年,所以它包含与 .Net 4.0 和 Windows Server 2008 R2 相关的信息,但是我认为 .Net 4.5 在这方面没有任何改变。 编辑: .Net 4.5 似乎确实改变了这一点,请参阅 Peter Meinl 引用 Stephen Toub 的回答。
【讨论】: