## 基础知识

  • 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` 与系统计数器验证,确保优化真实有效。

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部