C# 为什么我的.Net应用程序只使用单个NUMA节点?
我有一个服务器,有2个NUMA节点,每个节点有16个CPU。我可以在TaskManager中看到所有32个CPU,前2行中的前16个(NUMA节点1)和后2行中的下16个(NUMA节点2) 在我的应用程序中,我使用C# 为什么我的.Net应用程序只使用单个NUMA节点?,c#,.net,multithreading,numa,C#,.net,Multithreading,Numa,我有一个服务器,有2个NUMA节点,每个节点有16个CPU。我可以在TaskManager中看到所有32个CPU,前2行中的前16个(NUMA节点1)和后2行中的下16个(NUMA节点2) 在我的应用程序中,我使用Thread.Start()启动了64个线程。当我运行应用程序时,它是CPU密集型的,只有前16个CPU忙,其他16个CPU空闲 为什么??我经常使用Interlocked.Increment()。这可能是一个原因吗? 有没有办法在特定NUMA节点上启动线程?您是否已将垃圾收集器设置为
Thread.Start()
启动了64个线程。当我运行应用程序时,它是CPU密集型的,只有前16个CPU忙,其他16个CPU空闲
为什么??我经常使用Interlocked.Increment()
。这可能是一个原因吗?
有没有办法在特定NUMA节点上启动线程?您是否已将垃圾收集器设置为服务器版本 在app.config中,尝试:
<configuration
<runtime>
<gcServer enabled="true"/>
</runtime>
</configuration>
除了gcserver
之外,我们应该启用,因此配置应该更像:
<configuration
<runtime>
<gcServer enabled="true"/>
<GCCpuGroup enabled="true"/>
<Thread_UseAllCpuGroups enabled="true"/>
</runtime>
</configuration>
首先要检查的确实是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>
如果app.config
-Wizadry没有帮助,则很可能是您的计算机在不应该使用多个内核组(Kgroups)时使用了多个内核组。然后,如果您有Gen9 HP,您可以检查BIOS中的NUMA组大小优化。如果处于群集模式,当前CLR(2017.net 4.6.2)仅使用第一个模式。如果该机器中的内核不超过64个,则应该能够选择将所有内核放在同一组中的平面布局。如果你找不到它
有关更多详细信息,请参见此处的StackOverflow。它甚至有自己的功能。此设置不会改变行为。