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

Eri*_*let 9 c# cpu core hyperthreading server

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

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

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

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

任务管理器

更新2015-05-26:

在我的另一个问题中有更多关于此相关错误的详细信息/原因:无法在C#应用程序中为我的线程使用多个处理器组.主要是我认为C#只使用一个处理器组.有什么问题,在我们的服务器上,有2个处理器组,尽管只有56个逻辑处理器.但是这个惠普客户咨询解释了为什么我们的服务器BIOS配置导致错误的窗口.

Dou*_*son 7

文档中可能有一个提示:

"如果当前计算机包含多个处理器组,则此属性返回可供公共语言运行库(CLR)使用的逻辑处理器数."

这可能是问题吗?

MSDN文章

找到其他有趣的东西:

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

MSDN论坛帖子

  • 你还打开了GCCpuGroup和gcServer吗?https://msdn.microsoft.com/en-us/library/jj665638(v=vs.110).aspx说你需要这三个. (2认同)

Ala*_*Maw 5

根据<Thread_UseAllCpuGroups>上的MSDN文档,您需要进行以下设置才能看到和使用所有CPU组:

<configuration>
   <runtime>
      <Thread_UseAllCpuGroups enabled="true"/>
      <GCCpuGroup enabled="true"/>
      <gcServer enabled="true"/>
   </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

  • 谢谢,你是对的。但是我已经做到了。我向问题添加了更新,因为我从惠普收到了许多有关此问题的反馈(已在另一个StackOverflow问题中添加) (2认同)