为什么我的.Net应用程序只使用单个NUMA节点?

时间:2014-11-09 16:13:39

标签: c# .net multithreading numa

我有一台带有2个NUMA节点的服务器,每个节点有16个CPU。我可以看到任务管理器中的所有32个CPU,前2行中的前16个(NUMA节点1)和后2行中的后16个(NUMA节点2)。

在我的应用中,我使用Thread.Start()启动64个线程。当我运行应用程序时,它是CPU密集型的,只有前16个CPU忙,其他16个CPU处于空闲状态。

为什么呢?我经常使用Interlocked.Increment()。这可能是个原因吗? 有没有办法在特定的NUMA节点上启动线程?

3 个答案:

答案 0 :(得分:10)

除了gcserver我们应该启用GCCpuGroupThread_UseAllCpuGroups,因此配置应该更像:

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

GcCpuGroup为多个CPU组启用垃圾收集,Thread_UseAllCpuGroups启用运行时所有CPU组的管理线程分配。

答案 1 :(得分:2)

要检查的第一件事确实是isInterrupted,确保设置了必要的选项:

app.config

如果<?xml version="1.0" encoding="utf-8"?> <configuration> <runtime> <gcServer enabled="true" /> <Thread_UseAllCpuGroups enabled="true" /> <GCCpuGroup enabled="true" /> </runtime> <startup> <!-- 4.5 and later should work, use the one targeted --> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.6.2"/> </startup> </configuration> - Wizadry没有帮助,很可能是你的机器不应该使用多个内核组(Kgroups)。如果您有Gen9 HP,则可以检查BIOS app.config。如果它处于NUMA Group Size Optimization模式,则当前CLR(2017,.net 4.6.2)仅使用第一个。如果该计算机中的核心数不超过64个,则应该能够选择将所有核心放在同一组中的Clustered布局。如果找不到,you may need a BIOS Update

有关详细信息,请参阅StackOverflow上的Unable to use more than one processor group for my threads in a C# app。它甚至带有自己的diagnostics tool

答案 2 :(得分:1)

您是否将垃圾收集器设置为服务器版本?

在app.config中,尝试:

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

由于分配堆的方式,服务器GC在具有许多内核的机器中的许多线程上搅拌大量对象/数据时会产生巨大的差异。