【存储基础】NUMA架构

文章目录

  • [1. 前置知识:物理CPU和CPU核心](#1. 前置知识:物理CPU和CPU核心)
  • [2. NUMA架构](#2. NUMA架构)
  • [3 补充:线程绑核](#3 补充:线程绑核)

1. 前置知识:物理CPU和CPU核心

物理CPU

物理CPU是指独立的物理处理器芯片,通过插槽安装在主板上。一个物理CPU可能包含多个CPU核心、缓存、内存控制器等组件。服务器主板可支持多个物理CPU,比如双路就表明支持两个物理CPU。

CPU核心

CPU核心是物理CPU内部的独立计算单元,每个核心具备完整的执行能力,有自己的ALU、寄存器、L1/L2缓存等。CPU核心是物理CPU内部的子单元,不可物理拆分,每个核心可独立运行一个线程(单线程核心)或通过超线程支持多线程

关系

可以把物理CPU理解成一个容器,一个物理CPU可以包含多个CPU核心;核心是执行单元,实际执行指令的最小物理单位。

多个核心可同时处理不同任务;同一个物理CPU内的核心共享L3缓存、内存控制器、PCIe通道。

特性 物理CPU CPU核心
本质 物理硬件设备(芯片) 物理CPU内部的子计算单元
数量层级 服务器常见1-8个 每个物理CPU含4-128个核心
功能 集成核心、缓存、I/O控制器 执行指令和运算
超线程影响 不直接受影响 1个物理核心可虚拟为2个逻辑核心
资源隔离 不同物理CPU之间资源完全隔离(如缓存) 同物理CPU的核心共享L3缓存和内存通道

2. NUMA架构

2.1 NUMA架构是什么?

NUMA(Non-Uniform Memory Access非统一内存访问)是一种多处理器计算机系统设计架构,旨在解决传统对称多处理器(SMP)架构中内存访问延迟和带宽瓶颈的问题。

NUMA的核心思想是将多个CPU和内存资源划分为多个节点 Node,每个结点内的CPU可以直接访问本地内存(延迟低、带宽高),而访问其他节点的内存(远端内存)则需要经过互联总线(延迟高、带宽低)。

2.2 NUMA架构详解

numa架构的组成:

  • 节点Node:每个节点包括
    • 一组CPU核心,称为Socket或NUMA Node;
    • 本地内存;
    • 互联总线
  • 内存访问模式:
    • 访问本地内存:CPU直接访问本节点内存,速度快;
    • 远端内存访问:CPU跨节点访问其他节点的内存

NUMA架构的特点:

  • 非对称延迟:本地内存访问快,远端内存访问慢;
  • 扩展性优势:支持更多CPU和内存,避免SMP架构的总线争用问题;
  • 本地化优化:操作系统和应用程序需尽量使用本地内存,减少跨节点访问;
  • 硬件透明性:对应用程序透明

2.3 查看NUMA信息

bash 复制代码
numactl --hardware # 查看numa节点拓扑
bash 复制代码
lscpu

2.4 NUMA架构在分布式存储中的应用

数据本地化 Data Locality

将数据存储在处理它的NUMA节点的本地内存中,减少跨节点访问。

实现方式:

  • 存储分片策略:将数据分片(shard)绑定到特定NUMA节点,例如numa_0处理shard_0的数据,numa_1处理shard_1的数据;
  • 元数据管理:记录数据分片与NUMA节点的映射关系,确保读写请求优先路由到本地结点

计算与存储协同调度

将计算任务调度到数据所在的NUMA节点,实现"存算一体"。

实现方式:

  • 任务绑定:将存储服务的进程/线程绑定到特定NUMA节点的CPU核心;
  • 内存分配策略:强制进程从本地NUMA节点分配内存。

NUMA感知的网络通信

减少网络数据包处理中的跨节点内存复制。

实现方式:

  • 网卡绑定到NUMA节点:将网卡与NUMA节点关联,确保网卡的中断和DMA内存区域位于同一节点;
  • 零拷贝技术:避免数据在用户态和内核态间的多次复制
    例如高性能存储网络(如IB, InfiniBand)通过RDMA直接访问远端NUMA节点的内存,绕过操作系统和CPU干预。

内存池优化与跨节点均衡

在NUMA节点间动态平衡内存使用,避免热点和资源耗尽。

实现方式:

  • 内存交错:将内存分配均匀分散到多个NUMA节点(牺牲局部性换取均衡);
  • 动态迁移:监控NUMA节点的内存压力,将冷数据迁移到空闲节点

3 补充:线程绑核

线程绑核是将特定线程/进程绑定到指定CPU核心上运行的机制,目的是减少上下文切换、提升缓存命中率、避免跨核心/跨NUMA节点的性能损失。

线程绑核的优势:

  • 减少上下文切换:操作系统默认动态调度线程到不同的核心,频繁切换可能导致缓存失效和延迟;
  • 提升缓存利用率:线程固定在某个核心之后,其缓存(L1/L2/L3)中的数据可长期保留;
  • 避免NUMA延迟:绑核可强制线程在本地NUMA结点运行;
  • 实时性需求:某些应用场景下要求严格的任务响应时间。

可使用Linux的taskset工具将线程绑定到核心;或numactl工具将线程绑定到NUMA节点。

相关推荐
幽络源小助理几秒前
SpringBoot+Vue+微信小程序校园自助打印系统
java·spring boot·微信小程序·小程序·vue
@ chen16 分钟前
Springboot中Controller接收参数的方式
java·spring boot·后端
全栈凯哥1 小时前
Java详解LeetCode 热题 100(23):LeetCode 206. 反转链表(Reverse Linked List)详解
java·算法·leetcode·链表
wk灬丨1 小时前
Kotlin List 操作全面指南
开发语言·kotlin
小葡萄20251 小时前
黑马程序员C++核心编程笔记--4 类和对象--多态
java·c++·笔记
iCxhust1 小时前
Prj09--8088单板机C语言8253产生1KHz方波(1)
c语言·开发语言·c++·单片机·嵌入式硬件·mcu
Java之路行者1 小时前
SpringBoot+XXL-JOB:高效定时任务管理
java·spring boot·后端·spring cloud
源码师傅1 小时前
PHP+mysql 美容美发预约小程序源码 支持DIY装修+完整图文搭建教程
开发语言·mysql·php·预约小程序源码·预约服务系统源码·美容预约小程序源码·美发预约小程序
xrz2771 小时前
JAVA获取ES连接并查询所有数据
java·elasticsearch
t198751282 小时前
matlab实现求解兰伯特问题
开发语言·算法·matlab