Skip to content

网络测速 (iperf3)

专业的网络带宽测试工具,支持 TCP/UDP 测试,可测量吞吐量、抖动、丢包率等关键指标。iperf3 下载地址

speedtest-cli

使用 speedtest-cli 快速测速

shell
# 方式一:全局安装
# 使用 yum 从 EPEL 仓库安装 speedtest-cli。
yum install speedtest-cli
# 安装完成后,运行 speedtest-cli 命令测试网络速度(耐心等待,一般需要两三分钟)
speedtest-cli

# 方式二:非全局安装(使用 git 拉取源码)
# 安装 git(如已安装忽略该命令)
yum install git
# 克隆 speedtest-cli 仓库到本地
git clone https://github.com/sivel/speedtest-cli.git
# 进入 speedtest-cli 目录
cd speedtest-cli
# 运行 speedtest-cli 脚本进行测试(耐心等待,一般需要两三分钟)
./speedtest.py

iperf3

测试服务端与客户端带宽,注意参数区分大小写

主要测量指标

  1. 带宽 (Bandwidth):
    1. 最核心的指标,指网络路径上数据传输的速率。
    2. 单位:iperf3 默认报告bps
      • bps (bits per second)
      • Kbps (Kilobits per second)
      • Mbps (Megabits per second)
      • Gbps (Gigabits per second)
    3. 类型:
      • 单向带宽 (Sender to Receiver): 客户端到服务器或服务器到客户端的传输速率(取决于测试模式)。
      • 双向带宽 (Bi-directional): 同时测量两个方向的总带宽(使用 -d 或 -w 参数)。
    4. 报告形式: 发送端带宽 (客户端输出) 和 接收端带宽 (服务器输出)。对于理想 TCP 测试,两者应非常接近。UDP 测试中接收端带宽更关键(反映实际送达的速率)。
  2. 抖动(Jitter):
    1. 指连续数据包到达时间间隔的变化程度。对于实时应用(如 VoIP, 视频会议)至关重要。
    2. 计算方式: iperf3 计算包到达时间间隔与理论间隔的差值。
    3. 单位: 毫秒 (ms)。值越低越好。
  3. 丢包率 (Packet Loss):
    1. 在传输过程中丢失的数据包占总发送包数的百分比。主要出现在 UDP 测试或拥塞严重的 TCP 测试中。TCP 本身会重传丢失包,但重传会显著降低有效带宽。
    2. 报告形式:对于 UDP 测试,在客户端和服务器报告中有 % Lost 的显示。对于 TCP,iperf3 的默认报告不直接显示丢包率,但可以通过重传次数(Retr)间接推断拥塞情况(-i 报告间隔显示更直观)。
  4. 往返时间 (RTT):
    1. 数据包从发送方发出到收到接收方确认的总时间。
    2. 在 iperf3 报告中的体现:
      • TCP 测试: iperf3 会报告一个加权平均值 RTT(在客户端报告的连接细节部分)。
      • UDP 测试: 不会直接报告 RTT。
    3. 单位: 毫秒 (ms)。
  5. 缓冲区大小/窗口大小 (Buffer/Window Size):
    1. 影响 TCP 吞吐量的关键参数。iperf3 客户端会报告测试中使用的 Receiver Window Size(由操作系统和可能的手动设置 -w 决定)。优化窗口大小对于长距离高带宽链路非常重要。

服务端与客户端通用参数

参数功能说明示例
-p指定端口号-p 5201
-f设置报告单位(k/K/m/M)-f K(KBytes)
-i报告间隔时间(秒)-i 1
-t测试时长(秒)-t 10
-u使用UDP协议-u -b 100M
-b[K M G]:测试指定目标带宽(UDP必填)-b 100M-b 1G
-P多线程,使用并行流 (多个 TCP 连接)。-P 4
-w[K M]: 设置 TCP 窗口大小/套接字缓冲区大小-w 256K, -w 2M
-B绑定指定网卡-B eth0
-JJSON格式输出-J > result.json

服务端专用参数

