广告位 · 页头(后台-模块管理-新建模块后替换此区域)

iPerf3如何测试云服务器内网带宽与丢包率?

测出来的内网带宽忽高忽低,丢包率统计也让人看不懂,这种情况在云服务器上并不少见。iperf3是网络性能测试中最常用的工具之一,它本身并不复杂,但如果启动参数、端口放行、系统缓冲区或云主机规格没有配合好,很容易得到误导性的结果。本文以同VPC下的两台云服务器为对象,演示一套标准的iperf3测试流程,并说明如何从TCP吞吐和UDP丢包两个维度判断内网质量。

iPerf3如何测试云服务器内网带宽与丢包率?

iperf3安装与环境准备

测试前需要在这两台云服务器上都安装iperf3。Ubuntu和Debian可以直接使用apt安装,CentOS或RHEL需要先启用EPEL仓库。安装完成后执行iperf3 -v确认版本,建议两台机器使用相同或相近的版本,避免因为协议兼容问题导致结果无法汇总。

# Ubuntu / Debian
sudo apt update
sudo apt install -y iperf3
# CentOS / RHEL
sudo yum install -y epel-release
sudo yum install -y iperf3
# 查看版本
iperf3 -v

云服务器与本地虚拟机不同,除了操作系统自带的防火墙,还额外有安全组或网络ACL。iperf3默认监听TCP和UDP的5201端口,因此需要在控制台放行该端口。如果修改为其他端口,例如-p 5202,则要同步放行对应端口。以下命令用于在操作系统内放行流量,安全组规则仍需要在云控制台单独配置。

# Ubuntu系统防火墙放行
sudo ufw allow 5201/tcp
sudo ufw allow 5201/udp
# CentOS系统防火墙放行
sudo firewall-cmd --add-port=5201/tcp --permanent
sudo firewall-cmd --add-port=5201/udp --permanent
sudo firewall-cmd --reload

角色上,接收数据的一方运行服务端模式,发送数据的一方运行客户端模式。由于内网链路通常不对称,建议双向都测一遍,因此两台机器都需要完整安装iperf3。

TCP带宽测试与结果分析

iperf3默认使用TCP协议,适合测试内网最大吞吐量。服务端只需要运行iperf3 -s,然后客户端通过-c指定服务端内网IP。建议先做一个30秒的单线程测试,再进行4线程或8线程的并发测试。-t表示测试时长,-i表示输出间隔,-P表示并发连接数。

# 服务端启动,监听5201端口
iperf3 -s
# 如需自定义端口和刷新间隔
iperf3 -s -p 5201 -i 1
# 客户端单线程TCP测试
iperf3 -c 192.168.1.10 -t 30 -i 1
# 客户端4线程并发测试
iperf3 -c 192.168.1.10 -P 4 -t 30 -i 1

测试结束后需要同时关注客户端和服务端的输出。客户端输出中sender表示发送端统计,服务端输出中receiver表示接收端统计。正常情况下两者差距不大,如果接收端带宽明显低于发送端,可能是内核丢包、接收缓冲区不足或网络设备缓存过小。下面是一组典型输出。

[ ID] Interval           Transfer     Bandwidth       Retr
[  4]   0.00-30.00  sec  3.21 GBytes   920 Mbits/sec    12             sender
[  4]   0.00-30.00  sec  3.20 GBytes   916 Mbits/sec                  receiver

这里的920 Mbits/sec约等于115 MB/s。Retr字段表示TCP重传次数,示例中30秒内只有12次重传,属于轻微拥塞或链路抖动,不影响整体判断;如果重传数达到数百甚至上千,说明链路质量较差,需要继续排查。单线程测试容易受CPU单核性能限制,在高速内网上可能无法跑满带宽,这时多线程测试更接近真实能力。

除了正向测试,还可以使用-R参数进行反向测试,让服务端向客户端发送数据,用来评估另一方向的带宽。-d参数可以同时进行双向传输,帮助观察全双工场景下的总吞吐。

# 反向测试
iperf3 -c 192.168.1.10 -R -t 30 -i 1
# 双向同时测试
iperf3 -c 192.168.1.10 -d -t 30 -i 1

