1、背景介绍

corundum是一个开源的用FPGA实现100G网卡的方案,网站见:https://github.com/corundum/corundum

针对此开源方案,进行了实际验证,FT2000+ 64主芯片通过PCIE连接一片Xilinx的VU13P,在VU13P上部署corundum,FT2000+上运行对应驱动,实现了100G网卡的功能。

2、驱动介绍

首次驱动使用方式:

在驱动源码目录下启动Linux终端中依次输入以下命令:

make clean 

make

make install

modprobe mqnic

此时终端中输入:ls -l /sys/class/net  可以看到多出的网卡设备。

mqnic文件中包含:19个源码文件,其中3h头文件 16个文件

mqnic.h

主要定义驱动所需的数据结构和声明相关函数

mqnic_hw.h

主要定义网卡寄存的基地址和偏移量和定义描述符数据结构等

mqnic_ioctl.h

主要定义io控制相关数据结构和寄存器偏移量

mqnic_board.c

为板级eeprom和光模块,创建注册IIC控制器和IIC设备和设计操作函数。

mqnic_cq.c

提供完成队列的创建,启动、停止、释放等函数

mqnic_dev.c

提供杂项字符设备的fops函数组,包括open、release、mmap、ioctl函数

mqnic_eq.c

提供事件队列的创建,启动、停止、释放以及事件处理等函数

mqnic_ethool.c

提供ethtool的操作函数

mqnic_i2c.c

提供IIC控制器的注册函数及IIC控制器操作函数

mqnic_if.c

为interface数据结构中填充各队列的参数,调用各队列创建接口创建队列实例,提供interface参数读写接口

mqnic_irq.c

提供pci中断申请和platform中断申请函数以及释放函数

mqnic_main.c

网卡驱动注册的入口,使用Linux PCI/PCIe设备驱动开发框架注册设备,获取注册网络设备所需的资源

mqnic_nerdev.c

提供网络设备的注册以及提供网络的操作函数

mqnic_ptp.c

注册ptp设备,提供ptp设备的操作函数

mqnic_reg_block.c

提供创建寄存器链表数据结构函数,提供链表查询函数

mqnic_rx.c

提供接收队列的创建,启动、停止、释放以及网络数据接收处理等函数

mqnic_sched_bloc.c

提供调度器block数据结构创建和调用调度器实例创建,提供调度器block摧毁函数,提供调度器block启动和关闭函数

mqnic_scheduler.c

提供调度器实例创建,提供调度器摧毁函数,提供调度器启动和关闭函数

mqnic_tx.c

提供发送队列的创建,启动、停止、释放以及网络数据发送处理等函数

3、调试问题总结

问题1

问题描述:加载网卡驱动成功后,输入ifconfig enp1s0 up命令后内存消耗过大。

产生原因:执行ifconfig up时会调用驱动中的mqnic_start_open函数,该函数会根据rx_queue-conrx_cpl_queue_count中最小的值(256)调用mqnic_activate_rx_ring相应的次数,mqnic_activate_rx_ring调用mqnic_refill_rx_queuemqnic_refill_rx_queue根据队列size-(head-tail)(初始值为1024为队列size)的值调用相应次数的mqnic_prepare_rx_desc函数,mqnic_prepare_rx_desc调用dev_alloc_page分配1页内存。所以消耗的内存=256x1024xPAGESIZE=16GB。简单说服务器内存PAGESIZE64k,个人操作系统的PAGESIZE4k,两者之间差距导致该问题。

解决措施:对于无法重新编译的linux内核的操作系统,可以调整发送/接收环行队列的个数减小内存消耗;对于可以重新编译的Linux内核的操作系统可以修改编译参数页大小避免这个问题。

问题2

问题描述:Corundum网卡无法ping

产生原因:
解决措施:vivado pcie4 IP核配置中勾选 Enable Client Tag选项。

问题3

问题描述:网卡性能如何调优?

调优方法:

1、设置网卡中断亲和性,目的是让多CPU负载均衡达到更高的并行效率或者网卡中断全部集中在某一CPU核提高数据局部性减小各核之间资源竞争从而损耗性能。多核并行运行需要从多方面优化例如:网卡队列与网卡中断绑定然后中断与CPU核绑定应用程序与CPU核绑定,从而减少多核并行时CPU相互竞争中断资源和减少cache未命中概率。

Linux下:首先关闭为irqbalance服务(Linux中断平衡服务)关闭命令:service  irqbalance stop / systemctl stop irqbalance.service / systemctl disable irqbalance.service (永久关闭)/ systemctl disable irqbalance.service(查看服务状态)、 修改中断亲和性命令:echo $cpunum > /proc/irq/$irqnum/smp_affinity_list  $cpunum 为核号例如 0/1/2/3 $irqnum为中断号例如 0/1/2/3

2、关闭防火墙命令:systemctl stop firewalld.service(暂时关闭)、 systemctl disable firewalld.service(永久关闭)、 systemctl status firewalld.service(查看状态)

3、设置PCIE Max Payload Size 大小 例如:从128B改为256/512B; 查看corundum网卡pcie Device control寄存器值命令:setpci -s 01:00.0 78.w 设置512 mps值命令为 setpci -s 01:00.0 78.w=2950 ;查看root节点pcie Device control寄存器值命令:setpci -s 00:00.0 c8.w 设置512 mps值命令为 setpci -s 00:00.0 c8.w=2950 

4
、取消PCIE的省电模式

5、开启巨帧 命令:ip link set dev $devname mtu 9000

6
、增加发送接收队列长度: ifconfig  $devname txqueuelen $num

7
、应用程序绑核

8、调整TCP窗口大小、网络协议栈参数调优(/proc/sys/net/ipv4/ 

9
、网卡带宽与网络协议栈的处理速度有关,由于ft2000+采用的是NUMA结构所以跨node访存会造成性能下降,通过lspci -vv查询到网卡挂载在node0节点所以将网卡中断配置在node0节点的核上并将测试程序也绑定到node0上使得网卡性能最优。

最优设置如下:

1、首先加载mqnic_256.ko驱动;默认的驱动环形队列里元素的数量为1024 CPU无法同时开启两个interfacemqnic_256修改环形队列元素数量为256减少内存的消耗。
2、修改中断亲和性 ,corundum中断设置在第0簇即0-7核上。
3、关闭irqbalance.service firewalld.service服务
4、在服务器端输入:

numactl --cpunodebind=0 --localalloc iperf -s; 

在客户端输入:

numactl --cpunodebind=0 --localalloc iperf -c 192.168.10.202 -i 10 -t 3600 -P 4

Logo

DAMO开发者矩阵,由阿里巴巴达摩院和中国互联网协会联合发起,致力于探讨最前沿的技术趋势与应用成果,搭建高质量的交流与分享平台,推动技术创新与产业应用链接,围绕“人工智能与新型计算”构建开放共享的开发者生态。

更多推荐