微软官网链接:https://docs.microsoft.com/en-us/windows/win32/procthread/numa-support
译文如下:
多处理器支持的传统模型是对称多处理器(SMP)。在这种模型中,每个处理器对内存和输入/输出有平等的访问权。随着处理器数量的增加,处理器总线成为系统性能的一个限制。
系统设计人员使用非均匀内存访问(NUMA)来提高处理器速度,而不增加处理器总线上的负载。体系结构是不统一的,因为每个处理器靠近内存的某些部分,而远离内存的其他部分。处理器可以快速访问它附近的内存,而访问更远的内存可能需要更长的时间。
在NUMA系统中,中央处理器被安排在称为节点。每个节点都有自己的处理器和内存,并通过高速缓存相关的互连总线连接到更大的系统。
系统试图通过在处理器上调度线程来提高性能,这些处理器与正在使用的内存在同一个节点上。它试图满足节点内部的内存分配请求,但在必要时会从其他节点分配内存。它还提供了一个应用程序接口,使应用程序可以使用系统的拓扑结构。通过使用NUMA函数优化调度和内存使用,您可以提高应用程序的性能。
首先,您需要确定系统中节点的布局。要检索系统中编号最高的节点,请使用getnumahighetestnodeNumber功能。请注意,这个数字不能保证等于系统中的节点总数。此外,具有序列号的节点不能保证靠得很近。要检索系统上的处理器列表,请使用GetProcessAffinityMask功能。您可以使用来确定列表中每个处理器的节点getnumapprocessornode功能。或者,要检索节点中所有处理器的列表,请使用GetNumaNodeProcessorMask功能。
在确定了哪些处理器属于哪些节点之后,您可以优化应用程序的性能。若要确保进程的所有线程都在同一个节点上运行,请使用SetProcessAffinityMask函数使用指定同一节点中的处理器的进程相似性掩码。这提高了线程需要访问相同内存的应用程序的效率。或者,要限制每个节点上的线程数,请使用SetThreadAffinityMask功能。
内存密集型应用程序需要优化它们的内存使用。若要检索节点可用的可用内存量,请使用GetNumaAvailableMemoryNode功能。这VirtualAllocExNuma函数使应用程序能够为内存分配指定一个首选节点。VirtualAllocExNuma不分配任何物理页面,因此无论页面是否在该节点或系统中的其他地方可用,它都将成功。物理页面是按需分配的。如果首选节点的页面不足,内存管理器将使用其他节点的页面。如果内存被换出,当它被带回来时,使用相同的过程。
NUMA支持超过64个逻辑处理器的系统
在具有64个以上逻辑处理器的系统上,节点被分配给处理器组根据节点的容量来确定。节点的容量是系统启动时存在的处理器数量,以及系统运行时可以添加的任何其他逻辑处理器。
Windows Server 2008、Windows Vista、Windows Server 2003和Windows XP:不支持处理器组。
每个节点必须完全包含在一个组中。如果节点的容量相对较小,系统会将多个节点分配给同一个组,选择物理上彼此靠近的节点以获得更好的性能。如果一个节点的容量超过了一个组中处理器的最大数量,系统会将该节点分成多个较小的节点,每个节点都小到足以容纳一个组。
可以使用请求新进程的理想NUMA节点进程线程属性首选节点创建流程时的扩展属性。像线程理想处理器一样,理想节点是对调度器的一个提示,调度器在可能的情况下将新进程分配给包含所请求节点的组。
扩展的NUMA函数GetNumaAvailableMemoryNodeEx,getnumanodeproprocessormaskex,getnumapprocessornodeex,和GetNumaProximityNodeEx与未扩展的对应节点的不同之处在于节点号是aUSHORT值而不是UCHAR,以容纳具有超过64个逻辑处理器的系统上可能更多的节点。此外,由扩展功能指定或检索的处理器包括处理器组;未扩展函数指定或检索的处理器是组相关的。有关详细信息,请参见单个函数参考主题。
群组感知应用程序可以使用相应的扩展NUMA函数,以类似于本主题前面所述的方式将其所有线程分配给特定节点。应用程序使用GetLogicalProcessorInformationEx获取系统上所有处理器的列表。请注意,除非将进程分配给单个组,并且目标节点位于该组中,否则应用程序无法设置进程关联掩码。通常应用程序必须调用SetThreadGroupAffinity将其线程限制在预期的节点上。
NUMA原料药
下表描述了NUMA空气污染指数。
功能 | 描述 |
---|---|
allocateuserserphysicalpagesunuma | 分配要在任何中映射和取消映射的物理内存页面地址窗口扩展(AWE)指定进程的区域,并为物理内存指定NUMA节点。 |
CreateFileMappingNuma | 为指定文件创建或打开命名或未命名的文件映射对象,并为物理内存指定NUMA节点。 |
GetLogicalProcessorInformation | 检索有关逻辑处理器和相关硬件的信息。 |
GetLogicalProcessorInformationEx | 检索关于逻辑处理器和相关硬件的关系的信息。 |
GetNumaAvailableMemoryNode | 检索指定节点中的可用内存量。 |
GetNumaAvailableMemoryNodeEx | 检索指定为的节点中的可用内存量USHORT价值。 |
getnumahighetestnodeNumber | 检索当前具有最高数目的节点。 |
GetNumaNodeProcessorMask | 检索指定节点的处理器掩码。 |
getnumanodeproprocessormaskex | 检索指定为的节点的处理器掩码USHORT价值。 |
getnumapprocessornode | 检索指定处理器的节点号。 |
getnumapprocessornodeex | 将节点号检索为USHORT指定处理器的值。 |
GetNumaProximityNode | 检索指定邻近标识符的节点号。 |
GetNumaProximityNodeEx | 将节点号检索为USHORT指定邻近标识符的值。 |
MapViewOfFileExNuma | 将文件映射视图映射到调用进程的地址空间,并为物理内存指定NUMA节点。 |
VirtualAllocExNuma | 在指定进程的虚拟地址空间中保留或提交一个内存区域,并为物理内存指定NUMA节点。 |
这QueryWorkingSetEx函数可用于检索分配了页面的NUMA节点。如需范例,请参阅从NUMA节点分配内存。
相关主题
总结:
根据文中描述,以及编码实验,处理器组结构图,如下所示:
若对你有帮助,欢迎点赞、收藏、评论,你的支持就是我的最大动力!!!
同时,阿超为大家准备了丰富的学习资料,欢迎关注公众号“超哥学编程”,即可领取。