首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >C#核心2.1利用2个CPU

C#核心2.1利用2个CPU
EN

Stack Overflow用户
提问于 2019-03-23 01:19:28
回答 2查看 1.5K关注 0票数 0

我目前正在构建一个严重依赖于多线程运行的应用程序。我目前使用environment.ProcessorCount常量生成与系统内核一样多的线程,但是当我在有两个独立CPU (Intel Xeon E5-2620)的服务器上运行应用程序时,所有线程都在第一个CPU上工作,而第二个CPU空闲。是否可以在一个进程中使用第二个CPU,或者我是否需要拆分进程并强制使用处理器亲和性?

编辑:

我尝试使用IdealProcessor将亲和性设置为拆分到CPU0和1,但没有成功。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 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运行时,您需要在应用程序设置中设置以下选项:

代码语言:javascript
运行
复制
<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)通过环境变量传递。

票数 7
EN

Stack Overflow用户

发布于 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”,效果非常好。也许这可以帮助其他人。

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/55304789

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档