zoukankan      html  css  js  c++  java
  • 系统中断数量不足问题

    目前遇到一个问题:盒子设备满配置接口的时候, 部分网卡不能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的胖子
  • 相关阅读:
    Informix IDS 11零碎规画(918考试)认证指南,第 7 部分: IDS复制(15)
    Informix IDS 11琐屑管理(918考试)认证指南,第 7 局部: IDS复制(10)
    近期招聘
    Classes 单元下的公用函数目录
    Graphics 单元下的公用函数目录
    CnPack 使用的组件命名约定
    Windows 单元下的公用函数目录(RZ_)
    Variants 单元下的公用函数目录
    StrUtils 单元下的公用函数目录
    Math 单元下的公用函数目录
  • 原文地址:https://www.cnblogs.com/codestack/p/14517079.html
Copyright © 2011-2022 走看看