c#Environment.ProcessorCount并不总是返回完整数量的逻辑处理器,为什么?

时间:2015-01-15 14:44:41

标签: c# cpu server core hyperthreading

在我的机器上,Windows 7 - 企业版1 x Intel Xeon E5-1660 0 @ 3.30Ghz(激活超线程的6核/ CPU),Environment.ProcessorCount返回12,这是确切的。

在Windows Server 2012上使用2 x Intel Xeon E5-2697 v3 @ 2.60GHz(启动了超线程的14核/ CPU(我认为因为任务管理器显示:2个插槽,28个核心,56个逻辑处理器)),环境.ProcessorCount返回28,这对我们来说是错误的,因为2x14x2 = 56。

为什么在Windows Server 2012上使用c#方法Environment.ProcessorCount不返回正确数量的逻辑处理器?

作为附加信息,环境变量如下: NUMBER_OF_PROCESSORS = 28

TaskManager

更新2015-05-26:

在我的另一个问题中,有更多关于这个相关错误的细节/原因:Unable to use more than one processor group for my threads in a C# app。主要是我认为C#只使用一个处理器组。有什么问题,在我们的服务器上,有2个处理器组,尽管只有56个逻辑处理器。但是这个HP CUSTOMER ADVISORY解释了为什么我们的服务器BIOS配置导致错误的窗口。

3 个答案:

答案 0 :(得分:6)

文档中可能有一些提示:

&#34;如果当前计算机包含多个处理器组,则此属性返回公共语言运行时(CLR)使用的逻辑处理器的数量 。&#34; < / p>

这可能是问题吗?

MSDN Article

找到其他有趣的东西:

默认情况下,池仅限于一个处理器组(http://msdn.microsoft.com/en-us/library/windows/desktop/dd405503(v=vs.85).aspx),因此限制为64个核心。但是,在.NET 4.5中,您可以设置Thread_UseAllCpuGroups enabled =&#34; true&#34;标志。

MSDN Forum Post

答案 1 :(得分:4)

根据the MSDN docs on <Thread_UseAllCpuGroups>,您需要设置以下内容以查看和使用所有CPU组:

<configuration>
   <runtime>
      <Thread_UseAllCpuGroups enabled="true"/>
      <GCCpuGroup enabled="true"/>
      <gcServer enabled="true"/>
   </runtime>
</configuration>

答案 2 :(得分:0)

检查系统NUMBER_OF_PROCESSORS环境变量。这是什么方法返回。请参阅MSDN文章:http://msdn.microsoft.com/en-us/library/system.environment.processorcount%28v=vs.100%29.aspx(权限部分)。