Bootstrap

QNX EMAC测丢包率、带宽

配置基本网络连接

确保QNX系统上的网络连接已经配置好,并且能够正常通信

ping

Shell
# ping -c 100 192.168.1.3
    //-c 100:请求次数为100
PING 192.168.1.3 (192.168.1.3): 56 data bytes
64 bytes from 192.168.1.3: icmp_seq=0 ttl=64 time=0.000 ms
64 bytes from 192.168.1.3: icmp_seq=1 ttl=64 time=0.000 ms
64 bytes from 192.168.1.3: icmp_seq=2 ttl=64 time=0.000 ms
64 bytes from 192.168.1.3: icmp_seq=3 ttl=64 time=0.358 ms
64 bytes from 192.168.1.3: icmp_seq=4 ttl=64 time=0.000 ms
64 bytes from 192.168.1.3: icmp_seq=5 ttl=64 time=0.272 ms
64 bytes from 192.168.1.3: icmp_seq=6 ttl=64 time=0.000 ms
64 bytes from 192.168.1.3: icmp_seq=7 ttl=64 time=0.000 ms
64 bytes from 192.168.1.3: icmp_seq=8 ttl=64 time=0.000 ms
64 bytes from 192.168.1.3: icmp_seq=9 ttl=64 time=0.000 ms

--- 192.168.1.3 ping statistics ---
10 packets transmitted, 10 packets received, 0.0% packet loss
round-trip min/avg/max/stddev = 0.000/0.063/0.358/0.127 ms

结果会显示统计信息,包含丢包率

iperf

1. 下载和编译 iperf

如果 iperf 没有预装在你的QNX系统上,你可能需要下载源代码并进行编译。可以从iperf官网下载源代码。

目前系统上有iperf2、iperf2_d、iperf3,后续均测试比较效果

2. iperf用法

Shell
# iperf2 --help
Usage: iperf [-s|-c host] [options]
       iperf [-h|--help] [-v|--version]

Client/Server:
  -b, --bandwidth #[kmgKMG | pps]  bandwidth to send at in bits/sec or packets per second
  -e, --enhancedreports    use enhanced reporting giving more tcp/udp and traffic information
  -f, --format    [kmgKMG]   format to report: Kbits, Mbits, KBytes, MBytes
  -i, --interval  #        seconds between periodic bandwidth reports
  -l, --len       #[kmKM]    length of buffer in bytes to read or write (Defaults: TCP=128K, v4 UDP=1470, v6 UDP=1450)
  -m, --print_mss          print TCP maximum segment size (MTU - TCP/IP header)
  -o, --output    <filename> output the report or error message to this specified file
  -p, --port      #        server port to listen on/connect to
  -u, --udp                use UDP rather than TCP
      --udp-counters-64bit use 64 bit sequence numbers with UDP
  -w, --window    #[KM]    TCP window size (socket buffer size)
  -z, --realtime           request realtime scheduler
  -B, --bind <host>[:<port>][%<dev>] bind to <host>, ip addr (including multicast address) and optional port and device
  -C, --compatibility      for use with older versions does not sent extra msgs
  -M, --mss       #        set TCP maximum segment size (MTU - 40 bytes)
  -N, --nodelay            set TCP no delay, disabling Nagle's Algorithm
  -S, --tos       #        set the socket's IP_TOS (byte) field

Server specific:
  -s, --server             run in server mode
  -t, --time      #        time in seconds to listen for new connections as well as to receive traffic (default not set)
      --udp-histogram #,#  enable UDP latency histogram(s) with bin width and count, e.g. 1,1000=1(ms),1000(bins)
      --recv-mmsg #        use recvmmsg() API
      --recv-mmsg-wait-all use MSG_WAITALL instead of MSG_WAITFORONE
      --recv-mmsg-time #   set timeout to wait for messages to be received in recvmmsg() API
      --recvlowat #        set the tcp socket receive low-water mark
  -B, --bind <ip>[%<dev>]  bind to multicast address and optional device
  -H, --ssm-host <ip>      set the SSM source, use with -B for (S,G)
  -U, --single_udp         run in single threaded UDP mode
  -D, --daemon             run the server as a daemon
  -V, --ipv6_domain        Enable IPv6 reception by setting the domain and socket to AF_INET6 (Can receive on both IPv4 and IPv6)

