百度360必应搜狗淘宝本站头条
当前位置:网站首页 > 编程文章 > 正文

浅谈NUMA

qiyuwang 2025-03-05 20:57 11 浏览 0 评论


1. 前言

UMA(Non-Uniform Memory Access)是一种计算机体系结构设计,旨在提高多处理器系统中的内存访问效率。在传统的对称多处理器(SMP)系统中,所有处理器共享同一总线和内存,每个处理器可以直接访问所有内存位置,但访问延迟可能会因为总线争用而增加。

而在 NUMA 架构中,处理器和内存被组织成多个节点,每个节点包含一组处理器和与之关联的一部分内存。每个节点都有本地内存,可以直接访问,而对于其他节点的内存,需要通过跨节点的连接进行访问。这种设计使得每个节点内的访问延迟较低,但跨节点访问的延迟较高。

NUMA 的设计初衷是解决多处理器系统中的内存访问瓶颈问题。通过将处理器和内存划分为多个节点,可以减少内存访问的竞争,提高整体性能和扩展性。NUMA 架构适用于需要处理大量数据的高性能计算、大规模数据库和虚拟化等应用场景。

2. 三种常见服务器架构

  • SMP(Symmetric Multi-Processor,对称多处理结构)。单主机架构。

  • NUMA(Non-Uniform Memory Access,非一致性内存访问)。单主机架构。

  • MPP(Massive Parallel Processing,海量并行处理结构)。多主机架构。

SMP(Symmetric Multi-Processor,对称多处理结构)。单主机架构

SMP服务器中有多个处理器对称工作,无主次之分。各处理器平等使用所有物理内存,对资源的权限和访问效率都一样,由单一操作系统来控制。由于多处理器在内存访问上是完全平等的,所以SMP也被称为一致性内存访问(UMA, Uniform Memory Access)。

架构示意图:

SMP的资源共享特质也导致了其扩展存在瓶颈:每一个共享的环节出现瓶颈都会影响整个SMP服务器,尤其是内存!每一个处理器必须通过同一条内存总线访问同一处内存资源,所以随着处理器数量的增加,内存访问、总线使用的冲突就会迅速增加,最终造成处理器资源的浪费,使得处理器性能的有效性大大降低。

**NUMA(**Non-Uniform Memory Access,非一致性内存访问)

SMP这样的一致性内存访问结构由于公用总线等资源,存在扩展上的限制。而NUMA为提高扩展性提供了一种方案。

  • 由多个CPU模块组成,CPU模块也称为NUMA节点。每个节点可以包括多个处理器,有独立的本地内存,I/O插槽。
  • NUMA节点间通过互联模块(称为Crossbar Switch)进行连接和信息交互,所以每个CPU可以访问整个系统的内存。显然,访问本地内存速度将远高于访问其他NUMA节点的内存。由于内存资源的不同存取代价,所以有了非一致性存储NUMA的名称。
  • 基于本地内存与其他节点的内存的访问效率差异,开发应用程序应尽量减少不同NUMA节点之间的信息交互。

NUMA虽然相对SMP服务器扩展性较好,但是依然有局限,单个节点的内存容量有限,而访问远地内存的延时远远超过本地内存。当CPU数量增加时,系统性能无法线性增加。

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

无论是SMP架构还是NUMA架构,作为单台服务器,扩展能力毕竟有限,MPP提供了使用SMP服务器作为节点的系统扩展方案。

  • 单个节点是SMP服务器,所以MPP其实与SMP、NUMA服务器不同,其实由多台物理机组成。
  • 不同节点间通过"节点互联网络"进行通信,"节点互联网络"仅供MPP服务器内部使用,对用户而言是透明的
  • 用户角度只看到一个服务器系统
  • 每个SMP服务器只访问本地的资源,不会跨节点资源占用。而节点间的信息交互,称为数据重分配(Data Redistribution)

这样的架构提供了完全无共享(Share Nothing)系统结构,理论上可以无限扩展!但是MPP服务器需要一种复杂的机制来调度和平衡各个节点的负载和并行处理过程。常用的一种做法是添加一层系统级软件来隔离这种复杂度对开发人员的影响,如特定数据库系统。这样开发人员只需要与数据库系统交互,而由数据库系统实现后代MPP系统节点间的调度、并行。

3.NUMA的缺点

