系统中断数量不足问题
目前遇到一个问题:盒子设备满配置接口的时候, 部分网卡不能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的胖子
分类:
kernel 编程
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· AI与.NET技术实操系列:基于图像分类模型对图像进行分类
· go语言实现终端里的倒计时
· 如何编写易于单元测试的代码
· 10年+ .NET Coder 心语,封装的思维:从隐藏、稳定开始理解其本质意义
· .NET Core 中如何实现缓存的预热?
· 25岁的心里话
· 闲置电脑爆改个人服务器(超详细) #公网映射 #Vmware虚拟网络编辑器
· 基于 Docker 搭建 FRP 内网穿透开源项目(很简单哒)
· 零经验选手,Compose 一天开发一款小游戏!
· 一起来玩mcp_server_sqlite,让AI帮你做增删改查!!
2020-03-11 linux 中断softirq tasklet