c# Environment.ProcessorCount does not always return the full number of Logical Processor, why?

时光毁灭记忆、已成空白 提交于 2019-11-29 19:05:44

问题


On my machine, windows 7 - Enterprise with 1 x Intel Xeon E5-1660 0 @ 3.30Ghz (6 cores/cpu with Hyper Threading activated), Environment.ProcessorCount return 12 which is exact.

On a Windows Server 2012 with 2 x Intel Xeon E5-2697 v3 @ 2.60GHz (14 cores/cpu with Hyper Threading activated(I think because task manager show: 2 sockets, 28 cores, 56 logical processors)), Environment.ProcessorCount return 28 which appears to us as wrong because 2x14x2 = 56.

Why on Windows Server 2012 c# method Environment.ProcessorCount does not return the proper number of logical processors?

As Additional information, environment variables are as follows: NUMBER_OF_PROCESSORS=28

Update 2015-05-26:

There is a more details/reasons of this related bug in my other question: Unable to use more than one processor group for my threads in a C# app. Mainly I think that C# does only use one processor group. What's werid was that on our server, there was 2 processor groups although there was only 56 logical processors. But this HP CUSTOMER ADVISORY explain why our server bios configuration were inducing windows in error.


回答1:


There may be a hint in the docs:

"If the current machine contains multiple processor groups, this property returns the number of logical processors that are available for use by the common language runtime (CLR)."

Could that be the issue here?

MSDN Article

Found something else interesting:

By default, the pool is restricted to a single processor group (http://msdn.microsoft.com/en-us/library/windows/desktop/dd405503(v=vs.85).aspx), and thus to 64 cores. However, in .NET 4.5 you can set the Thread_UseAllCpuGroups enabled="true" flag.

MSDN Forum Post




回答2:


According to the MSDN docs on <Thread_UseAllCpuGroups> you need to set up the following to have all the CPU groups seen and used:

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



回答3:


Check your system NUMBER_OF_PROCESSORS environment variable. That's what method returns. See MSDN article: http://msdn.microsoft.com/en-us/library/system.environment.processorcount%28v=vs.100%29.aspx (permission section).



来源:https://stackoverflow.com/questions/27965962/c-sharp-environment-processorcount-does-not-always-return-the-full-number-of-log

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!