中断亲和性是指处理器在接收到网卡的中断后,由哪些CPU来优先处理。为了提升网络应用的扩展性和降低时延,建议将中断请求IRQs(Interrupt Request)分散在可用的CPU核上。
Linux系统自带负载均衡服务irqbalance,该服务能根据当前CPU使用情况自动将IRQs分散到各个CPU核上执行,由于系统运行的复杂性,这种自动选择方案在CPU资源不足时往往不能够做到最优,有时候会出现IRQ和应用程序争抢同一个CPU核的情况,这时就需要进行人工手动设置,即设置中断绑核。
中断绑核的步骤如图示:
1、关闭irqbalance服务。
systemctl stop irqbalance
systemctl disable irqbalance
2、获取设备IRQ号。
cat /proc/interrupts | grep <device name>
其中<device_name>
表示待配置的网卡接口名称。
3、检查IRQ号亲和性。
cat /proc/irq/$int/smp_affinity_list
其中$int表示设备IRQ号。
4、调整IRQ号亲和性。
echo <cpuNo> /proc/irq/<irq vector>/smp_affinity_list
配置示例
以设备enp129s0f0为例,配置IRQ中断亲和性。
1、确保irqbalance服务已关闭。
对于通用服务器,按前面的方法关闭irqbalance服务,并执行以下命令检查服务状态。
ps afx |grep irqbalance
如图所示表示irqbalance服务已开启。
对于华为系列服务器,由于系统后台有脚本会持续监控和开启irqbalance服务,因此上述方法无法关闭irqbalance服务。需要通过把irqbalance执行文件改名并用kill命令杀死当前运行的irqbalance程序才能生效。
mv /usr/sbin/irqbalance /usr/sbin/irqbalance.bak
kill -9 <pid>
示例中的“1393”为pid。
2、查询设备中断号。
以enp129s0f0设备为例,执行以下命令查询设备中断号。
cat /proc/interrupts |grep enp129s0f0
回显信息中起始行如368、369、370和371为设备enp129s0f0对应的IRQ号,行尾的描述一般表示该中断的含义,例如i40e-enp129s0f0-TxRx-0表示enp129s0f0设备0号收发队列中断。
3、查询设备IRQ号亲和性。
以368号中断为例,执行以下命令查询设备IRQ亲和性。
cat /proc/irq/368/smp_affinity_list
回显信息表示368号中断当前绑核情况为:CPU 12-23,CPU 36-47。
4、配置中断绑核。
选择哪个CPU非常关键,配置不合适可能导致性能会更差,适得其反。所以在绑核前需要确认当前网卡设备插在哪个PCIe槽位上,并以此确定该设备挂在哪个物理CPU下。最直接的方法是去现场直接查看。还有一个方法则是通过系统提供的命令查询得到。
以Intel网卡为例:首先通过lspci –tv命令获取设备信息,然后根据设备信息获取该卡所处的NUMA信息。如下图所示:
从上面的例子可以看到,这张Intel网卡挂在NUMA1下。
5、通过lscpu命令获取NUMA1包含哪些CPU,下图表示NUMA1包含第14-27以及第42-55 CPU。
6、执行以下命令把368中断绑到14-27以及第42-55中的某一个空闲的CPU。
素材来源官方媒体/网络新闻