NUMA与UEFI

NUMA与UEFI

无论我们愿意或者知晓,云服务已经无所不在,打车、订票、玩游戏、逛淘宝等等便利都离不开它。云服务依托于强劲的服务器集群,强劲的市场需求使其对服务器性能要求的不断提高。服务器早以从SMP(对称多处理器)体系进化到了NUMA(Non-Uniform Memory Access Architecture)体系。本文从NUMA的历史、原理和与UEFI固件的关系来深入了解它。

NUMA的历史

Intel的联合创始人摩尔在1965年就发现了摩尔定律,即集成电路每英寸晶体管数目每过18个月增加一倍。从那以后芯片产业仿佛被施加了魔咒,从此在增加晶体管数目的不归路上一路狂奔至今,于此同时主频也不断提高,整体效能在2004年之前年增长率达到52%,如下图:


在1999年计算机主频超过1G大关后,芯片厂商们继续向着更高的目标前进,10GHz似乎并不遥远。励志故事在2004年戛然而止,Intel和AMD在主频战争中先后碰上了散热问题。超长的流水线、巨大的散热片和高达百瓦的功耗为频率战划下了句号,芯片厂商决定另辟蹊径:从攀高峰变成摊大饼。摩尔定律继续发挥作用,越来越多的内核被加入到了CPU中,从此年增长率降为了22%,而Intel也从此不再提起频率,而改为每瓦性能了。这个改变极大的影响了软件的性能优化的考量,从此单核性能优先渐渐让位于多核性能协调。而落后的FSB(前端总线)架构极大的影响了系统性能的发挥,多核常常争抢总线资源用以访问在北桥上的内存,造成很大的延迟。在服务器芯片领域,由于多个CPU共享FSB,情况尤为严重。

需求带来了变革,AMD和Intel先后将内存控制器移入CPU内部,CPU之间用芯片互联总线连接,分别起名Hyper Transport和QPI。我们的主题NUMA也在这里粉墨登场了。

根据CPU访问内存中地址所需时间和距离,我们可以将CPU和内存结构分为SMP(Symmetric Multi-Processor,也称之为一致内存访问UMA)、NUMA(Non-Uniform Memory Access Architecture,非一致性内存访问)和MPP(Massive Parallel Processing,不在本文范围内)。如图:


右边的UMA方式即是传统的通过FSP访问北桥的内存方式,各个CPU和所有的内存的访问延迟是一致的。而左边的NUMA图中,CPU0访问memory1/2的延迟小于访问memory3/4,毕竟QPI和CPU1的二传手角色是要消耗时间的。我们这里可以将CPU0和memory1/2作为一个节点(Node),而CPU1和memory3/4构成Node2。一个更复杂点的4个node的4路服务器如下图:

NUMA将CPU和相近的内存配对组成节点(node),在每个NUMA节点里,CPU都有本地内存,访问距离短(也叫亲缘性好),性能也相对好。固件将收集到的Node信息报告给操作系统,由其在分配任务和内存时就近分配,选择亲缘性好的匹配,从而提高性能。微软从WindowsNT开始就已经支持NUMA,不过是为了IBM服务器,随着X86服务器越来越主流,Window2008 server已经加入了对NUMA的支持。Linux在服务器平台上的表现也越来越成熟,Linux内核对NUMA架构的支持越来越完善,特别是从2.5开始,Linux在调度器、存储管理、用户级API等方面进行了大量的NUMA优化工作,目前这部分工作还在不断地改进。对虚拟机来说NUMA也十分重要,从Windows Server2012开始,Hyper-V虚机可以映射虚拟的NUMA拓扑,在虚机配置了较多内存的时候,使用NUMA拓扑映射能保证分配给虚机的CPU只访问本地的内存,从而达到提升性能。Hyper-V为虚机提供虚拟NUMA节点,虚拟NUMA的拓扑结构及原理与物理机的NUMA拓扑及结构一致,虚拟CPU和虚机内存组合成虚拟NUMA节点,每个虚机的虚拟NUMA节点都映射到相关的物理CPU上。

UEFI与NUMA

固件在NUMA的生态链中扮演了至关重要的地位,只有固件才能知道具体平台上CPU和内存的亲缘关系。UEFI固件通过ACPI报告给OS NUMA的组成结构,其中最重要的是SRAT(System Resource Affinity Table)和SLIT(System Locality Information Table)表。

A.SRAT

SRAT中包含两个结构:

Processor Local APIC/SAPIC Affinity Structure:每个逻辑processor在Proximity Domain所处的位置。每个逻辑processor都有不同的Local APIC ID,所以Processor用Local APIC ID表示。

Memory Affinity Structure:记录内存的信息,即每块内存都从属于哪个Proximity Domain。

有了这个表OSPM就可以描绘出一个CPU和内存的关系图,包括有几个node,每个node里面有那些逻辑processor和内存。

B. SLIT

SLIT表则记录了各个结点之间的距离。

通过这两个表,OS可以在内存中建立整体processor和内存的亲缘关系图和距离表,作为任务调度和内存分配的依据。

详细信息可以查看ACPI spec 6.1的第17章节。

后记

我们可以在linux下查看我们的NUMA使用情况:

第一种方法使用numactl查看:

numactl --hardware
available: 2 nodes (0-1) 
node 0 size: 12091 MB 
node 0 free: 988 MB   
node 1 size: 12120 MB
node 1 free: 1206 MB

第二种方法是通过sysfs查看,这种方式可以查看到更多的信息。

欢迎大家关注本专栏和用微信扫描下方二维码加入微信公众号"UEFIBlog",在那里有最新的文章。同时欢迎大家给本专栏和公众号投稿!

用微信扫描二维码加入UEFIBlog公众号
编辑于 2017-10-28

文章被以下专栏收录

    从首次运用于Intel 安腾处理器,到第一版统一的可扩展固件接口(UEFI)规范出版,无论是在高性能服务器,移动设备或是深度嵌入式设备等,UEFI已在所有平台完全淘汰了BIOS。这里有关于UEFI的一切。