尽管NUMA架构可以提高多处理器系统的性能和可扩展性,但也会引入一些问题,包括以下几个方面:

  1. 内存访问延迟不均衡:由于NUMA架构中不同节点的内存访问延迟不同,访问本地节点的内存速度通常比访问远程节点的内存速度更快。这可能导致在访问远程节点内存时出现延迟增加的情况,从而影响系统性能。
  2. 内存亲和性:NUMA架构下,操作系统和应用程序需要考虑将数据放置在适当的节点上,以尽量减少跨节点访问。这需要在程序设计和调度策略中考虑内存亲和性,以避免性能下降。
  3. 进程迁移开销:当一个进程从一个节点迁移到另一个节点时,需要将其相关的数据从一个节点的内存迁移到另一个节点的内存。这会导致额外的数据传输开销和延迟,并且可能影响应用程序的性能。
  4. 内存碎片化:由于不同节点之间的内存是独立管理的,节点之间的内存分配可能会导致内存碎片化。这可能导致内存利用率降低,并可能影响系统性能和可扩展性。

为了解决NUMA带来的问题,操作系统和应用程序需要采取相应的优化措施。例如,可以使用合适的内存分配策略和调度算法来最大程度地减少跨节点访问,减少内存延迟。此外,针对NUMA架构进行编程和调优,以最大程度地利用节点之间的内存亲和性,也是一种常见的优化方法。

一些案例

  • MySQL – The MySQL “swap insanity” problem and the effects of the NUMA architecture
  • PostgreSQL – PostgreSQL, NUMA and zone reclaim mode on linux
  • Oracle – Non-Uniform Memory Access (NUMA) architecture with Oracle database by examples
  • Java – Optimizing Linux Memory Management for Low-latency / High-throughput Databases

4.NUMA工具推荐

numastat

numastat用来查看进程或者整个系统的内存消耗在各个NUMA节点的分布情况:

[root@localhost ~]# numastat
node0 node1
numa_hit 2032005 369189
numa_miss 0 0
numa_foreign 0 0
interleave_hit 23838 24012
local_node 2031767 333279
other_node 238 35910
  • numa_hit表示成功地从该节点分配到的内存页数。
  • numa_miss表示成功地从该节点分配到的内存页数,但其本意是希望从别的节点分配,失败以后退而求其次从改节点分配。
  • numa_foreign与numa_miss互为“影子”,每个numa_miss都来自另一个节点的numa_foreign。
  • Interleave_hit,有时候内存请求是没有NUMA节点偏好的,此时会均匀分配自各个节点(interleave),这个数值就是这种情况下从该节点分配出去的内存页面数。
  • local_node表示分配给运行在同一节点的进程的内存页数
  • other_node与上面相反。local_node值加上other_node值就是numa_hit值。

以上数值默认都是内存页数,要看具体多少MB可以通过加上-n参数实现。

[root@localhost ~]# numastat -n

Per-node numastat info (in MBs):
Node 0 Node 1 Total
--------------- --------------- ---------------
Numa_Hit 8256.67 1574.98 9831.64
Numa_Miss 0.00 0.00 0.00
Numa_Foreign 0.00 0.00 0.00
Interleave_Hit 93.12 93.80 186.91
Local_Node 8255.74 1434.70 9690.44
Other_Node 0.93 140.27 141.20

numastat还可以只看某些进程,甚至只要名字片段匹配。例如看QEMU进程的内存分布情况,可以通过numastat qemu即可。

[root@localhost ~]# numastat qemu

Per-node process memory usage (in MBs)
PID Node 0 Node 1 Total
---------------- --------------- --------------- ---------------
2681 (qemu-kvm) 118.16 963.35 1081.51
2891 (qemu-kvm) 215.45 844.11 1059.55
2939 (qemu-kvm) 417.84 649.43 1067.27
2987 (qemu-kvm) 342.42 1048.06 1390.48
3039 (qemu-kvm) 16433.61 3.44 16437.05
3088 (qemu-kvm) 257.98 858.12 1116.10
3136 (qemu-kvm) 1097.77 238.20 1335.96
3182 (qemu-kvm) 896.34 431.20 1327.54
3229 (qemu-kvm) 493.41 705.16 1198.57
---------------- --------------- --------------- ---------------
Total 20272.98 5741.05 26014.03
[root@localhost ~]# numastat qemu -n

Per-node process memory usage (in MBs)
PID Node 0 Node 1 Total
---------------- --------------- --------------- ---------------
2681 (qemu-kvm) 118.16 963.35 1081.51
2891 (qemu-kvm) 215.34 844.21 1059.55
2939 (qemu-kvm) 417.82 649.45 1067.27
2987 (qemu-kvm) 341.39 1049.09 1390.48
3039 (qemu-kvm) 16433.64 3.41 16437.05
3088 (qemu-kvm) 257.94 858.16 1116.10
3136 (qemu-kvm) 1097.71 238.25 1335.96
3182 (qemu-kvm) 897.84 429.70 1327.54
3229 (qemu-kvm) 493.41 705.16 1198.57
---------------- --------------- --------------- ---------------
Total 20273.25 5740.77 26014.03

