---
title: NUMA优化，减少跨NUMA访问内存
description: "通过鲲鹏处理器NUMA简介章节可以看到不同NUMA内的CPU核访问同一个位置的内存，性能不同。内存访问延时从高到低为：跨CPU > 跨NUMA不跨CPU > NUMA内。"
url: https://www.hikunpeng.com/document/detail/zh/perftuning/tuningtip/kunpengtuning_12_0014.html
sourcePath: /source/zh/perftuning/tuningtip/kunpengtuning_12_0014.html
indexId: 4f5ccf5b467f693a41ea83b4bb952c1b8130cbc9167ac5a87c9f68acde64233358
---
# NUMA优化，减少跨NUMA访问内存

#### 原理

通过鲲鹏处理器NUMA简介章节可以看到不同NUMA内的CPU核访问同一个位置的内存，性能不同。内存访问延时从高到低为：跨CPU > 跨NUMA不跨CPU > NUMA内。

因此在应用程序运行时要尽可能地避免跨NUMA访问内存，我们可以通过设置线程的CPU亲和性来实现。


#### 修改方式

- 可以通过如下方式绑定运行的CPU核，其中$cpuNumber是core的编号，从0开始；$irq为网卡队列中断号。
  1 echo $cpuNumber > /proc/irq/$irq/smp_affinity_list

- 通过numactl启动程序，如下面的启动命令表示启动test程序，只能在CPU核 28到core 31运行（-C控制）。
  1 numactl -C 28-31 ./test

- 在C/C++代码中通过sched_setaffinity函数来设置线程亲和性。
- 很多开源软件已经支持在自带的配置文件中修改线程的亲和性，例如Nginx可以修改nginx.conf文件中的worker_cpu_affinity参数来设置Nginx线程亲和性。