UDP丢包率测试与注意事项

UDP没有重传机制,适合评估实时传输质量,例如语音、视频或游戏数据。使用iperf3测UDP时必须指定-b带宽,否则默认只有1 Mbit/s,远低于云服务器内网能力,测出来的丢包率完全没有参考价值。通常先根据TCP测试结果确定一个略高于实际吞吐的带宽,例如TCP结果为920 Mbits/sec,可以设置-b 1G。

# 服务端开启UDP模式
iperf3 -s -u
# 客户端UDP测试,目标带宽1G,持续20秒
iperf3 -c 192.168.1.10 -u -b 1G -t 20 -i 1

UDP测试结果中需要重点看两个字段:Jitter表示抖动,Lost/Total Datagrams表示丢包数量和总包数。下面示例中抖动只有0.023毫秒,丢包率为0%,说明链路非常稳定。如果丢包率超过0.5%,尤其达到1%以上,就需要排查发送端CPU是否满载、云服务器是否有带宽突发限制、接收端网卡队列是否不足等问题。

[ ID] Interval           Transfer     Bandwidth       Jitter    Lost/Total Datagrams
[  5]   0.00-20.00  sec  2.33 GBytes  1000 Mbits/sec  0.023 ms  0/1703821 (0%)

默认UDP包长较小,高速测试时会产生大量小包,增加CPU处理开销,容易造成虚假丢包。可以适当增大包长,例如-l 1400,减少包数量,让测试更接近真实应用。下面是一个带包长参数的UDP测试命令。

# 使用1400字节UDP包进行测试
iperf3 -c 192.168.1.10 -u -b 1G -l 1400 -t 20 -i 1

判断丢包率是否正常还要结合云服务器规格。小规格突发性能实例可能存在网络突发上限,持续打满带宽后会触发限速,UDP丢包会随之升高。可以按100 M、200 M、500 M、1 G逐步提升-b参数,观察丢包从哪个速率开始出现,从而找到实际可用带宽边界。

常见问题与结果优化

如果客户端提示Connection refused或No route to host,优先检查服务端是否启动、端口是否放行。可以使用nc -zv快速验证TCP连通性。UDP测试不通时还要注意安全组是否单独放行了UDP协议,很多云平台的安全组规则需要分别设置TCP和UDP。

# 检查TCP端口连通性
nc -zv 192.168.1.10 5201

带宽测试结果波动大,常见原因是同一时间段有其他任务占用内网带宽,或者云主机CPU积分耗尽导致网络处理能力下降。可以尝试增加iperf3的TCP窗口大小,例如-w 256K,也可以调整系统内核参数提高网络缓冲区。对于高速内网,建议使用4到8线程测试,线程数过高反而会引入调度开销。

# 使用256KB窗口进行TCP测试
iperf3 -c 192.168.1.10 -w 256K -t 30 -i 1

UDP丢包但TCP正常时,不要急于怀疑云厂商。先观察发送端CPU使用率,如果top显示iperf3进程已经占满单核,说明发送速率超过CPU处理能力,可以降低-b或增加包长。对于多核服务器,可以尝试使用-P参数并行发送UDP流,但要注意每一路UDP的带宽之和不能超过物理上限。

最后给出一个简单的综合测试脚本,将TCP多线程测试和UDP丢包测试串起来执行,方便在不同时段快速复测。执行前需要将SERVER_IP替换为实际内网地址。

#!/bin/bash
SERVER_IP=192.168.1.10
echo "开始TCP 4线程测试"
iperf3 -c $SERVER_IP -P 4 -t 30 -i 1
echo "开始UDP丢包率测试"
iperf3 -c $SERVER_IP -u -b 1G -t 20 -i 1

iperf3的结果本身只是原始数据,关键在于控制变量并理解每个字段的含义。版本一致、端口放行、测试时长合理、UDP带宽明确,再加上TCP和UDP组合测试,基本就能还原云服务器内网的真实传输质量。对于偶发丢包和抖动,建议在不同时间段各测一轮,避免把瞬时波动当成稳定性能。

广告位 · 文章底部(后台-模块管理替换此区域)