NUMA (1)

本文涉及的产品
阿里云百炼推荐规格 ADB PostgreSQL,4核16GB 100GB 1个月
简介: 随着NUMA架构的不断发展,现在NUMA架构已经成为了企业级数据中心的主流。

numa相关的工具

随着NUMA架构的不断发展,现在NUMA架构已经成为了企业级数据中心的主流。

然而,NUMA架构在性能调优方面面临了新的挑战,例如内存分配的问题在NUMA系统之前并没人感兴趣,而numastat命令提供了一个监测NUMA架构的工具。

numastat

显示每个per-NUMA-node的统计数据。

对于系统中的每个节点,内核维护了一些有关NUMA分配状态的统计数据。numastat命令会基于节点对内存的申请,分配,转移,失败等等做出统计,也会报告NUMA策略的执行状况。这些信息对于测试NUMA策略的有效性是非常有用的。

[root@rds064071]/home/zunbao.fengzb/numa-tools/numatop/numatop# numastat -a
                           node0           node1
numa_hit              1453391677      1610480305
numa_miss              154554297       161470711
numa_foreign           161470711       154554297
interleave_hit             20016           20014
local_node            1453279663      1610457366
other_node             154666311       161493650

numactl

numactl的主要功能包括:

1. 设定进程的内存分配基本策略

2. 限定内存分配范围,如某一特定节点或部分节点集合

3. 对进程进行节点或节点集合的绑定

4. 修改命名共享内存,tmpfs或hugetblfs等的内存策略

5. 获取当前策略信息及状态

6. 获取NUMA硬件拓扑

numactl 查看节点的分布情况

[root@rds064071]/home/zunbao.fengzb/numa-tools/numatop/numatop# numactl -H
available: 2 nodes (0-1)
node 0 cpus: 0 1 2 3 8 9 10 11
node 0 size: 24567 MB
node 0 free: 20763 MB
node 1 cpus: 4 5 6 7 12 13 14 15
node 1 size: 24576 MB
node 1 free: 20303 MB
node distances:
node   0   1 
  0:  10  20 
  1:  20  10

numactl 设定进程NUMA策略

[root@rds064071]/home/zunbao.fengzb/numa-tools/numatop/numatop# numactl --cpubind=0 --membind=0,1 program
在节点0上的CPU运行名为program的程序,并且只在节点0,1上分配内存。Cpubind的参数是节点编号,而不是cpu编号。在每个节点上有多个CPU的系统上,编号的定义顺序可能会不同。

numactl 更改共享内存段的分配策略

[root@rds064071]/home/zunbao.fengzb/numa-tools/numatop/numatop# numactl --length=1G --file=/dev/shm/interleaved --interleave=all
对命名共享内存interleaved进行设置,其策略为全节点交织分配,大小为1G。

non-NUMA vs NUMA

从系统架构来说,目前的主流企业服务器基本可以分为三类:

SMP (Symmetric Multi Processing,对称多处理架构)

NUMA (Non-Uniform Memory Access,非一致存储访问架构)

MPP (Massive Parallel Processing,海量并行处理架构)

SMP(Symmetric Multi Processing)

SMP是非常常见的一种架构。在SMP模式下,多个处理器均对称的连接在系统内存上,所有处理器都以平等的代价访问系统内存。

image.png

特点是: 对内存的访问是平等、一致的;

缺点是:大家都是一致的,在传统的 SMP 系统中,所有处理器都共享系统总线,因此当处理器的数目增多时,系统总线的竞争冲突迅速加大,系统总线成为了性能瓶颈,所以目前 SMP 系统的处理器数目一般只有数十个,可扩展性受到很大限制。

MPP (Massive Parallel Processing)

image.png

MPP则是逻辑上将整个系统划分为多个节点,每个节点的处理器只可以访问本身的本地资源,是完全无共享的架构。节点之间的数据交换需要软件实施。它的优点是可扩展性非常好;缺点是彼此数据交换困难,需要控制软件的大量工作来实现通讯以及任务的分配、调度,对于一般的企业应用而言过于复杂,效率不高。

NUMA(Non-Uniform Memory Access)

image.png