参数功能说明
-s启动服务端模式
-D后台守护进程运行
-1仅接受1次测试后退出
-I指定PID文件路径

客户端专用参数

参数功能说明示例
-c以客户端模式运行,指定服务器IP-c 192.168.1.1
-R反转模式。
默认客户端发送数据到服务器。
客户端变成接收者,服务器变成发送者。
用于测试反向带宽。
-n指定传输数据量-n 1G
-l设置缓冲区大小-l 64K
-C兼容旧版本协议

常用测试命令

sh
# 服务端
iperf3 -s -p 5201

# 客户端
iperf3 -c 192.168.1.1 -t 10 -i 1				# 基础TCP带宽测试
iperf3 -u -c 192.168.1.1 -b 200M -t 20 -l 128K	 # UDP丢包测试
iperf3 -c 192.168.1.1 -P 8 -t 30 -w 1M			# 多线程吞吐测试
iperf3 -c 192.168.1.1 -R -t 10					# 反向测试(服务端发送)
sh
# TCP 示例
# 客户端发送
[root@iZbp19gu5sf48pg1v9ehcrZ ~]# iperf3 -c 192.168.196.176 -i 1 -t 5 -p 8080 -f M
Connecting to host 192.168.196.176, port 8080
[  4] local 192.168.196.122 port 34068 connected to 192.168.196.176 port 8080
[ ID] Interval           Transfer     Bandwidth       Retr  Cwnd
[  4]   0.00-1.00   sec  1.90 MBytes  1.90 MBytes/sec    2    118 KBytes       
[  4]   1.00-2.00   sec  2.29 MBytes  2.29 MBytes/sec    0    142 KBytes       
[  4]   2.00-3.00   sec  2.72 MBytes  2.72 MBytes/sec    0    166 KBytes       
[  4]   3.00-4.00   sec  2.26 MBytes  2.26 MBytes/sec    4    107 KBytes       
[  4]   4.00-5.00   sec  2.53 MBytes  2.53 MBytes/sec    0    137 KBytes       
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-5.00   sec  11.7 MBytes  2.34 MBytes/sec    6             sender
[  4]   0.00-5.00   sec  11.2 MBytes  2.25 MBytes/sec                  receiver

iperf Done.

# 服务端发送(反向)
[root@iZbp19gu5sf48pg1v9ehcrZ ~]# iperf3 -c 192.168.196.176 -i 1 -t 5 -p 8080 -f M -R
Connecting to host 192.168.196.176, port 8080
Reverse mode, remote host 192.168.196.176 is sending
[  4] local 192.168.196.122 port 34094 connected to 192.168.196.176 port 8080
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-1.00   sec  2.03 MBytes  2.03 MBytes/sec                  
[  4]   1.00-2.00   sec  2.79 MBytes  2.79 MBytes/sec                  
[  4]   2.00-3.00   sec  3.57 MBytes  3.57 MBytes/sec                  
[  4]   3.00-4.00   sec  3.24 MBytes  3.24 MBytes/sec                  
[  4]   4.00-5.00   sec  3.06 MBytes  3.06 MBytes/sec                  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth
[  4]   0.00-5.00   sec  14.9 MBytes  2.97 MBytes/sec                  sender
[  4]   0.00-5.00   sec  14.9 MBytes  2.97 MBytes/sec                  receiver

iperf Done.


# 输出解释
ID: 线程标识符,多线程测试时区分不同数据流
Interval: 测试时间范围(1.00-2.00   sec代表1到2秒之间)
Transfer: 时间范围内传输的数据总量(单位GBytes或MBytes) 2.62 MBytes = 2.62 MB (1 MB = 1,048,576 字节)
Bandwidth: 核心性能指标,时间范围的平均带宽(Mbits/sec)  21.9 Mbits/sec ÷ 8 2.74 MB/s)
Retr: 关键指标,重传数据包数量;0代表TCP该时段没有重传,网络良好;非零代表可能存在网络阻塞或丢包
Cwnd: TCP拥塞窗口大小;动态调整以优化吞吐量;窗口越大,允许未确认的数据包越多,带宽利用率通常越高(单位通常是 KBytes)
- - - - - - - - - - - - - - - - - - - - - - - - -
sender: 发送者
receiver: 接收者

