## 基础知识
- NUMA:处理器划分多个节点,每节点拥有本地内存;跨节点访问延迟更高、带宽更低;
- 目标:将线程与内存绑定在同一节点,减少远端访问。
## Linux 环境验证
# 查看拓扑
lscpu --extended
numactl --hardware
# 本地节点绑定:CPU 节点 0,内存节点 0
numactl --cpunodebind=0 --membind=0 stream
# 仅绑定 CPU(示例绑定 0-7 号核)
taskset -c 0-7 stream
- 期望:本地节点带宽显著高于跨节点;`stream` 的 `Copy/Scale/Add/Triad` 指标更稳定。
## Windows 环境验证
# 设置进程亲和性(示例,使用 .NET)
$p = Start-Process -FilePath "C:\bench\stream.exe" -PassThru -NoNewWindow
Start-Sleep -Seconds 1
$p.ProcessorAffinity = 0xFF # 绑定到前 8 个逻辑处理器
# 或通过 CMD 启动指定亲和性
cmd /c start /affinity FF C:\bench\stream.exe
- 提示:Windows 服务器可通过“资源监视器”与“性能监视器”观察 NUMA 节点使用情况。
## 带宽/延迟测量
# mbw 测试内存带宽(Linux)
mbw -n 3 -t 256
# stream 标准测试(建议编译 OMP/OpenMP 版本以多线程测量)
./stream
- 期望:同节点绑定下的 `Triad` 带宽显著提升,跨节点延迟增加。
## 生产建议
- 将核心服务线程池按 NUMA 节点拆分,内存分配与线程固定在同节点;
- 数据结构尽量减少跨节点共享,适当使用分片/分区;
- 结合 `numactl` 与进程管理工具在部署阶段设定亲和性;
- 在虚拟化/容器环境下,确认 vCPU 与内存分配的 NUMA 对齐。
## 注意事项
- 超线程(SMT)可能引入争用,亲和性掩码需结合物理核心映射;
- 频繁跨节点同步会抵消优化收益,需在架构层面减少共享;
- Windows 下设置亲和性需管理员权限,且不同版本对 CPU 组支持存在差异。
## 结论
- 合理的 NUMA 绑定能稳定降低延迟并提升带宽;
- 在数据库、内存缓存与高并发计算场景中收益明显;
- 持续通过 `stream/mbw` 与系统计数器验证,确保优化真实有效。

发表评论 取消回复