Client specific:
  -c, --client    <host>   run in client mode, connecting to <host>
  -d, --dualtest           Do a bidirectional test simultaneously
      --ipg                set the the interpacket gap (milliseconds) for packets within an isochronous frame
      --isochronous <frames-per-second>:<mean>,<stddev> send traffic in bursts (frames - emulate video traffic)
      --send-mmsg #        use sendmmsg() API
  -n, --num       #[kmgKMG]    number of bytes to transmit (instead of -t)
  -r, --tradeoff           Do a bidirectional test individually
  -t, --time      #        time in seconds to transmit for (default 10 secs)
  -B, --bind [<ip> | <ip:port>] bind ip (and optional port) from which to source traffic
  -F, --fileinput <name>   input the data to be transmitted from a file
  -I, --stdin              input the data to be transmitted from stdin
  -L, --listenport #       port to receive bidirectional tests back on
  -P, --parallel  #        number of parallel client threads to run
  -R, --reverse            reverse the test (client receives, server sends)
  -T, --ttl       #        time-to-live, for multicast (default 1)
  -V, --ipv6_domain        Set the domain to IPv6 (send packets over IPv6)
  -X, --peer-detect        perform server version detection and version exchange
  -Z, --linux-congestion <algo>  set TCP congestion control algorithm (Linux only)

Miscellaneous:
  -x, --reportexclude [CDMSV]   exclude C(connection) D(data) M(multicast) S(settings) V(server) reports
  -y, --reportstyle C      report as a Comma-Separated Values
  -h, --help               print this message and quit
  -v, --version            print version information and quit

[kmgKMG] Indicates options that support a k,m,g,K,M or G suffix
Lowercase format characters are 10^3 based and uppercase are 2^n based
(e.g. 1k = 1000, 1K = 1024, 1m = 1,000,000 and 1M = 1,048,576)

The TCP window size option can be set by the environment variable
TCP_WINDOW_SIZE. Most other options can be set by an environment variable
IPERF_<long option name>, such as IPERF_BANDWIDTH.

Source at <http://sourceforge.net/projects/iperf2/>
Report bugs to <[email protected]>

基本使用

Shell
iperf [-s|-c host] [options]
iperf [-h|--help] [-v|--version]

  • -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
iperf -s

2. 另一台设备运行以下命令,启动 iperf 客户端,并连接到服务器进行带宽测试

Shell
iperf -c <server_ip> -t 60 -i 10 -e
//-t 60:持续时间(s)
//-i 10:每隔10s报告一次测试结果
//-e:启用增强报告,提供更多 TCP/UDP 和流量信息

3. 测试完成后,iperf 会输出详细的带宽测试结果,包括传输速率和丢包信息。

示例输出:

Shell
[ ID] Interval       Transfer     Bandwidth
[  3]  0.0-10.0 sec  1.10 GBytes  942 Mbits/sec
[  3] 10.0-20.0 sec  1.10 GBytes  942 Mbits/sec
[  3] 20.0-30.0 sec  1.10 GBytes  942 Mbits/sec

3.2  测试UDP丢包率

1. 一台设备上运行以下命令,启动 iperf 服务器并指定UDP模式:

Shell
iperf -s -u

2. 另一台设备运行以下命令,启动 iperf 客户端,并连接到服务器进行带宽测试

Shell
iperf -c <server_ip> -u -b 10M -t 60 -i 10 -e
//-b 10M:带宽限制为 10 Mbps
//-t 60:持续时间(s)
//-i 10:每隔10s报告一次测试结果
//-e:启用增强报告,提供更多 TCP/UDP 和流量信息

3. 测试完成后,

iperf 将提供以下关键指标:

  • 带宽:传输速率(Mbps)
  • 丢包率:丢失的包数与发送的总包数的百分比
  • 延迟(UDP):延迟统计信息(如果启用了)

示例输出:

Shell
[ ID] Interval       Transfer     Bandwidth        Jitter   Lost/Total Datagrams
[  3]  0.0-10.0 sec  12.5 MBytes  10.5 Mbits/sec   0.020 ms  0/ 1000 (0%)
[  3] 10.0-20.0 sec  12.5 MBytes  10.5 Mbits/sec   0.015 ms  0/ 1000 (0%)
[  3] 20.0-30.0 sec  12.5 MBytes  10.5 Mbits/sec   0.018 ms  0/ 1000 (0%)

