中断均衡脚本
中断均衡脚本
来源 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):
CPU123表示使用CPU1、CPU2、CPU3均可。为了提升局部性以提升缓存效率,中断往往被固定在所有指定CPU中最小的那个,在缺少硬件NAT与千兆网的情况下很容易占满1个CPU核心而其他核心空闲,出现性能瓶颈。因此需要调整中断与CPU的对应关系。。
使用两台间隔7米的ACRH17组建WDS无线桥接网络,主路由中运行iperf3服务器,主从路由通过QCA9984 5G进行连接,测试电脑连接于从路由的LAN1接口。
两台ACRH17均使用OpenWrt官方19.07.2固件与ath10k无线驱动。
不同中断绑定配置下的转发性能如下表所示:
我已经将中断的配置代码整合为脚本,只需要根据个人需求配置中断与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
ipq401x没有nss模块。但是也需要nss_gmac和nss_drv。驱动之间有依赖关系。
edma与ess-switch不是一回事儿
目录/proc/device-tree/soc
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