NUMA架构则在某种意义上是综合了SMP和MPP的特点:逻辑上整个系统也是分为多个节点,每个节点可以访问本地内存资源,也可以访问远程内存资源,但访问本地内存资源远远快于远程内存资源。

它的优点是兼顾了SMP和MPP的特点, 易于管理,可扩充性好;缺点是访问远程内存资源的所需时间非常的大。相对于SMP,每个计算机不再只有唯一的内存控制器,而是把整个系统分成多个节点。每个节点分别有自己的处理器和内存。系统中所有的节点都通过全互联的方式连接。所以,每当在系统中增加新的节点,系统所能够支持的内存和带宽都会增加。在实际系统中使用比较广的是SMP和NUMA架构。像传统的英特尔IA架构就是SMP,而很多大型机采用了NUMA架构。

现在已经进入了多核时代,随着核数的越来越多,对于内存吞吐量和延迟有了更高的要求。正是考虑到这种需求,NUMA架构出现在了最新的英特尔下一代Xeon处理器中。

Xeon

Intel QuickPath Interconnect (Intel QPI)技术

使用QPI架构代替了原来的FSB架构,QPI是基于数据包传输,高带宽低延迟的点到点传输技术,速度可以达到6.4GT/s,对双向传输的QPI总线连接来说理论最大值可以达到25.6GB/s的数据传输,远远高于原来基于FSB架构的数据带宽。具体平台的实现中QPI连接数目可以根据目标市场和系统复杂性而有所不同,表现出极大的灵活性和扩展性。

image.png

FSB和QPI的对比图。

QPI可以实现不同CPU之间数据的快速传输。

Xeon中,同一CPU的不同core之间数据的快速传输,可以通过cache共享实现。

Intel QuickPath 集成内存控制器(IMC)

在每一个socket上集成了独立的DDR3内存控制器(IMC)供接口访问内存,较之非IMC的平台,大大提高了带宽(使用DDR3-1333可以达到32GB/s的峰值带宽,较之以前的平台具有四到六倍的带宽提升),显著地降低了内存延迟,从而提升了性能,为每个CPU提供了访问本地内存资源的快速通道。与前一代平台不同的是,内存访问采用NUMA架构,对于NUMA-aware的应用来说可以得到更大的性能提升。DDR3的IMC最大支持到每个CPU接口96GB的DDR3内存容量,将来最大容量可以达到144GB,为高端的企业运算提供了强有力的内存支持。

改进的电源管理

集成在芯片上的电源管理使得能耗的控制更加高效。

同步多线程技术(SMT)

同步多线程技术使得每个核心可以同时执行2个线程,所以对于4核的CPU来说,就可以在每个处理器芯片上达到最大8个逻辑处理器。

NUMA的内存组织

在NUMA系统中,每个CPU可以访问两种内存:本地内存(Local Memory)和远端内存(Remote Memory)。和CPU在同一个节点的内存称为本地内存,访问延迟非常低。和CPU在不同节点上的内存叫做远端内存,CPU需要通过节点互联方式访问,所以访问延迟要比访问本地内存长。

image.png

对于常规的内存操作,如清空(Memset),块复制(Memcpy),流读写(Stream),指针追溯(Pointer Chase)等操作来说,本地内存的访问速度要远远优于远端内存。

访问远端内存的开销与访问本地内存的开销比率称为 NUMA 比率。如果 NUMA 比率为 1,则它是对称多处理 (SMP)。比率越高,访问其他节点内存的开销就越大。不支持 NUMA 的 应用程序有时在 NUMA 硬件上的执行效果非常差。

NUMA的内存策略

NUMA策略(NUMA Policy)即是指在多个节点上合理的进行内存分配的机制。对于不同软件设计要求,策略的目标可能会不同:有一些设计可能强调低延迟访问,另一些则可能更加看重内存的访问带宽。

低延迟访问(low latency)的设计

对于强调低延迟访问的设计,基本的分配方式就是尽量在线程的本地内存上为其进行分配, 并尽量让线程保持在该节点上。这被称为线程的节点亲和性(Node affinity)。这样既充分利用了本地内存的低延迟, 同时也能有效降低节点间的通信负担。

NUMA架构的一个优势是,即便是在拥有大量CPU的大规模系统中,我们也可以保证局部内存访问的低延迟。通常来讲,CPU的处理速度是远大于内存的存取速度的。在读写内存时,CPU常常需要花大量的时钟周期来等待。降低内存访问的延迟因而能够有效的提升软件性能。

