在IA多核平台上进行蛊卦时丁香五月天,咱们世俗会提到NUMA这个词 ,那么NUMA到底指的是什么?咱们怎样不错感受到它的存在?以及NUMA的存在对于咱们编程会有什么影响?今天咱们沿途来看一下。
1、NUMA的由来
NUMA(Non-Uniform Memory Access),即非一致性内存观看,是一种对于多个CPU怎样观看内存的架构模子,早期,在盘算推算机系统中,CPU是这么观看内存的:
图片
在这种架构中,扫数的CPU王人是通过一条总线来观看内存,咱们把这种架构叫作念SMP架构(Symmetric Multi-Processor),也便是对称多处理器结构。不错看出来,SMP架构有底下4个特质:
小二先生 调教CPU和CPU以及CPU和内存王人是通过一条总线贯串起来
CPU王人是对等的,莫得主从关系
扫数的硬件资源王人是分享的,即每个CPU王人能观看到任何内存、外设等
内存是和洽结构和和洽寻址的(UMA, Uniform Memory Architecture)
SMP架构在CPU核未几的情况下,问题不澄澈,有实考讲授,SMP做事器CPU行使率最佳的情况是2至4个CPU:
图片
然而跟着CPU多核技能的发展,一颗物理CPU中集成了越来越多的core,导致SMP架构的性能瓶颈越来越澄澈,因为扫数的处理器王人通过一条总线贯串起来,因此跟着处理器的加多,系统总线成为了系统瓶颈,另外,处理器和内存之间的通讯延伸也较大。
为了惩处SMP架构下握住增多的CPU Core导致的性能问题,NUMA架构应时而生,NUMA调遣了CPU和内存的布局和观看关系,具体表露如下图:
图片
在NUMA架构中,将CPU分裂到多个NUMA Node中,每个Node有我方零丁的内存空间和PCIE总线系统。各个CPU间通过QPI总线进行互通。
CPU观看不同类型节点内存的速率是不疏通的,观看腹地节点的速率最快,观看远端节点的速率最慢,即观看速率与节点的距离联系,距离越远访,问速率越慢,是以叫作念非一致性内存观看,这个观看内存的距离咱们称作Node Distance。
固然NUMA很好的惩处了SMP架构下CPU大王人膨大带来的性能问题,然而其自己也存在着不及,当Node节点腹地内存不实时,需要跨节点观看内存,节点间的观看速率慢,从而也会带来性能的着落。是以咱们在编写应用要领时,要充分行使NUMA系统的这个特质,尽量的减少不同CPU模块之间的交互,幸免汉典观看资源,要是应用要领能有次第固定在一个CPU模块里,那么应用的性能将会有很大的提高。
2、NUMA架构下的CPU和内存散播
在Linux系统上,不错检察到NUMA架构下CPU和内存的散播情况,不外在这之前,咱们先得理清几个意见:
Socket:表露一颗物理 CPU 的封装(物理 CPU 插槽),简称插槽。为了幸免将逻辑处理器和物理处理器欺凌,Intel 将物理处理器称为插槽,Socket表露不错看得到的委果的CPU核 。
Core:物理 CPU 封装内的零丁的一组要领推行的硬件单位,比如寄存器,盘算推算单位等,Core表露的是在合并个物理核内逻辑层面的核。合并个物理CPU的多个Core,有我方零丁的L1和L2 Cache,分享L3 Cache。
Thread:使用超线程技能臆造出来的逻辑 Core,需要 CPU 撑抓。为了便于区分,逻辑 Core 一般被写稿 Processor。在具有 Intel 超线程技能的处理器上,每个内核不错具有两个逻辑处理器,这两个逻辑处理器分享大多数内核资源(如内存缓存和功能单位)。此类逻辑处理器世俗称为 Thread 。超线程不错在一个逻辑核恭候提示推行的拒绝(恭候从cache或内存中得回下一条提示),把时刻片分拨到另一个逻辑核。高速在这两个逻辑核之间切换,让应用要领感知不到这个拒绝,误合计我方是独占了一个核。对于每个逻辑线程,领有圆善零丁的寄存器结合和腹地中断逻辑,分享推行单位和一二三级Cache,超线程技能不错带来20%~30%的性能提高。
Node:即NUMA Node,包含有多少个 CPU Core 的组。
Socket、Core和Threads之间的关系表露如下:
图片
在Linux系统中,不错用lscpu检察NUMA和CPU的对应关系:
图片
从上图不错看到,这台做事器有两个NUMA node,有两个Socket,每个Socket也便是一个物理CPU,有4个逻辑Core,每个逻辑Core有两个线程(做事器开启了超线程),是以所有的CPU个数(以超线程计数)为:2*4*2 = 16个。
使用numactl -H大喊不错看到NUMA下的内存散播:
图片
是以这台做事器上CPU和内存在NUMA下的散播如下:
图片
NUMA架构下的CPU,先从逻辑Core运转编号,要是开启了超线程,就从Core总额的背面不绝编号,举例上图中从cpu8运转之后的王人是开启超线程之后的CPU线程。
另外,在实质编程中,咱们还不错通过numastat大喊检察NUMA系统下内存的观看掷中率:
图片
numa_hit:见效分拨给此节点的页面数目。
numa_miss:由于预期节点上的内存较低,在此节点上分拨的页面数目。每个 numa_miss 事件在另一个节点上王人有对应的 numa_foreign 事件。
numa_foreign:领先用于分拨给另一节点的页面数目。每个 numa_foreign 事件在另一节点上王人有对应的 numa_miss 事件。
interleave_hit:见效分拨给此节点的错乱计策页面数目。
local_node:此节点上的程度在这个节点上见效分拨的页面数目。
other_node:通过另一节点上的程度在这个节点上分拨的页面数目。
要是miss值和foreign值越高,就要接洽线程绑定以及内存分拨使用的问题。
需要刺办法是,NUMA Node和socket并不一定是一双一的关系,在AMD的CPU中,可能更多见于NUMA Node比socket个数多(一般AMD的CPU的NUMA不错在BIOS中进行竖立),而Intel的CPU中,NUMA Node可能比socket的个数还少。
举例鄙人面这台做事器上,使用的是AMD的EPYC 7001,NUMA有8个,然而Socket惟有两个:
图片
3、NUMA架构下的编程
NUMA架构权臣的特质便是CPU观看腹地内存快,观看汉典内存慢。是以咱们在NUMA架构下编写要领,要酌盈注虚,多核多线程编程中,咱们要尽可能的行使CPU Core的亲和性,将线程绑定到对应的CPU上,况且该线程从该CPU对应的腹地内存上去苦求内存,这么智商最大达成发扬NUMA架构的上风,达到比拟好的处感性能。
简便来说,便是腹地的处理器、腹地的内存来处理腹地的建造上产生的数据。要是有一个PCI建造(比如网卡)在Node0上,就用Node0上的核来处理该建造,处理该建造用到的数据结构和数据缓冲区王人从Node0上分拨。
在DPDK中,有一个rte_socket_id()函数,不错得回现时哨程地方的NUMA Node,在使用DPDK提供苦求内存的接口中,一般王人需要传入参数NUMA id,亦然基于提高NUMA架构下的报文转发性能接洽。
好了丁香五月天,对于NUMA的先容以及NUMA下CPU内存的散播的内容就到这里了,可爱的一又友来个柔软、点赞加在看可好~~
本站仅提供存储做事,扫数内容均由用户发布,如发现存害或侵权内容,请点击举报。