• 中断均衡脚本


    中断均衡脚本

    来源 https://www.right.com.cn/forum/thread-4041282-1-1.html

    基于OpenWrt 19.07分支,添加杂七杂八的补丁与设备支持,弄出的要求可靠性与性能的版本。
    相比于OpenWrt原版,有以下区别:

    • 添加了shortcut-fe 4.14内核支持
    • mt7615e闭源驱动,虽然很不好配置
    • IPQ806x NSS驱动(还没有经过长时间运行测试)
    • 调整过的默认配置(O2编译,杂七杂八的内核选项,软件包默认参数)
    • 增强了lean软件包的兼容性,主要是55R和Adbyby文件更新
    • IPQ806x与IPQ40xx有调整过的中断及队列均衡脚本
    • 从master引入最新的ath10k-ct固件与驱动

    相比于Lean,有以下区别:

    • 更稳定的代码更新渠道,与官方同步

    同时,从lean和master中引入了ACRH17与R6800机型的配置文件。
    会不定时同步OpenWrt 19.07的变动,19.07.x这种主版本肯定会更新。
    代码地址:
    https://github.com/presisco/openwrt/tree/openwrt-19.07

    OpenWrt路由器多核终端均衡脚本 转发性能大幅提升50%

    来源  https://www.right.com.cn/forum/thread-3191113-1-1.html

    OpenWrt默认、Lean OpenWrt默认、使用irqbalance及转发优化版本的核心分配情况如下(IPQ40xx):

    中断 OpenWrt Lean irqbalance 转发优化
    网络队列rx CPU123 CPU0123 CPU123 CPU12交替
    网络队列tx 交替 交替 交替 CPU12交替
    网络中断rx CPU0123 4个一组交替 交替 4个一组CPU12反向交替
    网络中断tx CPU0123 交替 交替 CPU12反向交替
    无线ahb CPU0123 CPU2 CPU2 CPU3
    无线pcie CPU0123 CPU3(设置无效) CPU0 CPU3
    其他(usb,dma,gpio...) CPU0123 CPU0123 CPU0/CPU2/CPU3 CPU0



    CPU123表示使用CPU1、CPU2、CPU3均可。为了提升局部性以提升缓存效率,中断往往被固定在所有指定CPU中最小的那个,在缺少硬件NAT与千兆网的情况下很容易占满1个CPU核心而其他核心空闲,出现性能瓶颈。因此需要调整中断与CPU的对应关系。。

    使用两台间隔7米的ACRH17组建WDS无线桥接网络,主路由中运行iperf3服务器,主从路由通过QCA9984 5G进行连接,测试电脑连接于从路由的LAN1接口。
    两台ACRH17均使用OpenWrt官方19.07.2固件与ath10k无线驱动。

    不同中断绑定配置下的转发性能如下表所示:

    中断绑定配置 速度/Mbps
    OpenWrt默认 495
    irqbalance 476
    Lean固件默认策略 386
    转发优化 581

    我已经将中断的配置代码整合为脚本,只需要根据个人需求配置中断与CPU的对应关系,并上传到路由器中直接执行即可完成设定。每次重启路由器后脚本都需要重新执行。目前有基于OpenWrt/Lean与IPQ40xx系列SOC(4018/4019/4028/4029等)的脚本可直接使用。PandoraBox、AsusWrt、Merlin等及非IPQ40xx系列SOC的没有现成脚本。

    中断均衡脚本:
    中断均衡脚本链接

    更新3-2020/3/11 10:00重写mt7621与bcm53xx的均衡脚本。
    mt7621将CPU0/1处理eth0.1网络队列及USB/DMA,CPU2/3处理eth0.2网络队列及wifi。
    bcm53xx使用CPU0/1处理网络队列,CPU0处理以太网,CPU1处理wifi、USB。

    更新2-2020/3/10 22:30
    重写ipq40xx的均衡脚本,将CPU1与CPU2用于处理网络端口队列,CPU8处理无线

    更新1-2020/3/9 0:35
    将ipq40xx.sh中网络相关irq全部指定至CPU2,与实验中相同。

    1.早在3年前,上面说的平衡PandoraBox全都有了.
    2.影响NAT最大的不是这个多核平衡,而是offload,就是我们常说的GSO/TSO,
    垃圾BCM的4708/4709就是因为故意阉割了offload.所以NAT才会跟MT7621差不多.
    3.当前IPQ4019上面的EDMA是支持大部分offload,除去CPU的平衡外,EDMA还支持16个硬件队列.这其实就已经是多核优化了,性能上不来还有很大原因是netfilter太多东西了.
    4.假设OpenWrt能利用上IPQ806x的NSS协处理器,NAT性能会远超其他的设备.

    R7800(IPQ8065)带硬件NSS驱动加速  实测1000M跑满的时候,CPU没有占用。

    来源 https://www.right.com.cn/forum/thread-4130959-1-1.html

    这个不错,但是集成的软件比较老了,所以我在他源码的基础上做了一些改进
    使用的是官方19.07的源码和LEAN的一部分源码
    OPENWRT官方源码:https://github.com/openwrt/openwrt
    感谢大神LEAN:https://github.com/coolsnowwolf/lede
    感谢大神quarky:https://forum.openwrt.org/t/ipq806x-nss-drivers/12613
    感谢大神presisco:https://www.right.com.cn/forum/thread-4041282-1-1.html

    IPQ806X NSS NAPI 驱动处理流程分析

    IPQ806X网络子系统(NETWORK SUB SYSTEM,简称NSS)NAPI入口函数是:
    int nss_core_handle_napi(struct napi_struct* napi,int budget)
    其中,入参budget是每次消耗的预算,即一次最多处理几个报文。
    在下面的循环中,会判断这个值是否已减到了0,非零时继续。
    基本流程是:
    1、napi->dev中记录有NSS的中断上下文信息,包含中断号。首先根据这个中断信息获取中断发生的原因码,一个32位整型值。
    2、有两重循环,用代码描述是:
    do{
    while(中断原因码非0,预算非零)
    {
    处理DMA中的数据,上报到网络协议栈,计算本次处理数
    减少预算
    如果本次处理数小于权重值,清除原因码中相应已处理过的优先级位,避免淹死在某一个优先级中队列中
    }
    重新读取中断,更新原因码
    }while(中断原因码非0,预算非零)

    ipq806X

    来源 https://www.cnblogs.com/yaxinsn/p/8376810.html

    clip_image002

    ipq401x没有nss模块。但是也需要nss_gmac和nss_drv。驱动之间有依赖关系。

    edma与ess-switch不是一回事儿

    目录/proc/device-tree/soc

    clip_image004

    ess-switch 的寄存器范围是0xC000000 长度是80000.
    edma寄存器的地址的开始正好是ess-switch的结束。
    4018的ess-switch 应该是一个AR8327(芯片是VER_DESS不是8327。使用的驱动是8327的驱动。)。这个switch可以集成在QCA953X等MIPS芯片中,也可能集成在IPQ401X等ARM的芯片中。两种集成方式可能与CPU的连接方式会有不同之处。
    
    a>debug reg get 0 4
    [Data]:0x1401 //芯片ID。DEVICE_ID
    operation done.
    
    4018(ARM)的ssdk的基本信息
    dev0@qca>debug ssdk config
    1.SSDK CONFIGURATION: [build verison]:2.0.0.2 [build date]:2018-01-17-17:44:27 [chip type]:dess [arch]: [os]:linux unknown [fal]:true [kernel mode]:true [uk if]:true [cpu mode]:cpu_1 [reg access]:header [ioctl minor]:254 [inf defined]:mdio_set(y) mdio_get(y) header_reg_set(y) header_reg_get(y) 2.DEMO SHELL CONFIGURATION: [build verison]:2.0.0 [build date]:2018-01-17-04:17:24 [chip type]: [arch]:mips [os]:linux version 2.6 [fal]:true [kernel mode]:true [uk if]:true [cpu mode]:cpu_1 [reg access]:mdio [ioctl minor]:254 [inf defined]:mdio_set(n) mdio_get(n) header_reg_set(n) header_reg_get(n) 3.SSDK FEATURES LIST: acl fdb igmp leaky led mib mirror misc portcontrol portvlan qos rate stp vlan cosmap ip nat sec trunk operation done. dev0@qca>
    qca953x芯片的信息。 dev0@qca>debug ssdk config 1.SSDK CONFIGURATION: [build verison]:1.3.0.2 [build date]:2018-11-10-08:40:58 [chip type]:shiva [arch]:mips [os]:linux unknown [fal]:true [kernel mode]:true [uk if]:true [cpu mode]:cpu_1 [reg access]:mdio [ioctl minor]:254 [inf defined]:mdio_set(y) mdio_get(y) header_reg_set(y) header_reg_get(y) 2.DEMO SHELL CONFIGURATION: [build verison]:1.4.0 [build date]:2018-11-09-22:58:39 [chip type]:shiva [arch]:mips [os]:linux version 2.4 #DEMO SHELL的信息不太正确。 [fal]:true [kernel mode]:true [uk if]:true [cpu mode]:cpu_1 [reg access]:mdio [ioctl minor]:254 [inf defined]:mdio_set(n) mdio_get(n) header_reg_set(n) header_reg_get(n) 3.SSDK FEATURES LIST: acl fdb igmp leaky led mib mirror misc portcontrol portvlan qos rate stp vlan cosmap ip nat sec trunk operate done. 上下层通信的方式:是misc_dev的方式。 cat /proc/misc 229 fuse 254 switch_ssdk 59 ubi_ctrl 60 memory_bandwidth 61 network_throughput 62 network_latency 63 cpu_dma_latency 130 watchdog 183 hw_random /usr/sbin/ssdk_sh是一个static的程序,不使用动态库。 Hardware Shield Layer (HSL) 硬件屏蔽层 HAL 硬件抽象层。

    switch mii psgmii mdio 之间的关系

     来源  https://blog.csdn.net/u012385733/article/details/75286959

    QCA8075: 是有5个端口Gigabit Ethernet PHY 芯片。

    PSGMII:连接MAC与PHY芯片的接口, 也称为数据接口。(PSGMII可以配置为5个copper or 4 个copper 1个COMBO)

    MDC/MDIO:控制总线接口。

    这是一个标准连接图,只是稍加解释,cpu端内置switch,笔者在看驱动的时候,对其中关系比较混乱,故记下跟踪笔记。

    设备树关系

    switch@A{
    compatible = “switchdevice”;

    reg = <0x,0x>;//从设备树看,此处的寄存器可以被CPU直接访问,因为是内置switch,故所有的vlan, qinq, isolation等功能都是在这个寄器范围内设置,因为这个功能属于switch的功能。

    };

    psgmii@B{
    compatible=”psgmiiinterface device”;

    reg = <0x,0x>; //这个也是,寄存器可以被CPU直接访问,这些寄存器是处于CPU端的关于psgmii接口的设置。

    };

    mdio@C{
    compatible = “midointerface device”;

    reg=<0x,0x>;//mdio寄存器也是可以被CPU直接访问,这是一种总线,类似于uart,通过这个接口访问phy寄存器,即QCA8075芯片内的寄存器,这里面的寄存器功能有speed, phy reset, loopback, auto negotiation, duplex mode等等功能,故如果需要控制这个功能,就需要通过mdio接口进行访问,QCA8075芯片内的寄存器还包括MII 寄存器,控制phy 与mac之的连接配置。

    }

    ========= End

     
  • 相关阅读:
    构建之法 团队和流程
    构建之法之个人技术和流程重点介绍
    几种数据库连接
    Ckidt
    hibernate_04_hibernate多对多的关系映射
    hibernate_03_hibernate一对多的关系映射
    hibernate_02_hibernate的入门
    hibernate_01_SSH环境搭建
    SpringBoot_05_ssm拦截器和默认欢迎页面的设置
    SSM14-通过AOP实现日志记录
  • 原文地址:https://www.cnblogs.com/lsgxeva/p/16414863.html
Copyright © 2020-2023  润新知