win下进程与线程对NUMA的支持

 

微软官网链接: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空气污染指数。

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节点分配内存

从NUMA节点分配内存

多处理器

处理器组

 

总结:

根据文中描述,以及编码实验,处理器组结构图,如下所示:

 

===================================================

===================================================

业余时间不定期更新一些想法、思考文章,欢迎关注,共同探讨,沉淀技术!

            

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章