【问题标题】:c# Environment.ProcessorCount does not always return the full number of Logical Processor, why?c# Environment.ProcessorCount 并不总是返回逻辑处理器的完整数量,为什么?
【发布时间】:2015-03-13 23:53:34
【问题描述】:

在我的机器上,windows 7 - Enterprise with 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 个逻辑处理器)),环境.ProcessorCount 返回 28,这在我们看来是错误的,因为 2x14x2 = 56。

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

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

2015 年 5 月 26 日更新:

在我的另一个问题中有更多有关此相关错误的详细信息/原因:Unable to use more than one processor group for my threads in a C# app。主要是我认为 C# 确实只使用一个处理器组。奇怪的是,在我们的服务器上,虽然只有 56 个逻辑处理器,但有 2 个处理器组。但是这个HP CUSTOMER ADVISORY解释了为什么我们的服务器bios配置会导致windows错误。

【问题讨论】:

  • 我很惊讶Environment.PermissionAccess 给了你任何 CPU 信息 :-) 我什至找不到它的文档。
  • 对不起,我编辑了我的问题标题...我使用了错误的方法名称。对不起。感谢您的信息。

标签: c# cpu server core hyperthreading


【解决方案1】:

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

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

【讨论】:

  • 谢谢,你是对的。但我已经做到了。我对我的问题添加了更新,因为我从 HP 收到了很多关于这个问题的反馈(在另一个 StackOverflow 问题中添加)
【解决方案2】:

文档中可能有提示:

“如果当前机器包含多个处理器组,则此属性返回可供公共语言运行时 (CLR) 使用的逻辑处理器的数量。”

这可能是这里的问题吗?

MSDN Article

发现了其他有趣的东西:

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

MSDN Forum Post

【讨论】:

  • 是的,它可能是……但这就是我要找的。解释为什么可用数量少于全部数量? ...许可证问题、Windows 设置、Windows 正常行为???
  • 我想知道 CLR 是不是默认情况下没有,或者不能在第二个物理 CPU 上使用?我不是这方面的专家,但我真的很好奇。
  • @user2366842,我同意,不知道是不是这样(我认为可能),我不知道,我搜索没有成功是为什么?
  • 谢谢,你完全正确。非常感谢 !!!仅供参考:我在 Microsoft 提出了另一个问题,因为 Thread_UseAllCpuGroups 在我的情况下不起作用。我希望我能得到一个有效的答案。链接:social.msdn.microsoft.com/Forums/vstudio/en-US/…
  • 你是否也开启了GCCpuGroup和gcServer? msdn.microsoft.com/en-us/library/jj665638(v=vs.110).aspx 说你需要这三个。
【解决方案3】:

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

【讨论】:

  • 我知道,但它不能回答我只有一半的原因。我想要一份说明为什么我只有一半的文档。如果真的是因为 Environment.ProcessorCount 没有考虑第二个 CPU,那么我将使用它。但是如果我因为 Windows Server 设置而只看到一半,那么乘以 cpu 的数量是不合逻辑的。
  • 供您参考,您的链接是框架的第 4 版。在 4.5 版中,有关环境变量的信息已被删除,原因有一个:这不是真的。我更改了环境变量并运行了我的应用程序,但仍然只看到一半的逻辑处理器(都在相同的环境中 - 相同的 cmd 提示符)。但是感谢您的尝试。
猜你喜欢
  • 1970-01-01
  • 2021-02-01
  • 1970-01-01
  • 2011-07-22
  • 1970-01-01
  • 2017-07-27
  • 1970-01-01
  • 2019-03-14
  • 1970-01-01
相关资源
最近更新 更多