1. 揭开NUMA架构的神秘面纱
第一次接触NUMA架构时,我被这个看似简单的概念搞得晕头转向。当时正在调试一个数据库性能问题,明明服务器配置很高,但查询速度就是上不去。后来才发现,问题出在内存访问模式上——我们的应用在疯狂跨NUMA节点访问内存。
NUMA(Non-Uniform Memory Access)架构是现代多处理器系统的标配。简单来说,它把内存和CPU分成多个节点(Node),每个节点有自己的本地内存。访问本地内存速度飞快,而访问其他节点的内存就要慢不少。这就好比你在自己办公室找文件(本地访问)和跑去其他部门要文件(远程访问)的区别。
在实际服务器中,你会发现几个关键组件:
- Socket:物理CPU插槽,主板上那个方方正正的插座
- CPU Core:每个物理CPU中的计算核心
- NUMA Node:由部分CPU核心和它们直连的内存组成的逻辑单元
举个例子,一台双路服务器(两个Socket)可能配置如下:
- Socket 0: 16核,64GB内存
- Socket 1: 16核,64GB内存
如果启用了NUMA,系统可能会显示: - Node 0: Socket 0的8核 + 32GB内存
- Node 1: Socket 0的另外8核 + 32GB内存
- Node 2: Socket 1的8核 + 32GB内存
- Node 3: Socket 1的另外8核 + 32GB内存
需要模型API调用? 免费领10W Token,多模型网关一键接入 Claude、DeepSeek 等主流模型。
2. Socket与NUMA的微妙关系
很多人以为一个Socket对应一个NUMA节点,这种认知在早期可能是对的,但在现代服务器上已经完全不适用了。以AMD的EPYC处理器为例,一个物理Socket里可能包含多个芯片(chiplet),每个chiplet都有自己的内存控制器,这就形成了多个NUMA节点。
我曾经遇到过一个真实案例:某金融系统升级到AMD EPYC服务器后性能不升反降。通过numactl工具检查才发现,系统把关键进程绑定到了一个NUMA节点,但数据却分散在四个节点上。跨节点访问导致延迟暴增,完全抵消了CPU频率提升带来的优势。
查看硬件拓扑的实用命令:
bash复制# 查看NUMA节点布局
numactl -H
# 查看CPU拓扑
lscpu
# 详细硬件信息
lstopo --of png