节点亲和性 VS 缓存亲和性

为SMP设计的操作系统通常会有缓存亲和性(Cache Affinity) 的优化措施。缓存亲和性机制可以让数据尽量长时间的保留在某一个CPU的缓存中,而不是来回在多个CPU的缓存里换来换去。操作系统通常是通过优化进行线程/进程调度来保证这一点:在线程被重新调入时,调度器会尽量让线程在之前运行的同一个CPU上运行,从而保证缓存利用率。这一机制显然是和NUMA系统尽量利用本地内存的策略是一致的,有利于面向SMP系统的程序向NUMA架构移植。

但缓存亲和性机制同NUMA系统的节点亲和性又是有区别的:首先,同一个节点间多个CPU或者核的线程迁移并不影响该线程的节点亲和性;其次,当线程被迫迁移到其他节点时,他所拥有的内存是不会跟着迁移的, 仍然保留在原来位置。这个时候,本地内存就变成了远端内存,对它的访问既慢又占用节点通信带宽。相对的,线程在迁移之后能够以较小的代价迅速建立起新的缓存,并继续在新CPU上体现缓存的亲和优势。 因此,NUMA系统对于节点亲和性的依赖更大。

代价:本地内存访问 < 远程内存访问 < CPU空闲

操作系统的调度器同时也不能仅仅为保证节点亲和性做优化。因为通常相对于频繁访问远端内存来说,让CPU空闲带来的性能损失更大。如果特定应用系统的性能受内存访问的影响远大于CPU的利用率,这个时候程序员或者管理员则可采用特别的NUMA策略来强调节点的亲和性,从而提升性能。

内存的访问带宽(high bandwidth)的设计

image.png

另外, 尽管大部分应用会因为优化响应时间而收益,还有一部分应用则对内存带宽比较敏感。为了提升内存带宽,NUMA架构下的多个内存控制器可以并行使用。这类似于RAID阵列通过并行处理磁盘IO来提升读写性能。通过适当的软件或者硬件机制,NUMA架构可以使内存控制单元在各个内存控制器上交替的分配内存。这意味着分配得到的连续内存页面会水平地分布到各个节点上。当应用程序对内存进行流式读写时,各个内存控制器的带宽就相当于累加了。此机制获得性能提升决定于NUMA架构的实现。对于远端内存访问延迟严重的架构,该提升往往会比较明显。在一些NUMA系统中,系统硬件本身提供了节点交织分配机制;而在没有硬件提供节点交织的系统中,可由操作系统来实现该机制。

参考资料: http://www.360doc.com/content/11/1219/18/2245786_173438994.shtml

相关实践学习
阿里云百炼xAnalyticDB PostgreSQL构建AIGC应用
通过该实验体验在阿里云百炼中构建企业专属知识库构建及应用全流程。同时体验使用ADB-PG向量检索引擎提供专属安全存储,保障企业数据隐私安全。
AnalyticDB PostgreSQL 企业智能数据中台:一站式管理数据服务资产
企业在数据仓库之上可构建丰富的数据服务用以支持数据应用及业务场景;ADB PG推出全新企业智能数据平台,用以帮助用户一站式的管理企业数据服务资产,包括创建, 管理,探索, 监控等; 助力企业在现有平台之上快速构建起数据服务资产体系
相关文章
|
6月前
|
负载均衡 安全 Linux
SMP多核启动(二):PSCI
SMP多核启动(二):PSCI
514 0
|
缓存 Linux
什么是NUMA,我们为什么要了解NUMA
在IA多核平台上进行开发时,我们经常会提到NUMA这个词 ,那么NUMA到底指的是什么?我们怎么可以感受到它的存在?以及NUMA的存在对于我们编程会有什么影响
什么是NUMA,我们为什么要了解NUMA
|
缓存 Linux 调度
CPU的亲和性
CPU的亲和性
213 0
|
缓存
完了!CPU一味求快出事儿了!
今天我们来为大家讲讲计算机的底层技术,CPU的那些事,快跟我一起去看看它又给我们整了什么活吧。
370 0
完了!CPU一味求快出事儿了!