Per-node numastat info (in MBs):
Node 0 Node 1 Total
--------------- --------------- ---------------
Numa_Hit 8379.65 1749.08 10128.73
Numa_Miss 0.00 0.00 0.00
Numa_Foreign 0.00 0.00 0.00
Interleave_Hit 93.12 93.80 186.91
Local_Node 8378.72 1608.80 9987.52
Other_Node 0.93 140.27 141.20

numad

numad是一个可以自动管理NUMA亲和性(affinity)的工具(同时也是一个后台进程)。它实时监控NUMA拓扑结构(topology)和资源使用,并动态调整。同时它还可以在启动一个程序前,提供NUMA优化建议。

可以通过man查看其使用,由于numad讨论起来可能比较长篇大论,这里就不做展开了



相关推荐

在Word中分栏设置页码一页两个页码的技巧!

施老师:在正常情况下,Word文档中一页只会出现一个页码。但在某种情况下,比如说:用了分栏后,我们希望一页中出现两个页码,那应该如何实现呢?今天,就由宁双学好网施老师来为大家讲一下,利用域来实现一页两...

如何在关键时刻向上自荐(如何在关键时刻做出正确选择)

抓住机会,挺身而出有种时刻叫“关键时刻”,关键时刻,作为一个认为自己有能力的、训练有素的人,应该考虑挺身而出,甚至应该不考虑就挺身而出。...

WPS Word:跨页的文档表格,快速调整为一页。#Excel

如何快速将跨页的文档表格调整为一页?需要根据两种情况分别处理。如果表格所有行的行高相同,调整为一页的方法有两种。第一种方法是将光标移动到表格内,然后将鼠标移动到表格右下角的方框处,按住鼠标左键向上拖动...

word文档插入下一页分节符(word下一页分页符)

在word文档中,对文档页面进行分页是特别常见的操作,其中的下一页分节符也是用得比较多的,但是一些人不太清楚在哪里设置,也不知道它具体能实现的功能是什么。接下来看看如何在word文档中插入下一页分节符...

word文档如何设置某一页纸张的方向

word文档页面方向有横向和纵向,纵向是默认的纸张方向,有时我们需要将页面设置为横向,或只设置其中某一页方向,应该怎么操作呢?一起来看看下面的详细介绍第一步:...

word怎么单独设置一页为横向(word2019怎样设置单独一页为横向)

word里面其中一页可以改为横向的吗?经过实际操作发现是完全可以的。...

Word如何设置分栏,如何一页内容同时显示一栏和两栏

我们使用Word文档,有时需要用到两栏的排版,甚至一页内容同时包含一栏和两栏的排版,这种格式怎么设置呢?具体步骤如下:首先是两栏排版的设置,直接点击Word文件上方工具栏【布局】,选择【分栏】下面的【...

Word怎么分页?这三个方法可以帮到你

我们不仅可以利用Word编辑文档,还可以编辑文集呢。但是有时候会出现两个部分的文章长短不一,我们需要对文档进行分页处理。这样可以方便我们对文档进行其他操作。那么Word怎么分页呢?大家可以采用下面这...

Word内容稍超一页,如何优化至单页打印?

如何将两页纸的内容,缩到一页打印呢?有时候一页纸多一点内容,我们完全可以缩一下,放到一页来打印。...

[word] word 表格如何跨行显示表头、标题

word表格如何跨行显示表头、标题在Word中的表格如果过长的话,会跨行显示在另一页,如果想要在其它页面上也显示表头,更直观的查看数据。难道要一个个复制表头吗?当然不是,教你简单的方法操作设置Wo...

Word表格跨页如何续上表?(word如何让表格跨页不断掉)

长文档的表格跨页时,你会发现页末空白太多了,这时要怎么调整?选中整张表格,右击【表格属性】,点击【行】选项,之后勾选【允许跨页断行】,点击确定即可解决空白问题。...

Word怎么连续自动生成页码,操作步骤来了!

Word怎么连续自动生成页码,操作步骤来了!...

word文档怎么把两页合并成一页内容?教你4种方法

word怎么把两页合并成一页?word怎么把两页合并成一页?用四种方法演示一下。·方法一:把这一个文档合并成一页,按ctrl加a全选文档,然后右键点击段落,弹出的界面行距改成固定值,磅值可以改小一点,...

如何将Word中的一页的纸张方向设置为横向?这里提供详细步骤

默认情况下,MicrosoftWord将页面定向为纵向视图。虽然这在大多数情况下都很好,但你可能拥有在横向视图中看起来更好的页面或页面组。以下是实现这一目标的两种方法。无论使用哪种方法,请注意,如果...

Word横竖混排你会玩吗?(word横排竖排混合)

我们在用Word排版的时候,一般都是竖版格式,但偶尔会需要到一些特殊的版式要求,比如文档中插入的一个表格,横向的内容比较多,这时就需要用到横版,否则表格显示不全。这种横竖版混排的要求,在Word20...

取消回复欢迎 发表评论: