【问题标题】:How many processor cores does the .NET task scheduler support.NET 任务调度程序支持多少个处理器内核
【发布时间】:2012-09-16 07:34:22
【问题描述】:

出于好奇,我想知道 .NET 任务调度程序支持多少个处理器内核。

Windows Server 2012 最多支持 640 个内核。 .NET 是否限制为 64 个,还是会使用所有可用的内核?

【问题讨论】:

    标签: .net multithreading task-parallel-library


    【解决方案1】:

    .NET 确实支持所有内核。 Stehphen Toub 在MSDN Parallel Extensions Forum 中的回答:

    默认 TPL TaskScheduler 以 .NET ThreadPool 为目标。默认情况下,池限制为单个 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"/>
    【解决方案2】:

    埃里克·利珀特 (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 通常会尝试缓慢减少池中的线程数以释放未使用的资源。

    【讨论】:

    • 但这并不能真正回答所有这些线程可以使用多少个核心
    【解决方案3】:

    根据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 的回答。

    【讨论】:

    • 我在阅读了您提到的书后问了我的问题,想知道 .NET 4.5 是否会发生变化。我觉得奇怪的是,像 .NET 这样的重要框架不允许使用操作系统支持的全部内核数。
    • 我认为超过 64 核的服务器仍然非常少见,如果你有的话,你可能非常关心性能,所以你不太可能使用 .Net。因此,我认为支持更多内核并不是优先事项。
    • 一块 32 核 32 GB 的主板成本不到 2500 欧元。也许我不知道在 .NET 中不支持超过 64 个内核是有原因的。我刚开始玩 TPL 并尝试感受一下。
    • Stephen Toub 在“并行编程模式”中写道:从 Windows 7 和 Windows Server 2008 R2 开始,Windows 操作系统支持超过 64 个逻辑处理器,并且默认情况下(主要是出于遗留应用程序的原因) ,对这些内核的访问通过称为“处理器组”的新概念暴露给应用程序。 .NET Framework 不提供对处理器组 API 的托管访问,因此 Environment.ProcessorCount 将返回一个上限为 64(处理器组的最大大小)的值,即使计算机有更多的处理器。跨度>
    • @PeterMeinl 是的,这就是我在引文中遗漏的部分内容。我认为这与这里无关,所以我没有包括它们。
    猜你喜欢
    • 1970-01-01
    • 2015-12-29
    • 2010-09-17
    • 1970-01-01
    • 2011-08-24
    • 2011-04-23
    • 1970-01-01
    • 2011-04-08
    • 1970-01-01
    相关资源
    最近更新 更多