3.3 高级测试
  • 多线程测试:使用 -P 参数进行并行测试,以模拟多用户环境

Shell
iperf -c <server_ip> -t 60 -P 4

  • 双向测试:使用 -d 参数同时测试上行和下行带宽

Shell
iperf -c <server_ip> -t 60 -d

  • 窗口大小和缓冲区调整:使用 -w 参数调整TCP窗口大小,以测试不同网络条件下的性能

Shell
iperf -c <server_ip> -t 60 -w 256k

实践

Test 1 basic

1. adb启用服务

Shell
adb shell
iperf3 -s

2. Qnx连接到adb测试带宽

Shell
iperf3 -c 192.168.1.3 -t 60 -i 10

输出:

Shell
# iperf3 -c 192.168.1.3 -t 60 -i 10
Connecting to host 192.168.1.3, port 5201
[  5] local 192.168.1.1 port 23007 connected to 192.168.1.3 port 5201
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec   927 MBytes   777 Mbits/sec
[  5]  10.00-20.01  sec   939 MBytes   787 Mbits/sec
[  5]  20.01-30.01  sec   950 MBytes   797 Mbits/sec
[  5]  30.01-40.00  sec   939 MBytes   788 Mbits/sec
[  5]  40.00-50.01  sec   935 MBytes   784 Mbits/sec
[  5]  50.01-60.00  sec   933 MBytes   783 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-60.00  sec  5.49 GBytes   786 Mbits/sec                  sender
[  5]   0.00-60.04  sec  5.49 GBytes   785 Mbits/sec                  receiver

iperf Done.

 

报告可以看出:

发送端在 60 秒内传输了 5.49 GB 数据,平均比特率为 786 Mbits/sec。

接收端在 60.04 秒内接收了 5.49 GB 数据,平均比特率为 785 Mbits/sec。

Test 2 udp

1. adb启用服务

Shell
adb shell
iperf3 -s

2. Qnx连接到adb测试带宽,指定udp模式

Shell
iperf3 -c 193.168.1.3 -u -b 10M -t 60 -i 10

输出:

Shell
# iperf3 -c 192.168.1.3 -u -b 10M -t 60 -i 10
Connecting to host 192.168.1.3, port 5201
[  5] local 192.168.1.1 port 27157 connected to 192.168.1.3 port 5201
[ ID] Interval           Transfer     Bitrate         Total Datagrams
[  5]   0.00-10.00  sec  11.9 MBytes  10.0 Mbits/sec  8562
[  5]  10.00-20.00  sec  11.9 MBytes  10.0 Mbits/sec  8561
[  5]  20.00-30.00  sec  11.9 MBytes  10.0 Mbits/sec  8562
[  5]  30.00-40.00  sec  11.9 MBytes  10.0 Mbits/sec  8562
[  5]  40.00-50.00  sec  11.9 MBytes  10.0 Mbits/sec  8561
[  5]  50.00-60.00  sec  11.9 MBytes  10.0 Mbits/sec  8562
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Jitter    Lost/Total Datagrams
[  5]   0.00-60.00  sec  71.5 MBytes  10.0 Mbits/sec  0.000 ms  0/51370 (0%)  sender
[  5]   0.00-60.04  sec  71.5 MBytes  9.99 Mbits/sec  0.025 ms  0/51370 (0%)  receiver

iperf Done.

 

报告可以看出:

每个时间间隔为 10 秒,显示了每个间隔内的传输量、比特率(传输速率)和发送的总数据报文数;

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

总结了整个 60 秒测试期间的传输量、平均比特率、抖动(Jitter)、以及丢失的数据报文数和总发送的数据报文数。在这个示例中,传输速率保持稳定,且丢失率为 0%,表明网络连接相对稳定且传输效率良好。

Test 3 others

  • 多线程测试:使用 -P 参数进行并行测试,以模拟多用户环境

