基于XDMA的简易FPGA网卡实现(二)
上一期笔者实现了百兆网卡,但使用iperf测tcp速度时,tcp发送速度只有33Mb。本期记录此问题解决过程。
开发环境
FPGA开发板 | XC7K325T |
---|---|
CPU | RK3399 |
开发主机 | Win11 and ubuntu20.04 |
IDE版本 | Xilinx Vitis IDE v2021.1.0 (64-bit) Vivado v2021.1 (64-bit) |
优化XDMA
-
首先将xdma改为描述符旁路模式,使用旁路模式时,FPGA可以绕过CPU,使用FPGA侧旁路接口写入描述符,实现数据搬运
-
FPGA侧实现环形缓冲区管理,通过判断读写指针,实现数据收发。环形缓冲区可以实现数据缓冲,减少CPU开销同时提高性能
-
使用xdma的usr_irq自定义中断,完成多个描述符或者超时后发起usr_irq,可以有效减少CPU中断开销
测试
测试发现发送速度依旧不理想,分析wireshark抓包,并无重传,仔细检查发现如下线索:
396939和396940两个包间隔了42ms,出现概率约1/30,电脑IP为192.168.1.106,意味着电脑间隔了42ms才发出下一个包。换用两台电脑进行iperf测试,未出现此情况,猜测是tcp窗口太大导致。使用iperf -s -w 65536
命令指定电脑tcp窗口为64KB,测试结果如下:
tcp收发速度均在94Mb左右,wireshark抓包,包间隔不超过3ms
关注博主公众号,优质文章不断更新