服务器网络吞吐量如何测试?iperf3部署与测试结果分析

买服务器时,带宽参数写得明明白白:内网 1Gbps、公网 10Mbps。但你有没有想过,这条链路实际能跑多少?标称值只是理论上限,真实吞吐受网卡速率、交换机、CPU 处理能力、链路拥塞、跨境路由等一堆因素影响。很多"网络慢"的故障,最后定位到的是带宽跑不满、丢包重传,而不是应用本身。

这篇文章讲清楚服务器网络吞吐量怎么测。内容包括:为什么要单独测网络、iperf3 怎么在两套发行版上部署、服务端和客户端命令怎么写、-P/-t/-R/-u 这些参数什么意思、测出来的带宽/重传/丢包怎么看、以及有哪些容易踩的坑。文中带宽数字为经验量级,实际受硬件和链路影响,以你实测为准。

一、为什么要单独测网络吞吐

1. 标称带宽不等于实际可用

  • 单位换算的误导:1Gbps 换算成字节是约 125MB/s(1 字节 8 比特),加上协议开销,实测能到 110~118MB/s 就算不错。很多人在 100Mbps 口上期待 100MB/s,这是量级错误。
  • 端口速率是上限:千兆网卡上限 1Gbps(约 940Mbps 实测、125MB/s 左右),万兆口上限 10Gbps。
  • 全双工与否:老式误配成半双工会让吞吐腰斩。

2. 内网带宽和公网带宽是两回事

云服务器的"内网带宽"通常很高(千兆或万兆),用于同机房互通;"公网带宽"才是你买的那几 Mbps,用于进出互联网。测的时候要分清测的是哪条链路。

3. 吞吐直接决定业务体验

文件下载、视频、图片站、大文件同步、备份、跨机房复制,这些业务的瓶颈往往是带宽而不是 CPU 或磁盘。测出真实吞吐,才能判断该不该升带宽、该不该换线路。

二、iperf3 部署

iperf3 是被测机和测试机都要装的工具,通常一台做服务端、一台做客户端。

# RHEL / CentOS / Rocky / AlmaLinux(iperf3 在 EPEL)
sudo dnf install -y epel-release
sudo dnf install -y iperf3
# 老版本 CentOS 7
sudo yum install -y epel-release && sudo yum install -y iperf3

# Debian / Ubuntu
sudo apt update && sudo apt install -y iperf3

装完用 iperf3 -v 确认版本一致,两端版本差异过大有时会握手异常。iperf3 默认使用 TCP 5201 端口。如果服务端有防火墙,需要放行:

# firewalld(RHEL 系)
sudo firewall-cmd --add-port=5201/tcp --permanent
sudo firewall-cmd --reload
# 仅建议在测试期间临时放行;测试完可移除:
# sudo firewall-cmd --remove-port=5201/tcp --permanent && sudo firewall-cmd --reload

# ufw(Ubuntu)
sudo ufw allow 5201/tcp
# 回滚:sudo ufw delete allow 5201/tcp

风险提示:放行端口意味着该端口对网络开放,测试环境之外请限定来源 IP,或测试完立即收回。

三、服务端与客户端命令

服务端:一条命令即可

在被测机上启动服务端:

# 前台启动,默认监听 5201
iperf3 -s

# 指定端口和绑定地址
iperf3 -s -p 5201 -B 0.0.0.0

客户端:常用参数组合

# 基础:测试到服务端的 TCP 吞吐
iperf3 -c 10.0.0.2

# 并发 4 条流,跑 30 秒
iperf3 -c 10.0.0.2 -P 4 -t 30

# 反向测试(服务器发、客户端收),用于测下行
iperf3 -c 10.0.0.2 -R -t 30

# UDP 测试,指定目标带宽多少 Mbps,看丢包和抖动
iperf3 -c 10.0.0.2 -u -b 100M -t 30

# 每 1 秒输出一次明细
iperf3 -c 10.0.0.2 -P 4 -t 30 -i 1

参数含义:

参数 作用
-c 客户端模式,指定服务端 IP
-s 服务端模式
-P 并发流数量,默认 1
-t 测试时长(秒)
-R 反向,服务端发客户端收
-u 使用 UDP(配合 -b 指定带宽)
-b 目标带宽,如 100M、1G
-i 输出间隔

四、结果解读

TCP 测试的典型输出:

[ ID] Interval           Transfer     Bitrate         Retr
[SUM]   0.00-30.00  sec  3.35 GBytes   959 Mbits/sec   12   sender
[SUM]   0.00-30.00  sec  3.35 GBytes   959 Mbits/sec       receiver

重点看三处:

  • Bitrate:实测吞吐。跟标称带宽对比——千兆口跑到 940Mbps 左右、万兆口跑到 9.4Gbps 左右,就说明链路基本跑满,属正常。
  • Retr(重传):TCP 重传次数。为 0 或个位数量级正常;上万甚至更多,说明链路有丢包或拥塞,实际有效吞吐会打折。
  • sender / receiver 两行是否一致:差距大说明收发不平衡,可能有丢包或缓冲问题。

UDP 测试的典型输出:

[SUM]   0.00-30.00  sec   357 MBytes   100 Mbits/sec   0.031 ms  0/254444 (0%)

UDP 会多出 Jitter(抖动) 和 丢包率(Lost/Total)。抖动大、丢包高,说明链路不稳定,对实时类业务(语音、视频、游戏)影响大。UDP 不是可靠传输,可以简单理解为:你让它发 100M,它照发,丢不丢看链路。

五、对照标称带宽

把实测和标称放一起判断:

实测/标称 判断 常见原因
≥ 90% 正常,链路跑满 无
60%~90% 基本正常,偏弱 单流受限、CPU 或中断不够
30%~60% 偏低需排查 并发不足、网卡协商异常、有重传
< 30% 明显异常 链路问题、限速、误配、跨境拥塞

