C#Core 2.1使用2个CPU

时间:2019-03-22 17:19:28

标签: c# multithreading .net-core multiprocessing

我目前正在构建一个严重依赖于运行多线程的应用程序。我目前正在使用from django.db.models.signals import post_save from django.dispatch import receiver from myapp.models import MyModel @receiver(post_save, sender=MyModel) def my_handler(sender, instance, created, **kwargs): if created: # run your custom code HERE 常量生成与系统具有核心数量一样多的线程,但是当我在具有2个独立CPU(英特尔至强E5-2620)的服务器上运行应用程序时,所有线程均在第一个CPU上运行而第二个CPU处于空闲状态。是否可以在一个进程中利用第二个CPU,或者我需要拆分进程并以“处理器亲和力”来强制使用?

编辑:

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

2 个答案:

答案 0 :(得分:3)

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

需要从NUMA架构中受益的应用程序应该使用特定的API,这些API在其他调用中公开这些调用以指示在哪个NUMA节点中分配内存(此处是example的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运行时,您需要使用runtime options打开gcServer模式,而ThreadPool settings的一部分Thread_UseAllCpuGroups可以根据{{3 }},前缀为COMPlus_(即set COMPlus_Thread_UseAllCpuGroups=1)。

答案 1 :(得分:2)

有一个类似的问题,似乎我们的.NET Core应用程序之一仅在一个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/

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