---
title: 网络NUMA绑核
description: "当网卡收到大量请求时，会产生大量的中断，通知内核有新的数据包，然后内核调用中断处理程序响应，把数据包从网卡拷贝到内存。当网卡只存在一个队列时，同一时间数据包的拷贝只能由某一个core处理，无法发挥多核优势，因此引入了网卡多队列机制，这样同一时间不同core可以分别从不同网卡队列中取数据包。"
url: https://www.hikunpeng.com/document/detail/zh/perftuning/tuningtip/kunpengtuning_12_0026.html
sourcePath: /source/zh/perftuning/tuningtip/kunpengtuning_12_0026.html
indexId: d524740a57618fd4da83baed6d100f46f1a3c32eedfd83aadcaef09d326b9e7958
---
# 网络NUMA绑核

#### 原理

当网卡收到大量请求时，会产生大量的中断，通知内核有新的数据包，然后内核调用中断处理程序响应，把数据包从网卡拷贝到内存。当网卡只存在一个队列时，同一时间数据包的拷贝只能由某一个core处理，无法发挥多核优势，因此引入了网卡多队列机制，这样同一时间不同core可以分别从不同网卡队列中取数据包。

在网卡开启多队列时，操作系统通过irqbalance服务来确定网卡队列中的网络数据包交由哪个CPU核处理，但是当处理中断的CPU核和网卡不在一个NUMA时，会触发跨NUMA访问内存。因此，可以将处理网卡中断的CPU核绑定到网卡所在的NUMA上，从而减少跨NUMA的内存访问所带来的额外开销，提升网络处理性能。

图1 自动绑定：中断绑定随机，出现跨NUMA访问内存

图2 NUMA绑定：中断绑定到指定核，避免跨NUMA访问内存


#### 修改方式

1. 停止irqbalance。
  1 2 systemctl stop irqbalance.service systemctl disable irqbalance.service

2. 设置网卡队列个数为CPU的核数。
  1 ethtool -L ethx combined 48

3. 查询中断号。
  1 cat /proc/interrupts | grep $ethx | awk -F ':' '{print $1}'

4. 根据中断号，将每个中断分别绑定在一个核上，其中cpuNumber是core的编号，从0开始。
  1 echo $cpuNumber > /proc/irq/$irq/smp_affinity_list
