我目前正在构建一个严重依赖于多线程运行的应用程序。我目前使用environment.ProcessorCount
常量生成与系统内核一样多的线程,但是当我在有两个独立CPU (Intel Xeon E5-2620)的服务器上运行应用程序时,所有线程都在第一个CPU上工作,而第二个CPU空闲。是否可以在一个进程中使用第二个CPU,或者我是否需要拆分进程并强制使用处理器亲和性?
编辑:
我尝试使用IdealProcessor将亲和性设置为拆分到CPU0和1,但没有成功。
发布于 2019-03-23 18:41:49
看起来你的多处理器架构是NUMA,这意味着CPU对不同的内存区域有不同的访问时间。具有这种体系结构的系统平衡CPU之间的负载,以便只加载那些“更接近”(具有最低访问时间)的处理器,这些处理器离正在操作的存储区更近。在顺序.NET应用程序的情况下,标准内存布局意味着驻留在相同的内存区域中,而在NUMA架构上,这意味着只使用与此更接近的CPU (在您的示例中,它可以是2个NUMA节点,每个节点有1个CPU,并且只使用1个CPU,因为它服务于您的应用程序使用的内存区)。
需要从NUMA体系结构中获益的应用程序应该使用特定的API,这些API在其他调用中公开调用,以指示在哪个NUMA节点中分配内存(这里是Windows提供的API函数的example )。从4.5版开始,API可以通过特定的配置设置间接使用此.NET。在CLR运行时,您需要在应用程序设置中设置以下选项:
<configuration>
<runtime>
<gcServer enabled="true"/>
<Thread_UseAllCpuGroups enabled="true"/>
</runtime>
</configuration>
Where NUMA模式控制内存分配的gcServer
感知,以便运行时可以支持不同NUMA节点的多个堆,而Thread_UseAllCpuGroups
控制线程池的NUMA感知。
然而,对于.NET核心运行时,您需要使用runtime options打开gcServer模式,而作为ThreadPool settings一部分的Thread_UseAllCpuGroups
可以根据前缀为COMPlus_
的this (即set COMPlus_Thread_UseAllCpuGroups=1
)通过环境变量传递。
发布于 2019-10-13 04:53:02
有类似的问题,我们的.NET核心应用程序之一似乎只在一个中央处理器上运行。我尝试了上面的解决方案,但不幸的是它并没有起到作用。
经过长时间的挖掘,我的一位好同事发现,除了一个CPU之外,所有CPU的状态都是“已停放”。https://blogs.technet.microsoft.com/yongrhee/2012/11/02/windows-server-2008-r2-and-core-parking-how-it-affects-you-the-administrator/。
建议的解决方法是将Power Plan设置更改为“High Performance”,效果非常好。也许这可以帮助其他人。
https://stackoverflow.com/questions/55304789
复制相似问题