当前位置: 首页 > ds >正文

NUMA 架构科普:双路 CPU 系统是如何构建的?

NUMA(Non-Uniform Memory Access,非一致性内存访问)是一种用于多处理器系统的内存架构设计,主要应用于服务器、工作站和高性能计算(HPC)领域。它的核心特点是 不同 CPU 访问不同内存区域的速度不一致,这与传统的 UMA(Uniform Memory Access,一致性内存访问)架构不同。


1. NUMA 的物理结构

(1)双路 CPU 系统的硬件组成

在典型的双路(2P)服务器主板上,会有:

  • 2 颗物理 CPU(如 Intel Xeon 或 AMD EPYC),分别称为 CPU0 和 CPU1

  • 每个 CPU 直接连接一部分内存(称为 本地内存)。

  • CPU 之间通过高速互联总线通信(如 Intel 的 QPI/UPI 或 AMD 的 Infinity Fabric)。

  • PCIe 设备(如 SSD、网卡)通常挂载在某一颗 CPU 的 PCIe 控制器上

(2)内存访问方式

  • 本地内存访问(Local Access)

    • CPU0 访问自己直连的内存(Node 0)速度最快(延迟低,带宽高)。

    • CPU1 访问自己直连的内存(Node 1)同理。

  • 远程内存访问(Remote Access)

    • 如果 CPU0 要访问 CPU1 的内存(Node 1),必须经过 CPU 间互联总线,这会增加延迟(通常比本地访问慢 1.5-2 倍)。

(3)PCIe 设备的归属

  • 每个 CPU 通常控制一部分 PCIe 插槽

    • 例如,PCIe 插槽1 由 CPU0 管理,插槽2 由 CPU1 管理。

    • 如果虚拟机或应用程序运行在 CPU0,但 SSD 挂在 CPU1 的 PCIe 插槽上,I/O 路径会变长,性能下降。


2. NUMA 的逻辑结构(操作系统视角)

在 Linux 系统中,NUMA 架构会被抽象为多个 NUMA 节点(Node)

  • 每个 NUMA Node 包含:

    • 一组 CPU 核心(包括物理核和超线程)。

    • 一部分本地内存。

    • 直接连接的 PCIe 设备。

查看 NUMA 拓扑

numactl -H

输出示例:

available: 2 nodes (0-1)       # 2 个 NUMA 节点
node 0 cpus: 0 1 2 3 4 5 6 7 8 9 20 21 22 23 24 25 26 27 28 29
node 0 size: 65420 MB          # Node 0 的内存大小
node 1 cpus: 10 11 12 13 14 15 16 17 18 19 30 31 32 33 34 35 36 37 38 39
node 1 size: 65400 MB          # Node 1 的内存大小
node distances:
node   0   1 0:  10  21   # Node 0 访问本地内存的代价是 10,远程是 211:  21  10   # Node 1 同理

3. NUMA 对性能的影响

(1)内存访问性能

  • 本地访问(Local Access):延迟低,带宽高(最佳性能)。

  • 远程访问(Remote Access):延迟高,带宽较低(性能下降)。

(2)PCIe 设备性能

  • 如果 应用程序运行在 Node 0,但 SSD/网卡挂在 Node 1,数据必须经过 CPU 间总线传输,导致延迟增加。

  • 优化方法:让应用程序和 PCIe 设备尽量在同一个 NUMA Node。

(3)虚拟机性能

  • 如果虚拟机(VM)的 vCPU 跨多个 NUMA Node,内存和 I/O 访问会变慢。

  • 优化方法:使用 numactl 或 KVM 的 <numatune> 绑定虚拟机到单一 Node。


4. 如何优化 NUMA 性能?

(1)BIOS 设置

  • 启用 NUMA Support(必须开启)。

  • 禁用 Memory Interleaving(避免内存交错,降低远程访问概率)。

  • 启用 PCIe ACS(确保 PCIe 设备能正确归属到 NUMA Node)。

(2)操作系统优化

  • 绑定进程到特定 NUMA Node

    numactl --membind=0 --cpunodebind=0 ./program  # 绑定到 Node 0
  • 查看 PCIe 设备的 NUMA 归属

    lspci -vv | grep -i numa
    cat /sys/bus/pci/devices/0000:01:00.0/numa_node

(3)KVM 虚拟机优化

<domain type='kvm'><numatune><memory mode='strict' nodeset='0'/>  <!-- 内存绑定到 Node 0 --></numatune><cputune><vcpupin vcpu='0' cpuset='0'/>      <!-- vCPU 绑定到 Node 0 的物理核 --><vcpupin vcpu='1' cpuset='1'/><emulatorpin cpuset='0-19'/>        <!-- QEMU 进程绑定到 Node 0 --></cputune>
</domain>

5. 总结

  • NUMA 架构的核心特点:不同 CPU 访问不同内存的速度不一致。

  • 双路系统:两颗 CPU 各自管理部分内存和 PCIe 设备,通过高速总线互联。

  • 性能关键:尽量让应用程序、内存、PCIe 设备在同一个 NUMA Node。

  • 优化方法:BIOS 设置、numactl 绑定、KVM 虚拟机 NUMA 调优。

如果你的双路系统性能不如单路,通常是因为 跨 NUMA 访问 或 PCIe 设备归属问题,按照上述方法优化即可。

http://www.xdnf.cn/news/9898.html

相关文章:

  • 快速上手shell条件测试
  • Practice 2025.5.29 —— 二叉树进阶面试题(1)
  • 聊聊 Metasploit 免杀
  • 数字人引领政务新风尚:智能设备助力政务服务
  • OpenCV计算机视觉实战(9)——阈值化技术详解
  • 【仿生系统】qwen的仿生机器人解决方案
  • AI产品风向标:从「工具属性」到「认知引擎」的架构跃迁​
  • 国芯思辰| 霍尔电流传感器AH811为蓄电池负载检测系统安全护航
  • Java 实现下载指定minio目录下的所有内容到远程机器
  • ssm学习笔记(尚硅谷) day1
  • 生成式人工智能:重构软件开发的范式革命与未来生态
  • 预处理,咕咕咕
  • Cesium 展示——获取鼠标移动、点击位置的几种方法
  • 第四章、自平衡控制
  • 【Ubuntu远程桌面】
  • .NET WinForm图像识别二维码/条形码
  • 从零开始的数据结构教程(六) 贪心算法
  • 超声波换能器 换能原理
  • 「卫星百科」“绿色守卫”高分六号
  • MVCC 原理与并发控制实现
  • 【Pandas】pandas DataFrame equals
  • STP配置
  • 基于Java,SpringBoot,Vue,UniAPP医院预约挂号买药就诊病例微信小程序系统设计
  • 代码随想录打卡|Day50 图论(拓扑排序精讲 、dijkstra(朴素版)精讲 )
  • Java中如何枚举正则表达式捕获组的名字
  • RabbitMQ项目实战
  • 【机器学习基础】机器学习入门核心算法:随机森林(Random Forest)
  • 华为OD机试真题——AI面板识别(2025A卷:100分)Java/python/JavaScript/C/C++/GO最佳实现
  • 高效开发,升级软件,硬件也要专业
  • 大数据治理体系构建与实践路径