NUMA学习

本文介绍了NUMA架构的基本概念,包括其如何通过划分节点提升内存访问速度,以及numactl工具在内存管理和限制上的应用。重点讨论了NUMA陷阱、内存分配策略的选择,以及UMA和SMP的区别。针对不同规模内存需求的程序,提供了优化建议和实例操作指导。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

NUMA概念

比如一台机器是有2个处理器,有4个内存块。我们将1个处理器和两个内存块合起来,称为一个NUMA node,这样这个机器就会有两个NUMA node。在物理分布上,NUMA node的处理器和内存块的物理距离更小,因此访问也更快。比如这台机器会分左右两个处理器(cpu1, cpu2),在每个处理器两边放两个内存块(memory1.1, memory1.2, memory2.1,memory2.2),这样NUMA node1的cpu1访问memory1.1和memory1.2就比访问memory2.1和memory2.2更快。所以使用NUMA的模式如果能尽量保证本node内的CPU只访问本node内的内存块,那这样的效率就是最高的。
在运行程序的时候使用numactl -m和-physcpubind就能制定将这个程序运行在哪个cpu和哪个memory中。玩转cpu-topology 给了一个表格,当程序只使用一个node资源和使用多个node资源的比较表(差不多是38s与28s的差距)。所以限定程序在numa node中运行是有实际意义的。事实上Linux识别到NUMA架构后,默认的内存分配方案就是:优先尝试在请求线程当前所处的CPU的Local内存上分配空间。如果local内存不足,优先淘汰local内存中无用的Page(Inactive,Unmapped)。

NUMA陷阱

但是呢,话又说回来了,制定numa就一定好吗?SWAP的罪与罚文章就说到了一个numa的陷阱的问题。现象是当你的服务器还有内存的时候,发现它已经在开始使用swap了,甚至已经导致机器出现停滞的现象。这个就有可能是由于numa的限制,如果一个进程限制它只能使用自己的numa节点的内存,那么当自身numa node内存使用光之后,就不会去使用其他numa node的内存了,会开始使用swap,甚至更糟的情况,机器没有设置swap的时候,可能会直接死机!所以你可以使用numactl --interleave=all来取消numa node的限制。

如果你的程序是会占用大规模内存的,你大多应该选择关闭numa node的限制(或从硬件关闭numa)。因为这个时候你的程序很有几率会碰到numa陷阱。另外,如果你的程序并不占用大内存,而是要求更快的程序运行时间。你大多应该选择限制只访问本numa node的方法来进行处理。总结如下:

如果程序会占用大内存的,因为很有可能碰到 SWAP 问题
1. 考虑从 BIOS 层 关闭 NUMA。
2. 考虑从 OS 层 关闭 NUMA。
3. 设置 NUMA 的 内存 分配策略 为 interleave=all。
4. 设置 内核参数 vm.zone_reclaim_mode=0。

如果程序并不会占用大内存,而是要求更快的程序运行时间。
1. 应该选择限制只访问本 NUMA node。

UMA和SMP是两种CPU相关的硬件架构。在SMP架构里面,所有的CPU争用一个总线来访问所有内存,优点是资源共享,而缺点是总线争用激烈。随着PC服务器上的CPU数量变多(不仅仅是CPU核数),总线争用的弊端慢慢越来越明显,于是Intel在Nehalem CPU上推出了NUMA架构,而AMD也推出了基于相同架构的Opteron CPU。
NUMA最大的特点是引入了node和distance的概念。对于CPU和内存这两种最宝贵的硬件资源,NUMA用近乎严格的方式划分了所属的资源组(node),而每个资源组内的CPU和内存是几乎相等。资源组的数量取决于物理CPU的个数(现有的PC server大多数有两个物理CPU,每个CPU有4个核);distance这个概念是用来定义各个node之间调用资源的开销,为资源调度优化算法提供数据支持。

NUMA 策略

每个进程(或线程)都会从父进程继承NUMA策略,并分配有一个优先node。如果NUMA策略允许的话,进程可以调用其他node上的资源。

NUMA的CPU分配策略有cpunodebind、physcpubind。cpunodebind规定进程运行在指定的NUMA node之上,而physcpubind可以更加精细地规定运行在指定的逻辑核上

