繁体   English   中英

C# Core 2.1 使用 2 个 CPU

[英]C# Core 2.1 Utilize 2 CPUs

我目前正在构建一个严重依赖运行多线程的应用程序。 我目前正在使用environment.ProcessorCount常量生成与系统内核一样多的线程,但是当我在具有 2 个独立 CPU(英特尔至强 E5-2620)的服务器上运行应用程序时,所有线程都在第一个 CPU 上工作,而第二个 CPU 空闲。 是否可以在一个进程中使用第二个 CPU,或者我是否需要拆分进程并强制使用处理器关联?

编辑:

我尝试使用 IdealProcessor 设置关联以拆分为 CPU 0 和 1,但没有成功。

看起来您的多处理器体系结构是NUMA ,这意味着CPU对不同内存区域的访问时间不同。 具有这种体系结构的系统平衡了CPU之间的负载,以便仅加载正在“接近”(访问时间最短)到存储区的那些处理器。 对于顺序的.NET应用程序,标准的内存布局意味着驻留在同一内存区域中,这在NUMA体系结构上导致仅使用与之距离更近的那些CPU(在您的情况下,它可以是2个NUMA节点,每个节点有1个CPU,并且只有1个我们之所以使用它,是因为它可以为您的应用程序使用的内存区域提供服务。

需要从NUMA架构中受益的应用程序应该使用特定的API,这些API在其他调用中公开这些调用,以指示在哪个NUMA节点中分配内存(此处是Windows提供的API函数的示例 )。 从4.5版开始的.NET CLR可以通过特定的配置设置间接使用此API。 在CLR运行时上,您需要在应用程序设置中设置以下选项:

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

gcServer模式控制内存分配的NUMA感知,以便运行时可以支持不同NUMA节点的多个堆,而Thread_UseAllCpuGroups控制胎面池的NUMA感知。

但是,对于.NET Core运行时,您需要使用运行时选项来打开gcServer模式,而ThreadPool设置的一部分Thread_UseAllCpuGroups可以根据此条件通过带有前缀COMPlus_的环境变量进行传递(即, set COMPlus_Thread_UseAllCpuGroups=1 )。

有一个类似的问题,我们的 .NET Core 应用程序之一似乎只在一个 CPU 上运行。 厌倦了上面的解决方案,但不幸的是它没有成功。

经过长时间的挖掘,我的一个好同事发现除了一个 CPU 之外,所有的 CPU 都处于“Parked”状态。 https://blogs.technet.microsoft.com/yongrhee/2012/11/02/windows-server-2008-r2-and-core-parking-how-it-affects-you-the-administrator/

将电源计划设置更改为“高性能”的建议解决方法非常有效。 也许这可以帮助其他人。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM