首页 > 解决方案 > 如何将应用程序分配给特定的 NUMA 节点?

问题描述

以下代码仅允许更改当前 NUMA 节点中的关联性。是否有允许我同时指定 NUMA 节点的功能?我宁愿避免使用外部解决方案,例如start /NODE 3 /AFFINITY 1 program.exe

procedure TForm1.FormCreate(Sender: TObject);
var AffinityMask:Cardinal;
begin    
  AffinityMask:=1;
  SetProcessAffinityMask(GetCurrentProcess(),AffinityMask);
end;

标签: delphi

解决方案


这在 Microsoft 的NUMA 支持文档中有所介绍:

首先,您需要确定系统中节点的布局。要检索系统中编号最高的节点,请使用该GetNumaHighestNodeNumber函数。请注意,此数字不保证等于系统中的节点总数。此外,不保证具有连续编号的节点彼此靠近。要检索系统上的处理器列表,请使用该GetProcessAffinityMask函数。您可以使用该GetNumaProcessorNode函数确定列表中每个处理器的节点。或者,要检索节点中所有处理器的列表,请使用该GetNumaNodeProcessorMask函数。

在确定了哪些处理器属于哪些节点之后,您可以优化应用程序的性能。要确保您的进程的所有线程在同一节点上运行,请将该SetProcessAffinityMask函数与指定同一节点中的处理器的进程关联掩码一起使用。这提高了线程需要访问相同内存的应用程序的效率。或者,要限制每个节点上的线程数,请使用该SetThreadAffinityMask函数。


推荐阅读