Shell
# iperf3 -c 192.168.1.3 -t 5 -P 4
Connecting to host 192.168.1.3, port 5201
[  5] local 192.168.1.1 port 18670 connected to 192.168.1.3 port 5201
[  7] local 192.168.1.1 port 59288 connected to 192.168.1.3 port 5201
[  9] local 192.168.1.1 port 22515 connected to 192.168.1.3 port 5201
[ 11] local 192.168.1.1 port 38026 connected to 192.168.1.3 port 5201
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  97.1 MBytes   814 Mbits/sec
[  7]   0.00-1.00   sec  89.7 MBytes   752 Mbits/sec
[  9]   0.00-1.00   sec  89.5 MBytes   750 Mbits/sec
[ 11]   0.00-1.00   sec  89.1 MBytes   747 Mbits/sec
[SUM]   0.00-1.00   sec   365 MBytes  3.06 Gbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[  5]   1.00-2.00   sec  76.9 MBytes   646 Mbits/sec
[  7]   1.00-2.00   sec  76.3 MBytes   640 Mbits/sec
[  9]   1.00-2.00   sec  76.1 MBytes   639 Mbits/sec
[ 11]   1.00-2.00   sec  75.8 MBytes   636 Mbits/sec
[SUM]   1.00-2.00   sec   305 MBytes  2.56 Gbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[  5]   2.00-3.00   sec  79.9 MBytes   670 Mbits/sec
[  7]   2.00-3.00   sec  78.9 MBytes   662 Mbits/sec
[  9]   2.00-3.00   sec  79.5 MBytes   667 Mbits/sec
[ 11]   2.00-3.00   sec  78.6 MBytes   659 Mbits/sec
[SUM]   2.00-3.00   sec   317 MBytes  2.66 Gbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[  5]   3.00-4.00   sec  89.7 MBytes   751 Mbits/sec
[  7]   3.00-4.00   sec  89.1 MBytes   746 Mbits/sec
[  9]   3.00-4.00   sec  88.3 MBytes   740 Mbits/sec
[ 11]   3.00-4.00   sec  89.0 MBytes   746 Mbits/sec
[SUM]   3.00-4.00   sec   356 MBytes  2.98 Gbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[  5]   4.00-5.00   sec  91.1 MBytes   765 Mbits/sec
[  7]   4.00-5.00   sec   103 MBytes   866 Mbits/sec
[  9]   4.00-5.00   sec   103 MBytes   868 Mbits/sec
[ 11]   4.00-5.00   sec   103 MBytes   861 Mbits/sec
[SUM]   4.00-5.00   sec   400 MBytes  3.36 Gbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-5.00   sec   435 MBytes   729 Mbits/sec                  sender
[  5]   0.00-5.05   sec   432 MBytes   717 Mbits/sec                  receiver
[  7]   0.00-5.00   sec   437 MBytes   733 Mbits/sec                  sender
[  7]   0.00-5.05   sec   436 MBytes   724 Mbits/sec                  receiver
[  9]   0.00-5.00   sec   437 MBytes   733 Mbits/sec                  sender
[  9]   0.00-5.05   sec   436 MBytes   723 Mbits/sec                  receiver
[ 11]   0.00-5.00   sec   435 MBytes   730 Mbits/sec                  sender
[ 11]   0.00-5.05   sec   434 MBytes   720 Mbits/sec                  receiver
[SUM]   0.00-5.00   sec  1.70 GBytes  2.92 Gbits/sec                  sender
[SUM]   0.00-5.05   sec  1.70 GBytes  2.88 Gbits/sec                  receiver

iperf Done.

 

  • 双向测试:使用 -d 参数同时测试上行和下行带宽

Shell
# iperf3 -c 192.168.1.3 -t 10 -d

...
[  5]   9.01-10.01  sec  91.3 MBytes   766 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.01  sec   885 MBytes   742 Mbits/sec                  sender
[  5]   0.00-10.05  sec   885 MBytes   739 Mbits/sec                  receiver

iperf Done.
Successfully released stream buffer at 28000000 with size 131072

 

  • 窗口大小和缓冲区调整:使用 -w 参数调整TCP窗口大小,以测试不同网络条件下的性能

Shell
iperf3 -c 192.168.1.3 -t 10 -w 256k

...
[  5]   9.02-10.00  sec  87.5 MBytes   745 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec   867 MBytes   727 Mbits/sec                  sender
[  5]   0.00-10.04  sec   867 MBytes   724 Mbits/sec                  receiver

iperf Done.
Successfully released stream buffer at 28000000 with size 131072

 

;