NUMA 体系架构

本文介绍了CPU计算平台的SMP和NUMA体系架构,指出SMP扩展性差,而NUMA采用分布式存储器优化了该问题。还阐述了NUMA结构基本概念,如Socket、Core等。同时讲解了OpenStack flavor NUMA策略,包括cpu绑核、拓扑及大页内存分配,最后说明了Nova实现NUMA的流程。
NUMA 体系架构
  • SMP 体系架构
  • NUMA 体系架构
  • NUMA 结构基本概念
  • Openstack flavor NUMA 策略
  • Nova 实现 NUMA 流程

 1. SMP 体系架构

CPU 计算平台体系架构分为 SMP 体系架构和 NUMA 体系架构等,下图为 SMP 体系架构:

SMP(Sysmmetric Multi-Processor System,对称多处理器系统),它由多个具有对称关系的处理器组成。所谓对称,即处理器之间是水平的镜像关系,没有主从之分。SMP 架构使得一台计算机不再由单个 CPU 组成。

SMP 的结构特征就是「多处理器共享一个集中式存储器」,每个处理器访问存储器的时间片一致,使工作负载能够均匀的分配到所有可用处理器上,极大地提高了整个系统的数据处理能力。但是,如果多个处理器同时请求访问共享资源时,就会引发资源竞争,需要软硬件实现加锁机制来解决这个问题。所以,SMP 又称为 UMA(Uniform Memory Access,一致性存储器访问),其中,一致性指的就是在任意时刻,多个处理器只能为内存的每个数据保存或共享一个唯一的数值。

因此,这样的架构设计无法拥有良好的处理器数量扩展性,因为共享内存的资源竞态总是存在的,处理器利用率最好的情况只能停留在 2 到 4 颗。

 

2. NUMA 体系架构

计算机系统中,处理器的处理速度要远快于主存的速度,所以限制计算机计算性能的瓶颈在存储器带宽上。SMP 架构因为限制了处理器访问存储器的频次,所以处理器可能会时刻对数据访问感到饥饿。

NUMA(Non-Uniform Memory Access,非一致性存储器访问)架构优化了 SMP 架构扩展性差以及存储器带宽窄的问题。

从上图可以看出,NUMA 和 SMP 架构是类似的,同样只会保存一份操作系统和数据库的副本,表示 NUMA 架构中的处理器依旧能够访问到整个存储器。两种主要的区别在于 NUMA 架构采用了分布式存储器,将处理器和存储器划分为不同的节点(NUMA Node),每个节点都包含了若干的处理器与内存资源。多节点的设计有效提高了存储器的带宽和处理器的扩展性。假设系统含有 4 个 NUMA 节点,那么在理想情况下系统的存储器带宽将会是 SMP 架构的 4 倍。

另一方面,NUMA 节点的处理器可以访问到整体存储器。按照节点内外,内存被分为节点内部的本地内存以及节点外部的远程内存。当处理器访问本地内存时,走的是内部总线,当处理器访问远程内存时,走的是主板上的 QPI 互联模块。访问前者的速度要远快于后者,NUMA(非一致性存储器访问)因此而得名。

3. NUMA 结构基本概念

  • Socket:表示一颗物理 CPU 的封装(物理 CPU 插槽),简称插槽。为了避免将逻辑处理器和物理处理器混淆,Intel 将物理处理器称为插槽。
  • Core: 物理 CPU 封装内的独立的一组程序执行的硬件单元,比如寄存器,计算单元等。
  • Thread: 使用超线程技术虚拟出来的逻辑 Core,需要 CPU 支持。为了便于区分,逻辑 Core 一般被写作 Processor。在具有 Intel 超线程技术的处理器上,每个内核可以具有两个逻辑处理器,这两个逻辑处理器共享大多数内核资源(如内存缓存和功能单元)。此类逻辑处理器通常称为 Thread 。

  • Node: 包含有若干个物理 CPU 的组。

上图的  NUMA Topology 有 2 个 NUMA node,每个 node 有 1 个 socket,即 pCPU, 每个 pCPU 有 6 个 core,1 个 core 有 2 个 Processor,则共有逻辑 cpu processor 24 个。

在 LIUNX 命令行中执行 lscpu 即可看到机器的 NUMA 拓扑结构:

如上图所示,机器有 2 个 node 分配到 2 个 socket 上,每个 socket 有 14 个 core,每个 core 有 2 个 processor, 则共有 56 个 cpu processor。同时,从上图也可看出 NUMA node 0 上的 cpu 分布为 0-13,28-41,而 node 1 上的分布为 14-27, 42-55。

由上节分析知,NUMA node 处理器访问本地内存的速度要快于访问远端内存的速度。访问速度与 node 的距离有关系,node 间的距离称为 node distance,使用  numactl --hardware  可以 show 出该距离:

node0 的本地内存大小为 32209MB,Node1 的本地内存大小为 32316MB。Node0 到本地内存的 distance 为 10,到 node1 的内存 distance 距离为 20。node1 到本地内存的 distance 为10,到 node0 的内存distance距离为20。

进一步对上面的 NUMA Topology 图进行介绍。

