硬件: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 有线 | TCP | 77 Mbps | 百兆网口,效率 77% |
| wlan0 WiFi | TCP | 76 Mbps | 接近有线,信号质量好 |
| wlan0 WiFi | UDP | 95 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 |
关联笔记
- RTL8189FS_WiFi驱动移植 — WiFi 驱动编译、加载、连接热点全流程
- WSL2搭建iMX6ULL开发环境完整教程 — 编译环境与文件传输方式
- MMC-SD-SDIO协议概述 — SDIO 总线原理,影响 WiFi 吞吐上限
延伸阅读
吞吐测试结果需要结合 WiFi 驱动状态和开发环境网络配置分析。
- 返回嵌入式 Linux 学习路线,确认本文在完整知识结构中的位置。
- RTL8189FS WiFi 驱动移植与配置
- WSL2 搭建 iMX6ULL 开发环境完整教程




