iperf3 交叉编译与网络吞吐测试 文章封面

iperf3 交叉编译与网络吞吐测试

硬件:iMX6ULL 开发板 + RTL8189FTV WiFi 模块
工具链:gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf
目标:交叉编译 iperf3,测试有线(eth0)和 WiFi(wlan0)吞吐量


一、获取 iperf3 源码

iperf3 官方仓库:esnet/iperf(GitHub),WSL 无法直接访问 GitHub,在 Windows 浏览器下载后复制到 WSL。

下载地址:https://github.com/esnet/iperf/releases

下载 iperf-3.21.tar.gz(源码包,约 691 KB),复制到 WSL:

cp /mnt/c/Users/Administrator/Downloads/iperf-3.21.tar.gz ~/
tar xf iperf-3.21.tar.gz
cd iperf-3.21


二、交叉编译

2.1 configure 配置

使用完整工具链路径,避免多工具链环境下的 PATH 冲突:

./configure 
    --host=arm-linux-gnueabihf 
    --prefix=/tmp/iperf3-arm 
    --without-openssl 
    --enable-static 
    --disable-shared 
    CC=/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-gcc 
    CXX=/usr/local/arm/gcc-linaro-4.9.4-2017.01-x86_64_arm-linux-gnueabihf/bin/arm-linux-gnueabihf-g++

参数说明:

参数说明
--host=arm-linux-gnueabihf目标平台为 ARM
--prefix=/tmp/iperf3-arm安装路径
--without-openssl不依赖 OpenSSL,简化编译
--enable-static --disable-shared静态链接,生成自包含二进制
CC= / CXX=指定交叉编译器完整路径

⚠️ 为何用静态链接? 动态链接会生成对 libiperf.so.0 的依赖,开发板 rootfs 没有该库会报错:error while loading shared libraries: libiperf.so.0: cannot open shared object file。静态链接将所有库打进二进制,拷一个文件即可运行。

2.2 编译安装

make -j4
make install

2.3 验证

ls /tmp/iperf3-arm/bin/iperf3

file /tmp/iperf3-arm/bin/iperf3
# 应输出:ELF 32-bit LSB executable, ARM, ...


三、部署到开发板

3.1 拷贝到 NFS 目录

cp /tmp/iperf3-arm/bin/iperf3 /nfsroot/

3.2 开发板上安装

cp /mnt/nfs/iperf3 /usr/local/bin/
chmod +x /usr/local/bin/iperf3

3.3 配置 PATH

BusyBox 默认 PATH 不包含 /usr/local/bin,需手动添加:

echo 'export PATH=$PATH:/usr/local/bin' >> /etc/profile
source /etc/profile

之后直接输入 iperf3 即可使用,支持 Tab 补全。


四、Windows 端安装 iperf3

从 ar51an/iperf3-win-builds 下载预编译版本(无需安装 iperf3 源码编译),选择:

iperf-3.21-win64.zip(普通版,静态链接,无需 OpenSSL)

解压后在目录下运行:

.iperf3.exe -s
# Server listening on 5201


五、吞吐量测试

5.1 测试有线网络(eth0)

# 开发板
iperf3 -c 192.168.2.142 -t 10

注:不指定 -B 时,流量默认走路由表优先级最高的接口。开发板路由表中 192.168.2.0/24 网段优先走 eth0,因此该命令测的是有线网络。

5.2 测试 WiFi TCP(wlan0)

# 开发板,用 -B 绑定 wlan0 的 IP,强制流量走 WiFi
iperf3 -c 192.168.2.142 -B 192.168.2.180 -t 10

-B 参数绑定源 IP,路由选择会匹配到 wlan0 接口,从而测试 WiFi 实际吞吐。

5.3 测试 WiFi UDP(wlan0)

# -u 指定 UDP 模式,-b 指定目标带宽上限
iperf3 -c 192.168.2.142 -B 192.168.2.180 -u -b 200M -t 60

UDP 模式必须用 -b 指定目标带宽,否则默认只打 1 Mbps。设置高于实际上限(如 200M)可让网卡跑到极限,观察真实吞吐和丢包情况。


六、测试结果

6.1 有线 TCP(eth0,百兆网口)

[ ID] Interval        Transfer     Bitrate
[  5] 0.00-10.06 sec  92.4 MBytes  77.0 Mbits/sec    receiver
[  5] 0.00-10.03 sec  93.6 MBytes  78.3 Mbits/sec    sender

6.2 WiFi TCP(wlan0,RTL8189FTV 802.11n)

[ ID] Interval        Transfer     Bitrate
[  5] 0.00-10.01 sec  90.9 MBytes  76.1 Mbits/sec    receiver
[  5] 0.00-10.00 sec  92.1 MBytes  77.3 Mbits/sec    sender

6.3 WiFi UDP(wlan0,目标带宽 200M,持续 60 秒)

[ ID] Interval        Transfer     Bitrate       Jitter    Lost/Total
[  5] 0.00-60.02 sec  681 MBytes   95.2 Mbits/sec  0.096 ms  1978/491238 (0.4%)  receiver
[  5] 0.00-60.00 sec  684 MBytes   95.6 Mbits/sec  0.000 ms  0/491238 (0%)       sender
[SUM] 7 datagrams received out-of-order

6.4 汇总对比

测试场景协议吞吐量备注
eth0 有线TCP77 Mbps百兆网口,效率 77%
wlan0 WiFiTCP76 Mbps接近有线,信号质量好
wlan0 WiFiUDP95 Mbps高于 TCP,无 ACK 占用反向信道

6.5 结果分析

WiFi UDP 比 TCP 快约 20 Mbps,原因:

  • WiFi 半双工,TCP ACK 走反向占用信道,有效吞吐被压缩
  • UDP 无 ACK,发送方可独占信道,接近物理层上限

WiFi UDP 丢包 0.4%,Jitter 0.096 ms:

  • 丢包低于 1%,属正常 WiFi 波动范围
  • Jitter 极低,信道稳定,适合实时语音/视频类应用

WiFi 与有线 TCP 吞吐几乎相同:

  • RTL8189FTV 802.11n 单流 HT20,物理层速率约 72.2 Mbps,TCP 跑到 76 Mbps 已接近上限
  • SDIO 总线也是潜在瓶颈:RTL8189FTV 通过 SDIO 接口连接 iMX6ULL,若 SDIO 时钟配置偏低,WiFi 吞吐会受 SDIO 总线限制而非无线信道限制

七、已知问题

问题原因解决
libiperf.so.0: No such file or directory默认动态链接,rootfs 缺少该库重新编译加 --enable-static --disable-shared
iperf3 Tab 补全不生效/usr/local/bin 不在 PATH追加到 /etc/profile
测试结果实为 eth0 而非 wlan0路由表优先走 eth0用 -B wlan0_ip 绑定源 IP

关联笔记

延伸阅读

吞吐测试结果需要结合 WiFi 驱动状态和开发环境网络配置分析。

发表评论

您的邮箱地址不会被公开。 必填项已用 * 标注

滚动至顶部