几个经验值参考:

  • 千兆网卡实测约 940Mbps,万兆约 9.4Gbps,属于理想状态。
  • 云服务器公网带宽若买 5Mbps,实测能稳定跑到 5Mbps 上下就算达标,跑不满要查是否被限速或有丢包。
  • 跨境链路受路由影响大,白天和晚高峰差别可能很明显,测试时间点要覆盖业务高峰。

六、注意事项:别让测试机自己成瓶颈

这是最容易被忽略的一点:iperf3 跑满高带宽本身很吃 CPU 和中断。

  1. 单流跑不满不一定是链路问题。TCP 单流受窗口、RTT 限制,长肥管道(高带宽高延迟)上单流很难跑满。加大 -P 并发往往就能上去,说明是单流限制而非链路。
  2. 两端 CPU 要够。万兆口跑满时,单核可能被打满,%soft(软中断)飙高。可以在两端用 top 看 sy、si 占用,必要时启用多队列、调整网卡中断亲和性。
  3. 网卡速率要确认。用 ethtool 看协商结果:
ethtool eth0 | grep -i speed
# 输出 Speed: 10000Mb/s 表示万兆
  1. 两端网卡速率要对等。一端千兆一端万兆,实际按千兆走。
  2. 磁盘不要参与。iperf3 测的是网络,不落盘,但别同时跑磁盘压测干扰。
  3. 测完关掉服务端。iperf3 -s 长开无必要,测完 Ctrl+C 或 kill 掉,避免端口长期暴露。
  4. 多测几轮取稳定值。网络抖动大,单次结果不可靠,跑 3 轮以上看是否稳定。

七、按场景组织测试

不同的测试目的,方案不一样,别一套参数测所有情况。

测内网带宽:两台同机房机器互测,直接 iperf3 -c,一般能跑到网卡速率附近。这是验证交换机、网卡、链路是否正常的基线。

测公网/跨境链路:选业务高峰时段,用 -P 多流测,并配合 -R 对比去程和回程。跨境链路去回程差异可能很大,单看一个方向会误判。

测 UDP 承载质量:语音、视频、游戏类业务跑 UDP,可以用 -u -b 从小带宽往上加,观察丢包和抖动随带宽上升的变化,找到"开始明显丢包"的临界点,这个点就是该链路对 UDP 的实际可用带宽。

测长连接稳定性:用 -t 300(跑 5 分钟)或更长,看 Bitrate 是否随时间衰减、Retr 是否累积上升。短测正常、长测劣化,往往说明中间设备有流控或拥塞。

测多机聚合:一台客户端打不满时,用多台客户端同时打同一个服务端,或服务端开多个实例分别压,验证是单机瓶颈还是链路瓶颈。

# 长时稳定性测试:跑 5 分钟,每秒输出,观察是否衰减
iperf3 -c 10.0.0.2 -P 4 -t 300 -i 1

# 打印 JSON 结果,便于脚本化采集和对比
iperf3 -c 10.0.0.2 -P 4 -t 30 --json > iperf_result.json

用 --json 输出后,可以把多轮结果存下来做趋势对比,比肉眼看数字靠谱。

八、把测试结果和业务对上

测出吞吐只是第一步,还要回答"这对业务够不够"。简单换算:

  • 单请求平均响应体大小 × QPS = 所需带宽。比如接口平均返回 100KB、QPS 500,那大约需要 500 × 100KB = 50MB/s ≈ 400Mbps。
  • 文件下载站按"并发下载数 × 单用户限速"估总带宽。
  • 备份、跨机房复制按"数据量 ÷ 允许时长"估所需带宽。

如果实测吞吐远高于业务需求,说明带宽不是当前瓶颈,可以把精力放在 CPU 或磁盘上;如果实测吞吐已经贴着业务峰值,就该规划升带宽或加线路了。

常见问题

Q1:iperf3 和 speedtest 有什么区别?
iperf3 点对点测两台机器之间的吞吐,适合内网、专线、机房间测;speedtest 测到你所在地到测速服务器的公网带宽。目的不同,iperf3 更可控、更适合排查。

Q2:为什么 -P 1 跑不满,-P 4 就上去了?
单条 TCP 流受窗口和 RTT 限制,高延迟链路上单流吞吐有上限。加并发流能填满带宽,说明瓶颈在单流,不是链路本身。

Q3:Retr 很高说明什么?
说明有丢包触发重传,实际有效吞吐会下降。检查链路质量、交换机、是否拥塞,跨境链路晚高峰尤其常见。

Q4:UDP 测试丢包很高正常吗?
要看你设的带宽。如果 -b 设得超过链路实际能力,丢包是必然的。适当降低 -b 再看,若仍大量丢包则是链路问题。

Q5:内网测试很快,公网很慢,怎么回事?
内网走机房交换机,公网走运营商链路,二者独立。公网慢一般和购买带宽、出口拥塞、跨境路由有关,需要分别评估。

总结

  • 网络吞吐要单独测,标称带宽是上限不是承诺,千兆实测约 940Mbps、万兆约 9.4Gbps(经验值)。
  • iperf3 两端都装:RHEL 系 dnf/yum install iperf3(需 EPEL),Debian/Ubuntu apt install iperf3。
  • 服务端 iperf3 -s,客户端 iperf3 -c,用 -P 加并发、-t 定时长、-R 测反向、-u -b 测 UDP。
  • 解读看 Bitrate(吞吐)、Retr(重传)、Jitter 和丢包;和标称带宽对比,跑满 90% 以上算正常。
  • 别让测试机自己成瓶颈:确认网卡速率、两端 CPU 够用、必要时加并发流、多测几轮,测完收好端口。