标签搜索

关于IRQ亲和性资料整理笔记

anker
2021-06-26 / 0 评论 / 67 阅读 / 正在检测是否收录...

中断处理也是可以设置更倾向在哪个CPU核心处理的。碰到这个问题是来自于中断机制一次QQ聊天中。在中断被频繁触发时CPU会处理不过来,常见的现象是网卡不能满负荷的跑,达到一定流量后出现了丢包。这又要从网卡接收数据开始说起。

网卡驱动启动时就会注册硬中断回调同时准备好sk_buffer。在网络包来的时候NIC会通过DMA(Direct Memory Access,不经过CPU的内存复制,也称零拷贝)把数据包从NIC内部缓存区复制到之前准备好的sk_buffer中(如果此时sk_buffer不足是会丢包,对应ifconfig命令overruns指标)。之后NIC产生一个硬中断。硬中断处理程序只会处理关键性的、短时间内可以处理完的工作,剩余耗时较长工作,会放到中断之后,由软中断来完成。硬中断也被称为上半部分。

CPU收到硬中断,根据中断描述符表(Interrupt Descriptor Table,IDT)找到处理函数并调用。最后触发NET_RX_SOFTIRQ软中断处理sk_buffer中的数据(如果软中断处理不及时,轮询时CPU对应的接收队列超过netdev_max_backlog也会丢包),然后再交给内核协议栈解析处理,协议栈会得到sk_buffer,经过处理后进入socket buffer, 最后用户态取得数据。

对于多队列(RSS特性)网卡, 每个队列对对应一个中断号。因为中断号的不同,可以设置不同的CPU亲和性。这样在单核CPU无法跟上网卡速度的问题就通过多核解决了。

对于单队列网卡一般使用RPS+RFS配合使用。RPS(Receive Packet Steering)帮助单队列网卡将其产生的SoftIRQ分派到多个CPU内核进行处理。RFS(Receive Flow Steering)能够保证处理软中断和处理应用程序是同一个CPU,达到局部性原理。

通过ethtool -S ens5可以看到各队列信息queue_{idx}_*。ls /sys/class/net/ens5/queues/

在机器CPU处理很多计算任务,CPU压力紧张的情况下扩展多队列网卡是没有效果的,多队列网卡就是要通过消耗更多的CPU来提高网络性能,此时CPU压力更大,会影响计算业务。

最佳实践方式是通过设定中断亲和性(修改/proc/irq/{IRQ_ID}/smp_affinity配置)把业务进程的亲和性(taskset命
令)绑定到不同的CPU上,这样不会相互影响。
IRQ_ID可以通过grep ens5 /proc/interrupts得到,具体设置方法网上很多。

除了top可以查询中断处理统计,mpstat -P ALL 1更加具体

0

评论 (0)

取消