Linux中断“搬家”指南:从应用到操作,手把手教你转移中断核心(RK3588)

电子说

1.4w人已加入

描述

 

 

在高性能服务器或嵌入式设备(如瑞芯微 RK3588)上,中断处理的 CPU 核心绑定是优化性能的关键手段之一。比如网卡中断默认绑在小核上时,高网络负载会导致小核过载,而大核却闲置;通过中断转移,把网卡中断绑到性能更强的大核,能显著提升网络吞吐量、降低延迟。

cpu

一、为什么要做中断转移?

 

中断是 CPU 处理硬件事件的 信号,但默认情况下,中断可能被随机分发到不同 CPU 核心。在以下场景,中断转移尤为重要:

 

 

异构 CPU(大小核):如 RK3588 的 A76 大核(性能强)和 A55 小核(能效高),把网卡、存储等核心中断绑到大核,充分利用大核算力。

 

 

多核负载均衡:避免单个核心因中断扎堆” 导致过载,让核心资源更均衡。

 

 

低延迟场景:对延迟敏感的业务(如实时网络、数据库),将中断绑到专属核心,减少调度干扰。

 

 

二、应用层:三步完成中断转移

 

网卡eth0的中断转移到 CPU7为例,操作只需 步:

 

 

步骤 1:找到目标中断的 身份证”—— 中断号

 

通过/proc/interrupts 查看中断与设备的对应关系:

 

 

cpu

这里156就是 **eth0-0中断的中断号 **

 

 

步骤 2:计算目标 CPU 的 绑定掩码

 

Linux 十六进制掩码表示中断允许分发的 CPU 核心,每一位对应一个 CPU(从右到左,最低位为CPU0):

 

 

CPU0 → 01(二进制00000001

 

 

CPU1 → 02(二进制00000010

 

 

CPU2 → 04(二进制00000100

 

 

...

 

 

CPU7 → 80(二进制10000000

 

 

如果要绑到CPU7,掩码就是80

 

 

步骤 3:写入掩码,完成 搬家

 

将掩码写入/proc/irq/[中断号]/smp_affinity

 

 

  •  
echo 80 > /proc/irq/156/smp_affinity
验证转移结果

 

再次查看中断计数,确认CPU7的计数是否开始增长:

 

 

  •  
watch -n1 "cat /proc/interrupts | grep eth0"

eth0-0对应的CPU7列(最右列)数值持续增加,说明转移成功。

 

 

三、底层:中断是如何认新核心” 的?

 

从内核到硬件,中断转移的核心逻辑分为 3 层:

 

 

1. 用户空间与内核的交互:/proc 接口

 

/proc/irq/[中断号]/smp_affinity 用户空间与内核中断子系统的桥梁。当你写入掩码时,内核会解析这个十六进制值,转换为 CPU 亲和性位图。

 

 

2. 内核中断子系统:配置亲和性

 

内核通过irq_desc 结构体管理每个中断的属性,其中包含irq_data.affinity(亲和性位图)。当写入smp_affinity 时,内核会:

 

 

解析十六进制掩码为二进制位图;

 

 

更新irq_desc 中该中断的亲和性配置;

 

 

通知中断控制器(如 ARM GIC这个中断以后只发给指定 CPU”

 

 

3. 硬件中断控制器:最终的 分发者

 

 ARM GIC(通用中断控制器)为例,它会根据内核设置的亲和性寄存器(Affinity Register,决定将中断信号发送到哪个 CPU 核心。

 

 

比如,当 GIC 收到eth0的中断请求时,会检查该中断的亲和性配置,然后直接把中断投递” CPU7的中断管线,确保只有CPU7会响应这个中断。

 

 

四、实战:RK3588 上的中断转移(大小核优化)

 

RK3588 采用 “4 大核(A76+4 小核(A55” 架构,假设要把eth0的关键中断移到大核(如CPU6CPU7),步骤如下:

 

 

1.确定大核编号:通过lscpu 查看 CPU 架构,确认大核对应的逻辑 CPU 编号(比如CPU4~CPU7是大核)。

 

 

2.找到eth0中断号

 

 

  •  
cat /proc/interrupts | grep eth0

假设关键中断号是156eth0-0)。

 

 

1.绑定到大核(如CPU7

 

 

  •  
echo 80 > /proc/irq/156/smp_affinity

1.验证与压测

 

 

watch 监控中断计数,确认CPU7列增长;

 

 

iperf 进行网络压测,对比转移前后的吞吐量和延迟。

以下视频为指令切换到不同核,右边中断观察变化

五、注意事项:这些坑要避开

 

1.irqbalance服务的干扰

 

 

irqbalance是一个自动均衡中断” 的服务,会动态调整中断绑定。如果要固定中断核心,需先关闭它:

 

 

  •  
  •  
systemctl stop irqbalancesystemctl disable irqbalance

1.多队列网卡的配合

 

 

现代网卡支持多队列 RSS(接收端缩放),可将不同数据流的中断分散到多个队列。此时,除了中断绑定,还需配置队列的 CPU 亲和性(通过 /sys/class/net/eth0/queues/ 目录)。

 

 

2.配置的持久性

 

 

/proc 下的配置是临时的,重启后会丢失。若需永久生效,可将命令写入启动脚本(如/etc/rc.local)或系统服务。

 

 

3.大小核的能力” 匹配

 

 

确保目标 CPU 核心支持处理该中断(比如某些特殊中断可能只能由特定核心处理,需查阅 SoC 手册)。

 

 

总结

 

中断转移是 Linux 系统 精细化性能调优” 的重要手段,从应用层的简单配置,到底层内核与硬件的协同,本质是让 中断信号” 精准匹配 算力核心。无论是异构 CPU 的性能释放,还是多核负载的均衡,掌握中断转移,能让你的系统跑得更 聪明

 

 

如果是嵌入式或服务器开发,赶紧试试把核心中断绑到高性能核心,看看业务延迟和吞吐量的变化吧~

 

打开APP阅读更多精彩内容
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

全部0条评论

快来发表一下你的评论吧 !

×
20
完善资料,
赚取积分