Liunx 上使用 cat /proc/cpuinfo 命令 show 出 cpu 信息:

其中 physical  id 表示 socket 号。当前的 cpu core 是第 14 个 ,siblings 为 28 表示此 cpu14 在 core14 里面的兄弟逻辑 cpu 为 cpu28。CPU 14 和 CPU 28 共享 L1 Data cache、L1 instruction 和 L2 Cache 。

[***@controller-0 ~]$ cat /sys/devices/system/cpu/cpu14/cache/index0/type
Data
[***@controller-0 ~]$ cat /sys/devices/system/cpu/cpu14/cache/index1/type
Instruction
[***@controller-0 ~]$ cat /sys/devices/system/cpu/cpu14/cache/index2/type
Unified
[***@controller-0 ~]$ cat /sys/devices/system/cpu/cpu14/cache/index0/size
32K
[***@controller-0 ~]$ cat /sys/devices/system/cpu/cpu14/cache/index1/size
32K
[***@controller-0 ~]$ cat /sys/devices/system/cpu/cpu14/cache/index2/size
256K
 
4. Openstack flavor NUMA 策略

cpu 绑核策略

 对 Libvirt 驱动而言,虚拟机的 vCPU 可以绑定到主机的物理 CPU 上(pCPU)。这些配置可以改善虚拟机实例的精确度与性能。

 openstack flavor set FLAVOR-NAME \
    --property hw:cpu_policy=CPU-POLICY \
    --property hw:cpu_thread_policy=CPU-THREAD-POLICY

有效的CPU-POLICY值为:

  • shared (默认值) : 虚拟机的 vCPU 允许在主机 pCPU 上自由浮动,尽管可能受到 NUMA 策略的限制。
  • dedicated: 虚拟机 vCPU 被严格绑定到一组主机 pCPU 上。

有效的 CPU-THREAD-POLICY 值为:

  • prefer (默认值) : 主机可能是也可能不是 SMT 架构,如果应用 SMT 架构时,优选兄弟线程。
  • isolate: 应用在主机可能不是 SMT 架构,或者必须模拟非 SMT 架构。当主机不是 SMT 架构时,每个 vCPU 相当于一个核。如果主机应用 SMT 架构,也就是说一个物理核有多个兄弟线程,每个 vCPU 也相当于一个物理核。其他虚拟机的 vCPU 不会放在同一个核上。选中的核上只有一个兄弟线程可用。
  • require: 主机必要使用 SMT 架构。每个 vCPU 被分配在兄弟线程上。如果主机没有 SMT 架构,那就不使用此主机。如果主机使用 SMT 架构,却没有足够空闲线程的核,那么 nova 调度失败。
有一点要注意的是 cpu_thread_policy 只在 hw:cpu_policy 设置为 dedicated 时才有效。

NUMA拓扑

Libvirt 驱动程序可以为虚拟机 vCPU 定义放置的 NUMA 节点,或者定义虚拟机从哪个 NUMA 节点分配 vCPU 与内存。

$ openstack flavor set FLAVOR-NAME \
    --property hw:numa_nodes=FLAVOR-NODES \
    --property hw:numa_cpus.N=FLAVOR-CORES \
    --property hw:numa_mem.N=FLAVOR-MEMORY
  • FLAVOR-NODES: 限制虚拟机 vCPU 线程运行的可选 NUMA 节点数量。如果不指定,则 vCPU 线程可以运行在任意可用的 NUMA 节点上。
  • N:  应用 CPU 或内存配置的虚拟机 NUMA 节点,值的范围从 0 到 FLAVOR-NODES - 1。比如为 0,则运行在NUMA节点 0,为 1,则运行在 NUMA 节点1。
  • FLAVOR-CORES: 映射到虚拟机NUMA节点N上的虚拟机vCPU列表。如果不指定,vCPU 在可用的 NUMA 节点之间平均分配。
  • FLAVOR-MEMORY: 映射到虚拟机 NUMA 节点 N 上的虚拟机内存大小。如果不指定,则内存平均分配到可用 NUMA 节点。

举例如下:

$ openstack flavor set aze-FLAVOR \
    --property hw:numa_nodes=2 \
    --property hw:numa_cpus.0=0,1 \ 
    --property hw:numa_cpus.1=2,3 \
    --property hw:numa_mem.0=2048 \
    --property hw:numa_mem.1=2048 \
Flavor 定义虚拟机有 4 个 vCPU,4096MB 内存,它们分布在 2 个 NUMA 节点上。虚拟机的 0 号与 1 号 vCPU 在 NUMA 0 上,2 号与 3 号 vCPU 在 NUMA 1 上。虚拟机的 2048MB 内存在 NUMA 0 上,另外的 2048MB 内存分配到在 NUMA 1上。
注意:hw:numa_cpus.N 与 hw:numa_mem.N 只在设置 hw:numa_nodes 时有效。N 是虚拟机 NUMA 节点的索引,并不一定对应主机 NUMA 节点。例如,在两个 NUMA 节点的平台,根据 hw:numa_mem.0,调度会选择虚拟机 NUMA 节点 0,但是却是在主机 NUMA 节点 1 上,反之亦然。类似的,FLAVOR-CORES 也是虚拟机 vCPU 的编号,并不对应与主机 CPU。因此,这个特性不能用来约束虚拟机所处的主机 CPU 与 NUMA 节点。

