系统中断数量不足问题

目前遇到一个问题:盒子设备满配置接口的时候, 部分网卡不能up:

调试log:

dmesg发现有如下信息:

[  116.699174] pci_enable_msix req rc:-1
[  116.699175] i40e 0000:12:00.0: MSI-X vector reservation failed: -1
[  116.699177] i40e 0000:12:00.0: init msix vectors:=-19
[  116.699179] i40e 0000:12:00.0: MSI-X not available, trying MSI

 分析代码可知代码流程如下:

 其流程大约是:

1、根据架构arm还是x86  找到对应的msi 申请函数

  • x86为native_setup_msi_irqs

2、调用create_irq_nr 分配irq num同时查找per_cpu 中没有使用的verctor  

主要逻辑: 从bitmap中找出未使用的中断irq_num;

从per_cpu的vector 中找出未使用的vector;

可用的中断向量表关联可用的irq

 看着这些逻辑很好!!!可实际上 分配给 网卡时却不够!!

原因:

盒子设备是8核cpu, 每个网卡开启多队列, 每个队列会注册一个中断,也就是说一个网口会注册n_core 个中断。

同时发现 网卡使用的irq 是从135 开始的,说明在注册网卡之前 应该分配了不少irq出去了,最后的结果是中断vector不够

但是仔细分析:

一个网卡队列只会绑定一个cpu核使用,其余的用不到,但是通过代码发现;

    for_each_cpu_and(new_cpu, tmp_mask, cpu_online_mask)
            per_cpu(vector_irq, new_cpu)[vector] = irq;

一个irq 会占用所有的cpu的vector;这貌似有点浪费,本身vector就不多;

上述代码针对的是当前使用系统:linux 2.6.x  别问为啥不升级内核!!!

虽然摇摇欲坠但是勉强可以运行起来给老板挣钱!! 

所以解决办法有:

1、网卡注册时 只注册到一个cpu 核上, 但是注册时需要注意队列要均衡平均的注册到cpu的各个核心上去

2、vector能不能扩大

目前看代码发现:一开始可以只分配irq但是不注册中断,在设置 smp_affinity的时候在来注册中断!!!貌似可以这样玩!!!

算了 升级内核吧!!! 反正 新版本必须要使用新内核

http代理服务器(3-4-7层代理)-网络事件库公共组件、内核kernel驱动 摄像头驱动 tcpip网络协议栈、netfilter、bridge 好像看过!!!! 但行好事 莫问前程 --身高体重180的胖子
原文地址:https://www.cnblogs.com/codestack/p/14517079.html