先前有整理了 iperf 的使用文章(https://blog.csdn.net/engrossment/article/details/84559708),但近期又对这个 ETH 的测试进行了研究,有一些新的发现,故重新整理出来。
iperf 官网:https://iperf.fr/
本文档说明 ETH 网口的带宽测试。基于 PCIe 等方式扩展的网口设备也可以使用该测试方法。或者无论 PRU、RMII 网口,只要是在 Linux 上生成了对应的网络设备,可通信,即可使用该基于 iperf 工具的方法。
需要注意的是,测试出来的是整个(拓扑)系统的“吞吐量”,而“带宽”用于描述 ETH 接口和通道本身,是其协议设计属性。整体系统测试出来的数值,可能受各个环节瓶颈的限制。
iperf 的基本用法是,辅助设备(PC)与待测网口的板卡进行通信,统计测试情况。所以,从这里可以看出这个测试牵涉到几个东西,包括网线、交换机、路由器、PC 网口、PC 系统。这整个链路里的设备,都有可能对最终的测试结果产生影响。务必留意以下几点。
基于 TCP 的通信是常规用法,测试出的数据是在保证所有传输数据都送达对方的情况下的吞吐量。
如果是双核处理器,注意分配进程到不同的核。以下以 57xx 为例:
TARGET# echo 1 > /proc/irq/360/smp_affinity RX 指定该中断由第一个核处理。
TARGET# echo 2 > /proc/irq/361/smp_affinity TX 指定该中断由第二个核处理。
服务端板卡执行以下命令:
TARGET# taskset -c 1 iperf3 -s 指定进程由第二个核处理
客户端 PC 执行以下命令:
HOST# iperf3 -c 192.168.0.233 -O2 -V
这里 -c 的含义和用法有点不很直观,含义是 client,表示当前使用客户端模式,而后接的却是服务端的 IP地址。
使用默认参数,测试时长 10 秒。完成之后可以看到统计结果。一般来说,做严格的测试需要使用 -t 选项设定更长的测试时间,重复执行多次测试,对所有结果做平均值、方差等统计分析。
UDP 的特点是不确认数据包的送达,所以 iperf 作为服务端时就没有了 TX 的 irq 开销,发送端设置 -b0 后,就相当于系统“放开手脚”去撑满通信通道。这样,可以测试出 ETH 更接近实际情况的带宽值。
同样需要注意对处理器核的调配。另外,对丢包率要综合分析,不能简单任务是硬件异常。
服务端板卡以下命令:
TARGET# taskset -c 1 iperf3 -s 指定进程由第二个核处理
客户端执行以下命令:
HOST# iperf3 -c 192.168.0.233 -O2 -V -b0 -l32K -w32M
我们基于 TCP/IP 协议栈对 ETH 进行测试,由于协议栈是分层处理,而且层与层之间相对独立隔离,上层的测试很难直接反馈出底层芯片、PCB、物理层的问题。所以可以按实际需要补充直接对物理层之上的链路层进行测试。
Linkloop 源码:https://sourceforge.net/projects/linkloop/
PC 启动服务端,指定 ETH 的 mac 地址:
HOST# ./linkloop_reply eth0
板卡启动客户端进行数据发送,指定当前板卡的出口 ETH 节点、服务端 mac 地址和发送的数据包数量:
TARGET# ./linkloop -i 1c:39:47:b2:7c:5d -n 10000
当硬件异常时,程序将会报告传输超时。
2019年7月30日