配置基本网络连接
确保QNX系统上的网络连接已经配置好,并且能够正常通信
ping
Shell |
结果会显示统计信息,包含丢包率
iperf
1. 下载和编译 iperf
如果 iperf 没有预装在你的QNX系统上,你可能需要下载源代码并进行编译。可以从iperf官网下载源代码。
目前系统上有iperf2、iperf2_d、iperf3,后续均测试比较效果
2. iperf用法
Shell |
基本使用
Shell |
- -s:以服务器模式运行
- -c <host>:以客户端模式运行,并连接到指定的服务器 <host>
- -h, --help:显示帮助信息并退出
- -v, --version:显示版本信息并退出
客户端/服务器通用选项
- -b, --bandwidth #[kmgKMG | pps]:发送带宽(比特/秒或包/秒)
- -e, --enhancedreports:使用增强报告,提供更多 TCP/UDP 和流量信息
- -f, --format [kmgKMG]:报告格式(Kbits, Mbits, KBytes, MBytes)
- -i, --interval #:周期性带宽报告的间隔时间(秒)
- -l, --len #[kmKM]:读写缓冲区的长度(默认:TCP=128K,IPv4 UDP=1470,IPv6 UDP=1450)
- -m, --print_mss:打印 TCP 最大段大小(MTU - TCP/IP 头)
- -o, --output <filename>:将报告或错误消息输出到指定文件
- -p, --port #:服务器监听/客户端连接的端口
- -u, --udp:使用 UDP 而不是 TCP
- --udp-counters-64bit:使用 64 位序列号进行 UDP 测试
- -w, --window #[KM]:TCP 窗口大小(套接字缓冲区大小)
- -z, --realtime:请求实时调度程序
- -B, --bind <host>[:<port>][%<dev>]:绑定到指定的 IP 地址、端口和设备
- -C, --compatibility:与旧版本兼容,不发送额外消息
- -M, --mss #:设置 TCP 最大段大小(MTU - 40 字节)
- -N, --nodelay:设置 TCP no delay,禁用 Nagle 算法
- -S, --tos #:设置套接字的 IP_TOS(字节)字段
服务器专用选项
- -s, --server:以服务器模式运行
- -t, --time #:监听新连接并接收流量的时间(秒)
- --udp-histogram #,#:启用 UDP 延迟直方图(bin 宽度和计数,例如 1,1000=1(ms),1000(bins))
- --recv-mmsg #:使用 recvmmsg() API
- --recv-mmsg-wait-all:使用 MSG_WAITALL 而不是 MSG_WAITFORONE
- --recv-mmsg-time #:设置 recvmmsg() API 的等待接收消息的超时时间
- --recvlowat #:设置 TCP 套接字的低水位标记
- -B, --bind <ip>[%<dev>]:绑定到多播地址和可选设备
- -H, --ssm-host <ip>:设置 SSM 源,与 -B 一起使用
- -U, --single_udp:以单线程 UDP 模式运行
- -D, --daemon:以守护进程模式运行服务器
- -V, --ipv6_domain:启用 IPv6 接收,将域和套接字设置为 AF_INET6(可以同时接收 IPv4 和 IPv6)
客户端专用选项
- -c, --client <host>:以客户端模式运行,并连接到指定的服务器 <host>
- -d, --dualtest:同时进行双向测试
- --ipg:设置分组内分组的间隔时间(毫秒)
- --isochronous <frames-per-second>:<mean>,<stddev>:按突发模式发送流量(帧 - 模拟视频流量)
- --send-mmsg #:使用 sendmmsg() API
- -n, --num #[kmgKMG]:传输的字节数(而不是 -t)
- -r, --tradeoff:分别进行双向测试
- -t, --time #:传输的时间(秒)
- -B, --bind [<ip> | [ip:port](ip:port)]:绑定源 IP(和可选端口)发送流量
- -F, --fileinput <name>:从文件中输入要传输的数据
- -I, --stdin:从标准输入输入要传输的数据
- -L, --listenport #:接收双向测试返回数据的端口
- -P, --parallel #:运行的并行客户端线程数
- -R, --reverse:反向测试(客户端接收,服务器发送)
- -T, --ttl #:多播的生存时间(默认 1)
- -V, --ipv6_domin:设置域为 IPv6(通过 IPv6 发送数据包)
- -X, --peer-detect:执行服务器版本检测和版本交换
- -Z, --linux-congestion <algo>:设置 TCP 拥塞控制算法(仅适用于 Linux)
杂项选项
- -x, --reportexclude [CDMSV]:排除报告中的 C(连接)、D(数据)、M(多播)、S(设置)、V(服务器)
- -y, --reportstyle C:报告为逗号分隔值(CSV)
- -h, --help:显示帮助信息并退出
- -v, --version:显示版本信息并退出
说明
[kmgKMG] 表示支持的单位后缀:小写表示 10^3 基数,大写表示 2^10 基数
例如,1k = 1000, 1K = 1024, 1m = 1,000,000 和 1M = 1,048,576
环境变量
- TCP 窗口大小选项可以通过环境变量 TCP_WINDOW_SIZE 设置
- 大多数其他选项可以通过环境变量 IPERF_<长选项名> 设置,例如 IPERF_BANDWIDTH
3. 测试步骤
3.1 测试带宽和丢包率
1. 一台设备上运行以下命令,启动 iperf 服务器:
Shell |
2. 另一台设备运行以下命令,启动 iperf 客户端,并连接到服务器进行带宽测试
Shell |
3. 测试完成后,iperf 会输出详细的带宽测试结果,包括传输速率和丢包信息。
示例输出:
Shell |
3.2 测试UDP丢包率
1. 一台设备上运行以下命令,启动 iperf 服务器并指定UDP模式:
Shell |
2. 另一台设备运行以下命令,启动 iperf 客户端,并连接到服务器进行带宽测试
Shell |
3. 测试完成后,
iperf 将提供以下关键指标:
- 带宽:传输速率(Mbps)
- 丢包率:丢失的包数与发送的总包数的百分比
- 延迟(UDP):延迟统计信息(如果启用了)
示例输出:
Shell |
3.3 高级测试
- 多线程测试:使用 -P 参数进行并行测试,以模拟多用户环境
Shell |
- 双向测试:使用 -d 参数同时测试上行和下行带宽
Shell |
- 窗口大小和缓冲区调整:使用 -w 参数调整TCP窗口大小,以测试不同网络条件下的性能
Shell |
实践
Test 1 basic
1. adb启用服务
Shell |
2. Qnx连接到adb测试带宽
Shell |
输出:
Shell |
报告可以看出:
发送端在 60 秒内传输了 5.49 GB 数据,平均比特率为 786 Mbits/sec。
接收端在 60.04 秒内接收了 5.49 GB 数据,平均比特率为 785 Mbits/sec。
Test 2 udp
1. adb启用服务
Shell |
2. Qnx连接到adb测试带宽,指定udp模式
Shell |
输出:
Shell |
报告可以看出:
每个时间间隔为 10 秒,显示了每个间隔内的传输量、比特率(传输速率)和发送的总数据报文数;
- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -
总结了整个 60 秒测试期间的传输量、平均比特率、抖动(Jitter)、以及丢失的数据报文数和总发送的数据报文数。在这个示例中,传输速率保持稳定,且丢失率为 0%,表明网络连接相对稳定且传输效率良好。
Test 3 others
- 多线程测试:使用 -P 参数进行并行测试,以模拟多用户环境
Shell |
- 双向测试:使用 -d 参数同时测试上行和下行带宽
Shell |
- 窗口大小和缓冲区调整:使用 -w 参数调整TCP窗口大小,以测试不同网络条件下的性能
Shell |