NUMA + hwloc

NUMA

NUMA的诞生背景

在NUMA出现之前,CPU朝着高频率的方向发展遇到了天花板,转而向着多核心的方向发展。
在一开始,内存控制器还在北桥中,所有CPU对内存的访问都要通过北桥来完成。此时所有CPU访问内存都是“一致的”,如下图所示:
NUMA + hwloc
这样的架构称为UMA(Uniform Memory Access),直译为“统一内存访问”,这样的架构对软件层面来说非常容易,总线模型保证所有的内存访问是一致的,即每个处理器核心共享相同的内存地址空间。但随着CPU核心数的增加,这样的架构难免遇到问题,比如对总线的带宽带来挑战、访问同一块内存的冲突问题。为了解决这些问题,有人搞出了NUMA。

NUMA构架细节

NUMA 全称 Non-Uniform Memory Access,译为“非一致性内存访问”。这种构架下,不同的内存器件和CPU核心从属不同的 Node,每个 Node 都有自己的集成内存控制器(IMC,Integrated Memory Controller)。

在 Node 内部,架构类似SMP,使用 IMC Bus 进行不同核心间的通信;不同的 Node 间通过QPI(Quick Path Interconnect)进行通信,如下图所示:
NUMA + hwloc
一般来说,一个内存插槽对应一个 Node。需要注意的一个特点是,QPI的延迟要高于IMC Bus,也就是说CPU访问内存有了远近(remote/local)之别,而且实验分析来看,这个差别非常明显。

hwloc(Hardware Locality)

可移植硬件位置(hwloc)软件包提供了一个可移植的抽象(跨操作系统、版本、体系结构等)现代体系结构的层次拓扑,包括NUMA内存节点、套接字、共享缓存、核心和同时多线程。它还收集各种系统属性,如缓存和内存信息,以及I/O设备的位置,如网络接口、InfiniBand hca或gpu。
硬件位置(hwloc)软件项目旨在简化在并行体系结构中发现硬件资源的过程。
它提供命令行工具和C API,用于查询这些资源、它们的位置、属性和互连。
hwloc的主要目标是帮助高性能计算(HPC)应用程序,但也适用于任何寻求利用现代计算平台上的代码和/或数据局域性的项目。例如,两个紧密合作的任务可能应该放在共享缓存的核心上。
hwloc通常操作处理单元和内存,但它也可以发现I/O设备并报告它们的位置。这对于将I/O密集型应用程序放在靠近它们使用的I/O设备的核心上很有用,或者对于收集关于所有平台组件的信息很有用。
链接: hwloc.
链接: hwloc.

参考

链接: 浅解NUMA机制.
链接: NUMA的原理与局限.

链接: Linux中CPU亲和性(affinity).

上一篇:mosquitto publish file payload


下一篇:Ubuntu mosquitto 安装及配置