网口速率测试工具 iperf3

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/engrossment/article/details/97791972

先前有整理了 iperf 的使用文章(https://blog.csdn.net/engrossment/article/details/84559708),但近期又对这个 ETH 的测试进行了研究,有一些新的发现,故重新整理出来。

概述

本文档说明 ETH 网口的带宽测试。基于 PCIe 等方式扩展的网口设备也可以使用该测试方法。或者无论 PRU、RMII 网口,只要是在 Linux 上生成了对应的网络设备,可通信,即可使用该基于 iperf 工具的方法。

需要注意的是,测试出来的是整个(拓扑)系统的“吞吐量”,而“带宽”用于描述 ETH 接口和通道本身,是其协议设计属性。整体系统测试出来的数值,可能受各个环节瓶颈的限制。

测试方法与思路

iperf 的基本用法是,辅助设备(PC)与待测网口的板卡进行通信,统计测试情况。所以,从这里可以看出这个测试牵涉到几个东西,包括网线、交换机、路由器、PC 网口、PC 系统。这整个链路里的设备,都有可能对最终的测试结果产生影响。务必留意以下几点。

  1. 最好全部辅助测试设备都是支持千兆网络的,当待测网口就是千兆网口时就必须如此。而 PC 的网络,最好不要使用无线网卡,而是使用更为稳定的有线网络。
  2. 如果对当前使用的这些辅助设备的性能没有把握,可以先使用另一个已经验证过的板卡来对辅助设备(网络)进行确认测试。再用它来测试待测板卡网口。
  3. 为避免网络中其他设备的影响,需要独立的测试网络,不要把上述辅助设备接入到公司共用网络中。而是整个测试网络只有一个 PC、一个待测板卡设备、一个千兆路由器。
  4. 运行测试时,PC 和板卡都应停掉系统中占用 CPU 资源的服务、程序。因为这个测试中 CPU 可能是性能瓶颈,对千兆网口来说尤其如此。所以要排除其他程序的影响。
  5. Iperf 程序作为服务端将消耗较少的处理器资源,所以应该在板卡启动 iperf 的服务端进行测试。
  6. Iperf3 对测试有改进,应使用 iperf3 代替 iperf 进行测试。
  7. 使用 -O 参数跳过前几秒的测试数据,因为可能不准。
  8. 测试 UDP 时,-b 选项指定 0,不限制最高带宽;-l -w 指定足够大的值,让测试结果稳定。
  9. UDP 丢包率受多方面影响,不能作为评估硬件稳定性的指标。同样,TCP 测试中报告的数据包重传数也不能说明问题。需要注意到底层的链路层具有数据校验核重传功能。
  10. 如果目标板卡处理器是多核架构,需要特别注意对 TX、RX、iperf 程序的处理器核绑定,充分发挥处理器性能。
  11. 如果需要对多个网口进行同时测试,可以使用 -B 绑定 IP,-p 绑定端口。
  12. Iperf 官网有提供 Windows 版本可以下载,在 Windows 的 powershell、cmd 下可以直接运行 iperf3,支持的参数基本一致。这样运行效果会好于在 Windows 下虚拟机里的 Ubuntu 里运行测试。

基于 TCP 的测试

基于 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 的测试

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日

展开阅读全文

没有更多推荐了,返回首页