NUMA的内存分配策略有localalloc、preferred、membind、interleave。

localalloc规定进程从当前node上请求分配内存;
preferred比较宽松地指定了一个推荐的node来获取内存,如果被推荐的node上没有足够内存,进程可以尝试别的node。
membind可以指定若干个node,进程只能从这些指定的node上请求分配内存。
interleave规定进程从指定的若干个node上以RR(Round Robin 轮询调度)算法交织地请求分配内存。

numactl命令

yum install numactl

numactl --hardware

numactl --show

numastat 

如果发现 numa_miss 数值比较高时,说明需要对分配策略进行调整。
例如将指定进程关联绑定到指定的CPU上,从而提高内存命中率。

NUMA 的 分配策略例子

  1. 绑定
    numactl --physcpubind=1 --localalloc /usr/sbin/named
  2. 查看cpu数量
    grep processor /proc/cpuinfo
  3. 查看named进程ID
    ps -aux | grep named
  4. 查看named进程在哪个CPU上     #ps工具提供了PSR列显示当前进程运行的CPU
    ps -axo pid,psr | grep 11904
  5. 查看named的绑定状态

 

 

 

<think>好的,用户现在想了解NUMA架构的定义和作用,以及它是如何工作的。之前用户提到了华为分布式块存储中的ZK盘,现在突然转到了NUMA架构,我需要确保正确理解他们的需求。用户可能是在学习系统架构相关的知识,或者在工作中遇到了性能调优的问题,特别是与内存访问相关的部分。 首先,我需要回忆NUMA的基本概念。根据用户提供的引用,NUMA是非一致性内存访问架构,用来解决多处理器系统中的扩展性问题。用户引用的资料提到,NUMA通过为每个处理器节点提供本地内存,减少总线争用,从而提升性能。同时,用户还提到SMP架构的缺点,比如总线成为瓶颈,而NUMA解决了这些问题。 用户的问题明确,需要知道NUMA的定义、作用和工作原理。我需要将这些信息组织成结构清晰的回答,分点说明。同时,用户之前的对话涉及分布式存储中的组件,所以可能需要避免混淆,专注于NUMA本身,不过用户没有提到联系,所以暂时不用关联。 接下来,我需要确保回答符合之前的格式要求:使用中文,行内公式用$...$,独立公式单独成段,正确使用LaTeX,生成相关问题。同时,要参考用户提供的引用内容,但用户提到这些引用只是参考,实际需要根据上一次的问题和回答来调整。用户的上一次问题关于ZK盘和元数据节点,但这次完全转向NUMA,所以可能不需要直接关联,但需要确保引用正确。 现在,我需要定义NUMA,解释其出现背景(SMP的不足),然后说明NUMA的工作原理,包括节点结构、内存访问方式,以及如何工作。同时,作用部分需要强调优势,比如扩展性、降低延迟、提升吞吐量等。还要注意对比SMP架构,突出NUMA的不同之处。 在写作过程中,要避免技术错误,比如确保正确区分NUMA和ccNUMA,用户引用中提到ccNUMA是解决缓存一致性的NUMA架构,所以需要提到这一点。另外,调优策略可能也是用户关心的,但用户的问题没有直接问,可能需要在相关问题中提及。 最后,生成的相关问题需要围绕NUMA的应用场景、性能调优、与SMP的对比,以及具体技术如跨节点访问的影响等。确保问题能够引导用户进一步学习。 总结步骤: 1. NUMA的定义和背景,对比SMP。 2. 详细工作原理,包括节点组成、内存访问方式。 3. 作用和优势。 4. 工作流程分步说明。 5. 调优注意事项。 6. 相关问题生成。 需要检查引用是否正确,用户提供的引用1、2、3分别对应NUMA简介、ccNUMA、与SMP的对比,这些在回答中要适当标注引用标记。确保回答结构清晰,分点明确,使用示例或类比帮助理解。</think>### NUMA架构解析:定义、作用与工作原理 #### 一、**NUMA的定义与背景** **NUMA(Non-Uniform Memory Access,非一致性内存访问)** 是一种多处理器架构设计,其核心特征是:**不同处理器访问不同物理内存区域的延迟存在差异**。每个处理器节点拥有本地内存(访问速度快),也可访问其他节点的远程内存(访问速度较慢)。这种设计解决了传统 **SMP(对称多处理)架构** 的总线瓶颈问题[^3]。 **对比SMP架构的局限性**: - **总线争用**:SMP中所有CPU通过单一总线访问共享内存,随着CPU数量增加,总线带宽成为瓶颈[^3]。 - **扩展性差**:内存访问延迟随CPU数量增长而显著上升[^3]。 - **NUMA的改进**:通过分布式内存设计,将内存划分为多个本地节点,减少总线依赖,提升扩展性[^2]。 --- #### 二、**NUMA的核心作用** 1. **提升系统扩展性** - 每个CPU节点独立管理本地内存,支持更大规模的多处理器系统[^2]。 2. **降低内存访问延迟** - 本地内存访问速度远快于远程访问(例如:本地延迟约100ns,跨节点延迟可能翻倍)[^1]。 3. **提高内存吞吐量** - 多节点并行访问本地内存,避免总线竞争。 --- #### 三、**NUMA的工作原理** ##### 1. **架构组成** - **NUMA节点**:每个节点包含: - 一个或多个CPU(称为**Socket**或**Core Group**) - 本地物理内存(**Local Memory**) - 互联总线(如**QPI**或**Infinity Fabric**)用于跨节点通信[^1]。 - **内存访问模式**: - **本地访问**:CPU直接访问本地内存,延迟低。 - **远程访问**:CPU通过互联总线访问其他节点的内存,延迟高(需维护缓存一致性协议,如**MESI**)。 ##### 2. **NUMA的工作流程** 以应用程序请求内存为例: 1. **操作系统分配内存** → 优先从请求线程所在CPU的本地NUMA节点分配内存[^1]。 2. **本地内存不足时** → 从其他节点分配远程内存(性能下降)[^1]。 3. **缓存一致性维护** → 通过硬件协议(如**ccNUMA**)确保多核缓存数据一致性[^2]。 ##### 3. **NUMA的调度优化** - **CPU亲和性(Affinity)**:将进程绑定到特定NUMA节点,减少跨节点访问。 - **内存本地化策略**:操作系统(如Linux)通过`numactl`工具强制内存分配在本地节点。 --- #### 四、**NUMA与SMP的对比** | 特性 | SMP | NUMA | |---------------------|------------------------------|-------------------------------| | **内存访问方式** | 所有CPU共享同一内存池 | 内存分属不同节点,本地优先访问 | | **扩展性** | 差(总线瓶颈) | 高(分布式设计) | | **典型应用场景** | 低核数服务器(如4-8核) | 高性能计算、多路服务器(64+核)| | **缓存一致性** | 全局总线维护 | 通过互联协议维护(如ccNUMA) | --- #### 五、**NUMA的调优注意事项** 1. **监控工具**: - `numastat`:查看NUMA内存分配统计。 - `lscpu`:查看CPU与NUMA节点拓扑。 2. **避免性能陷阱**: - **跨节点访问**:可能导致性能下降30%以上[^1]。 - **内存碎片化**:远程内存分配过多会加剧延迟。 --- ### 典型问题解答 **Q1: 如何判断程序是否受NUMA架构影响?** - 使用`perf`工具分析缓存未命中率,或通过`numastat`观察跨节点内存访问比例[^1]。 **Q2: 为什么数据库服务需要NUMA优化?** - 数据库内存访问密集,若内存分布不合理,跨节点访问会显著增加查询延迟[^1]。 --- ### 总结 - **NUMA**通过分布式内存设计解决多处理器系统的扩展性问题,但需合理调度以避免跨节点访问带来的性能损失。 - 关键优势包括:本地内存低延迟、高并发吞吐量、支持大规模核心数[^2]。 --- ### 相关问题 1. 如何通过`numactl`工具强制进程内存本地化? 2. NUMA架构下跨节点访问的延迟具体由哪些因素决定? 3. 在虚拟化环境中,NUMA调度策略如何影响虚拟机性能? 4. ccNUMA与普通NUMA架构的核心区别是什么?
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值