TCP 测试总结

  1. 发送者
    • Transfer: 发送端在整个测试期间发送的总数据量。
    • Bitrate: 发送端的平均发送速率
    • Retr: 整个测试期间的总重传次数。这是判断测试过程中是否存在丢包(导致重传)的关键指标。
  2. 接受者
    • Transfer: 接收端确认收到的总数据量 (应与发送端的 Transfer 非常接近)。
    • Bitrate: 接收端的平均接收速率。这是测得的有效网络吞吐量 (Available Bandwidth)。它可能略低于发送端速率(协议开销、接收端处理能力)。
sh
# UDP 示例
# 客户端发送
[root@iZbp19gu5sf48pg1v9ehcrZ ~]# iperf3 -c 192.168.196.176 -i 1 -t 5 -p 8080 -f M -u -b 1M 
Connecting to host 192.168.196.176, port 8080
[  4] local 192.168.196.122 port 37181 connected to 192.168.196.176 port 8080
[ ID] Interval           Transfer     Bandwidth       Total Datagrams
[  4]   0.00-1.00   sec   110 KBytes  0.11 MBytes/sec  41  
[  4]   1.00-2.00   sec   123 KBytes  0.12 MBytes/sec  46  
[  4]   2.00-3.00   sec   121 KBytes  0.12 MBytes/sec  45  
[  4]   3.00-4.00   sec   123 KBytes  0.12 MBytes/sec  46  
[  4]   4.00-5.00   sec   121 KBytes  0.12 MBytes/sec  45  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-5.00   sec   598 KBytes  0.12 MBytes/sec  1.259 ms  1/223 (0.45%)  
[  4] Sent 223 datagrams
iperf Done.

# 服务端发送(反向)
[root@iZbp19gu5sf48pg1v9ehcrZ ~]# iperf3 -c 192.168.196.176 -i 1 -t 5 -p 8080 -f M -u -b 1M -R
Connecting to host 192.168.196.176, port 8080
Reverse mode, remote host 192.168.196.176 is sending
[  4] local 192.168.196.122 port 59237 connected to 192.168.196.176 port 8080
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-1.00   sec   123 KBytes  0.12 MBytes/sec  6026573535.603 ms  0/46 (0%)  
[  4]   1.00-2.00   sec   123 KBytes  0.12 MBytes/sec  309563099.045 ms  0/46 (0%)  
[  4]   2.00-3.00   sec   121 KBytes  0.12 MBytes/sec  16961209.135 ms  0/45 (0%)  
[  4]   3.00-4.00   sec   123 KBytes  0.12 MBytes/sec  871241.936 ms  0/46 (0%)  
[  4]   4.00-5.00   sec   121 KBytes  0.12 MBytes/sec  47740.318 ms  0/45 (0%)  
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  4]   0.00-5.00   sec   615 KBytes  0.12 MBytes/sec  44756.851 ms  0/229 (0%)  
[  4] Sent 229 datagrams

iperf Done.


# 输出解释
ID: 线程标识符,多线程测试时区分不同数据流
Interval: 测试时间范围(1.00-2.00   sec代表1到2秒之间)
Transfer: 时间范围内传输的数据总量(单位GBytes或MBytes) 2.62 MBytes = 2.62 MB (1 MB = 1,048,576 字节)
Bandwidth:核心性能指标,时间范围的平均带宽(Mbits/sec)  21.9 Mbits/sec ÷ 8 ≈ 2.74 MB/s)
Jitter: 整个测试期间的平均抖动 (ms)。
Total Datagrams:该间隔内发送的数据包数量。
Lost/Total Datagrams: 总丢失的数据包数量 / 总预期收到的数据包数量 (来自 -b 参数的速率和间隔)。以及丢包百分比 (% Lost)。这是 UDP 测试的核心可靠性指标。

