本文在双路/多路 NUMA 平台上以 `numactl`/`taskset`/`numastat` 为核心工具,建立可复现的对比实验,确保参数与结论可在目标环境验证。


## 前提与环境


  • 平台:x86_64 Linux(RHEL/CentOS/Ubuntu 均可),具备 2 个及以上 NUMA 节点。
  • 工具:`numactl`、`numastat`、`taskset`(发行版包管理器可直接安装)。

numactl --hardware
numastat
lscpu --extended

## 本地/远端内存对比(可复现)


以 `sysbench memory` 或等价的内存压测程序为基准,对比本地与远端内存的性能差异。


1. 绑定到节点 0,内存也分配在节点 0:


numactl --cpunodebind=0 --membind=0 sysbench memory --threads=1 run

2. 绑定到节点 0,但内存分配到节点 1(模拟远端访问):


numactl --cpunodebind=0 --membind=1 sysbench memory --threads=1 run

观察:在多数 DDR4/DDR5 平台上,本地内存的带宽显著高于远端访问,延迟也更低;差异幅度取决于 UPI/Infinity Fabric 链路与内存通道数。


## CPU 亲和与线程布局


1. 进程级亲和:


taskset -c 0-7 ./server

2. 内存绑定与多线程:


numactl --cpunodebind=0 --membind=0 ./worker --threads=8
numactl --cpunodebind=1 --membind=1 ./worker --threads=8

3. 指标采集:


numastat -m 1
perf stat -e cycles,instructions,LLC-loads,LLC-load-misses -a -- sleep 10

关注:`numastat` 的本地/远端页面计数、LLC miss 变化与应用吞吐;当线程跨节点迁移或发生远端页面分配时,常见吞吐下降与尾延迟上升。


## 生产参数与实践(可验证)


1. 禁用区域回收避免意外延迟:


sysctl -w vm.zone_reclaim_mode=0

2. 页分配与透明大页(THP):


cat /sys/kernel/mm/transparent_hugepage/enabled
echo never > /sys/kernel/mm/transparent_hugepage/enabled

说明:对延迟敏感的负载通常禁用 THP,以避免突发分配与回收开销;需结合应用实测决定。


3. 中断亲和与 NUMA 一致性:


cat /proc/interrupts
echo 0-7 > /proc/irq/<IRQ>/smp_affinity_list   # 示例,将关键 IRQ 固定在节点 0 的 CPU 上

配合 NIC/存储队列的多队列(RSS/RFS)策略,使数据路径与计算线程尽可能位于同一 NUMA 节点。


## 验证流程建议


1. 使用 `numactl --hardware` 确认节点与内存通道配置。

2. 建立本地/远端内存对比基线,记录带宽与 p95/p99 延迟。

3. 固定服务主线程与中断在同一节点,观察吞吐与尾延迟变化。

4. 在业务低峰期按需调整 THP 与调度策略,并用 `numastat` 持续验证页面分配位置。


## 注意事项


  • 绑定策略需配合应用的线程模型与 GC/分配器特性(如 `jemalloc` 的 arena 绑定)。
  • 虚拟化/容器环境需确认 vCPU 与内存亲和是否与宿主机一致,避免远端访问比例异常。
  • 修改中断亲和与系统参数前,建议在维护窗口进行并记录回滚方案。

## 结语


NUMA 优化的核心在于“算力与数据的同位”。以本地/远端对比的可复现实验为基础,配合亲和与内存绑定策略,才能在生产环境稳定提升吞吐并降低尾延迟。


点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部