系统中断数量不足问题

目前遇到一个问题:盒子设备满配置接口的时候, 部分网卡不能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的时候在来注册中断!!!貌似可以这样玩!!!

 

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

posted @   codestacklinuxer  阅读(352)  评论(0编辑  收藏  举报
编辑推荐:
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
阅读排行:
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
历史上的今天:
2020-03-11 linux 中断softirq tasklet
点击右上角即可分享
微信分享提示