UDP 测试总结

  1. 发送端
    • 报告发送的总数据量、发送端的平均发送速率 (Bitrate)、总发送的数据包数量 (Datagrams)。没有抖动和丢包统计 (发送端不知道接收情况)。
  2. 接收端(关键)
    • Transfer: 接收端实际收到的总数据量。
    • Bitrate: 接收端的平均有效接收速率 (实际可用带宽)。
    • Jitter: 整个测试期间的平均抖动 (ms)。
    • Lost/Total Datagrams: 总丢失的数据包数量 / 总预期收到的数据包数量 (来自 -b 参数的速率和间隔)。以及丢包百分比 (% Lost)。这是 UDP 测试的核心可靠性指标。

常见问题与技巧

  1. 连接失败 (Connection refused):
    • 服务器未运行:检查服务器端 iperf3 -s 是否已启动。
    • 端口错误:检查 -p 参数是否在两端指定且一致。
    • 防火墙阻止:最常见原因! 检查服务器端和沿途设备的防火墙规则,确保允许流量通过 iperf3 使用的端口 (TCP 5201 或自定义的,UDP 测试也需对应规则)。
    • 服务器地址错误。
  2. 带宽低于预期 (TCP):
    • 重传 (Retr > 0): 排查拥塞(使用 -t 延长测试时间观察)、物理链路问题(光纤/网线/SFP模块)、设备(交换机/防火墙/路由器)性能瓶颈(CPU、队列、ACL)、缓冲区过小(尝试增大 -w 如 -w 2M,尤其是在长距离高带宽链路)。
    • 拥塞窗口限制:对于长距离(高延迟)链路,默认 TCP 窗口可能太小(参考 Cwnd 值)。使用 -w 增大窗口大小(需要同时调大操作系统 TCP 缓冲区 net.core.rmem_max/wmem_max)。
    • 拥塞控制算法:尝试不同的算法 -C bbr (需内核支持)。
    • CPU 瓶颈:检查客户端或服务器端 CPU 是否满载(使用 top, htop 等工具)。
    • 路径中间设备限制:防火墙策略、QoS 限速、较低端交换机的背板带宽限制。
    • 网卡协商速率:检查 ethtool <接口> 确认协商速率是期望值 (1Gbps/10Gbps)。
    • 跨物理设备/交换机测试性能:不同端口速率、交换机交换能力、VLAN 配置都可能有影响。
    • 并行流:尝试使用 -P 4 或 -P 8 启动多个并发流。
  3. 带宽低于预期 (UDP):
    • 查看接收端报告的丢包率和带宽。
    • 如果丢包率高 (% Lost),说明网络无法承载 -b 指定的发送速率。降低 -b 值。
    • 同样排查网络拥塞、设备性能、CPU 瓶颈。
  4. Windows 防火墙: Windows 防火墙默认阻止入站 iperf3。运行服务器端时需添加入站规则允许 iperf3.exe 或指定端口。
  5. 连接重置 (Connection reset by peer): 服务器或中间设备(如防火墙)提前关闭了连接。尝试使用 -t 缩短测试时间,检查防火墙超时设置。
  6. 获取服务器报告: 客户端测试完成后,服务器会输出报告。若想让服务器将报告保存到文件,使用 --logfile <filename> 参数启动服务器 (iperf3 -s --logfile ~/iperf.log)。
  7. 使用 JSON 输出: 使用 -J 参数可以让客户端输出 JSON 格式报告,便于其他程序解析和可视化 (iperf3 -c <server> -J > result.json)。
  8. 可视化工具: iperf3 本身是命令行工具。第三方工具如 jperf (图形前端), gperftools (可配合图形化), Flent (更复杂的网络测试套件,集成 iperf3) 可以帮助可视化结果和运行自动化测试。
  9. 测试双向带宽: 使用 -d (双向同时) 或 -R (先测一个方向,再自动反转测试另一个方向)。
  10. 避免对生产网络的冲击: iperf3 设计用于压测,会占满带宽。务必在维护窗口或非关键业务网络中进行测试。UDP 测试尤其要注意,无节制的发送可能导致网络拥塞。