大页内存分配

$ openstack flavor set FLAVOR-NAME \
    --property hw:mem_page_size=PAGE_SIZE

有效的 PAGE_SIZE 值为:

  • small (默认值): 使用最小的内存页面,例如 x86 平台的 4KB。
  • large: 虚拟机 RAM 使用大页内存。例如 x86 平台的 2MB 或 1G。
  • any: 取决于计算驱动程序。此情况下,Libvirt 驱动可能会尝试寻找内存大页,但最终回落到小页。其他的驱动则可能选择可用策略。

注意:大页内存可以分配给虚拟机内存,而不考虑 Guest OS 是否使用。如果 Guest OS 不使用大页内存,则它值会识别小页。反过来,如果 Guest OS 计划使用大页内存,则一定要给虚拟机分配大页内存。否则虚拟机的性能将不及预期。 

 

5. Nova 实现 NUMA 流程

Nova 实现 NUMA 流程如下所示:

1. nova-api 对 flavor metadata 或 image property 中的 NUMA 配置信息进行解析,生成 Guest NUMA topology,保存为 instance[‘numa_topology’]。

2. nova-scheduler 通过 NUMATopologyFilter 判断 Host NUMA topology 是否能够满足 Guest NUMA topology,进行 ComputeNode 调度。

3. nova-compute 再次通过 instance_claim 检查 Host NUMA 资源是否满足建立 Guest NUMA。

4. nova-compute 建立 Guest NUMA node 和 Host NUMA node 的映射关系,并根据映射关系调用 libvirt driver 生成 XML 文件。

5.  Resource Tracker 会刷新 Host NUMA 资源的使用情况。

 

参考文章

CPU topologies: https://docs.openstack.org/nova/pike/admin/cpu-topologies.html#configuring-compute-nodes-for-instances-with-numa-placement-policies

Nova 的高性能虚拟机支撑: https://blog.youkuaiyun.com/jmilk/article/details/80640648

OpenStack中的CPU绑核、NUMA亲和、大页内存: https://www.jianshu.com/p/eaf6a9615acc

NUMA架构下的CPU拓扑: https://blog.youkuaiyun.com/weijitao/article/details/52884422

Cpu bindings (一) 理解cpu topology: http://fishcried.com/2015-01-09/cpu_topology/

 

 

转载于:https://www.cnblogs.com/xingzheanan/p/10547387.html

### UMA 和 NUMA 架构的区别 #### 定义与基本概念 统一内存访问 (UMA, Uniform Memory Access) 是一种传统的内存管理模型,其中所有的处理器共享同一块全局地址空间的物理内存。这种架构通常用于 SMP(Symmetric Multi-Processing)系统中[^2]。 相比之下,非一致内存访问 (NUMA, Non-Uniform Memory Access) 则是一种更现代的内存管理方式。在这种架构下,每个 CPU 或一组 CPU 都有自己的本地内存,并且可以通过互连模块访问其他节点上的远程内存[^3]。 #### 性能特点 在 UMA 中,由于所有处理器都平等对待整个系统的单一池中的内存资源,因此无论哪个核心发起请求,数据存取延迟都是相同的。然而,在大规模多核环境中,这可能导致严重的瓶颈问题,因为所有操作都需要经过总线或者交叉开关来进行通信和资源共享[^1]。 对于 NUMA 来说,虽然存在不同距离级别的存储单元——靠近自己的那部分被称为近端或局部区域;远离当前处理单元的部分则视为远端或外部区段——但由于减少了争用情况的发生频率及其程度,所以整体效率反而更高一些。特别是当应用程序能够很好地绑定到特定计算单元附近的数据集时,可以显著减少跨节点传输的需求并提高吞吐量。 #### 架构图描述 ##### UMA 架构图 在一个典型的 UMA 设计里,你会看到如下布局: - 多个相同地位的CPU连接至中央控制单元; - 所有的这些设备共同享有唯一一块RAM芯片组作为它们工作期间临时保存信息的地方。 ##### NUMA 架构图 而针对NUMA,则呈现出更加复杂但也更为灵活的形式: - 整体被划分为若干相对独立的小型子域(即所谓的Node),每一个这样的区块内部包含了一定数量的核心与其专属配额内的快速缓存/主存装置。 - 不同Nodes间借助专门设计好的高速链路实现必要的交互协作功能。 ```plaintext // 图形化表示可能如下所示: // UMA Architecture Diagram +-------------------+ | CPU | +---------+--------+ | Shared Bus +---------v--------+ | MEMORY | +-------------------+ // NUMA Architecture Diagram Node0 Node1 ... +----------+ +-----------+ ... | CPUs & |-----|CPUs & |------... | Local Mem| QPI |Local Mem | HT ... +----------+ +-----------+ ... ``` 以上就是关于两种主要类型的计算机体系结构之间的对比分析说明文档内容总结完毕!
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值