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

dat*_*dev 12 .net c# multithreading numa

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

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

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

use*_*830 10

除了gcserver我们应该启用GCCpuGroup,Thread_UseAllCpuGroups所以配置应该更像:

<configuration
   <runtime>
      <gcServer enabled="true"/>
      <GCCpuGroup  enabled="true"/>
      <Thread_UseAllCpuGroups  enabled="true"/>
   </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

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


Dra*_*aes 1

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

在 app.config 中,尝试:

<configuration
   <runtime>
      <gcServer enabled="true"/>
   </runtime>
</configuration>
Run Code Online (Sandbox Code Playgroud)

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