iperf3 网络带宽测试工具学习

一、iperf3 介绍

perf 工具系列执行主动测量,以确定 IP 网络上的最大可实现带宽。它支持调整与时间、协议和缓冲区相关的各种参数。对于每个测试,它报告测量的吞吐量、丢包和其他参数。

此版本有时被称为 iperf3,是对最初在 NLANR / DAST 开发的原始版本的重新设计。iperf3 是从头开始的新实现,目标是更小、更简单的代码库,以及可在其他程序中使用的功能库版本。iperf3 还集成了其他工具(如 nuttcp 和 netperf)中发现的一些功能,但原始 iperf 中缺少这些功能。例如,包括零拷贝模式和可选的 JSON 输出。请注意,iperf3 与原始 iperf 不向后兼容。

iperf3 的主要开发在 CentOS Linux、FreeBSD 和 macOS 上进行。目前,这些是唯一官方支持的平台,但也有一些关于 OpenBSD、Android 和其他 Linux 发行版的成功报告。

iperf3 官网地址: https://iperf.fr/

iperf3 软件包下载地址:http://software.es.net/iperf/index.html#

https://downloads.es.net/pub/iperf/

iperf3 手册地址:https://iperf.fr/iperf-doc.php

iperf3 github地址:https://github.com/esnet/iperf

二、iperf3 安装

本次实验使用centos7.9来完成实验

2.1. 使用yum仓库安装

使用yum仓库安装 iperf3 目前版本为 3.1.7

clike 复制代码
[root@localhost ~]# yum -y install iperf3

2.2. 使用 源代码编译安装

clike 复制代码
[root@localhost ~]# cd /opt/; curl -O https://downloads.es.net/pub/iperf/iperf-3.19.tar.gz
[root@localhost opt]# tar -zxvf iperf-3.19.tar.gz
[root@localhost opt]# cd iperf-3.19
[root@localhost iperf-3.19]# ./configure; make; make install
[root@localhost ~]# iperf3 -v
iperf 3.19 (cJSON 1.7.15)
Linux localhost.localdomain 3.10.0-1160.el7.x86_64 #1 SMP Mon Oct 19 16:18:59 UTC 2020 x86_64
Optional features available: CPU affinity setting, IPv6 flow label, TCP congestion algorithm setting, sendfile / zerocopy, socket pacing, bind to device, support IPv4 don't fragment, POSIX threads

三、iperf3 参数使用学习

clike 复制代码
服务端与客户端通用:
  -p, --port      #         服务器监听/客户端连接的端口
  -f, --format   [kmgtKMGT] 格式化输出单位: Kbits, Mbits, Gbits, Tbits
  -i, --interval  #         定期吞吐量报告之间的间隔时间(默认1秒)
  -I, --pidfile file        写入 PID 文件
  -F, --file name           发送/接收指定的文件
  -A, --affinity n[,m]      绑定到指定cpu
  -B, --bind <host>[%<dev>] 绑定到本机的指定地址
      --bind-dev <dev>      绑定到本机的接口
  -V, --verbose             more detailed output
  -J, --json                以 JSON 格式输出
  --json-stream             以行分隔的 JSON 格式输出
  --logfile f               将输出发送至日志文件中
  --forceflush              每隔一定时间强制刷新输出内容
  --timestamps<=format>     在每条输出行的开头附上一个时间戳,例如:iperf3 -c 192.168.1.100 --timestamps="%F %T.%3N"                           
  --rcv-timeout #           用于设置接收数据的空闲超时时间。如果在指定的时间内没有接收到任何数据,iperf3 将认为连接已超时并终止测试,默认值为 120000 毫秒(即 120 秒)
  --snd-timeout #           用于设置发送数据的超时时间。如果在指定的时间内无法发送数据,iperf3 将认为发送操作失败并终止测试。默认值为 无超时。    
  --cntl-ka[=#/#/#]         使用控制连接 TCP 保持连接功能 - KEEPIDLE/KEEPINTV/KEEPCNT每个值均为可选项,具体设置依据系统默认值。
  -d, --debug[=#]           输出调试信息
                            (可选可选"="以及调试级别:1 至 4。默认值为 4 - 所有消息。)
  -v, --version             显示版本信息并退出
  -h, --help                显示此消息并退出
服务端命令:
  -s, --server              以服务器模式运行
  -D, --daemon              将服务器设置为守护进程运行状态
  -1, --one-off             处理一个客户端连接后退出
  --server-bitrate-limit #[KMG][/#]   是 iperf3 服务端专用的限速参数,用来给整个 iperf3 服务器进程设置一个"全局出口带宽上限;例如:iperf3 -s --server-bitrate-limit 100M
  --idle-timeout #         服务端空闲多少秒无连接即自动退出
客户端命令:
  -c, --client <host>[%<dev>] 以客户端模式运行,连接至 服务端
      --bind-dev   	          当服务端是本地时,可以连接到本地的接口		                  
  -u, --udp                 使用 UDP 而非 TCP
  --connect-timeout #       设置连接服务端的超时时间,超时自动退出
  -b, --bitrate #[KMG][/#]  限制客户端发送流量的速率(0无限制)
                           (对于 UDP 协议,默认速率为 1 兆比特每秒;对于 TCP 协议,则无限制)
						   (对于突发模式,可选择添加斜杠和数据包数量)
						   例如:iperf3 -c 192.168.1.100 -b 1G/4 -P 4  一次性开 4 条并发 TCP 流 同时跑,每条流跑 250 Mbit/s。
  --pacing-timer #[KMG]     设置客户端发送的速率,单位为微秒,1000微秒等于 1秒(默认值为 1000)
  --fq-rate #[KMG]          实现基于公平排队的套接字速率控制功能(仅限linux系统)
  -t, --time      #         设置 iperf3 测试的持续时间(单位:秒)。测试会在指定时间后自动结束。如果未指定 -t,默认测试时间为 10 秒。
  -n, --bytes     #[KMG]    指定 iperf3 测试时需要传输的总数据量,单位可以是 字节(默认)、K(KB)、M(MB)、G ;-n 和 -t 不能同时使用,否则会报错;例如:iperf3 -c 192.168.1.100 -n 100M 传输 100 MB 数据后结束;
  -k, --blockcount #[KMG]   指定 iperf3 测试期间要发送的 "块"(block)数量。每个块的大小由 -l(--length)参数决定(默认 TCP 为 128 KB,UDP 为 8 KB)。支持 K/M/G 后缀,分别表示千、百万、十亿个块(不是 KB/MB/GB!)。测试会在发送完指定数量的块后自动结束。
  -l, --length    #[KMG]    设置 iperf3 每次发送的数据块(buffer)的大小(单位:字节,默认单位是 字节)。
                            (对于 TCP 协议,默认分配 128KB 的内存;对于 UDP 协议,默认分配 1460 字节的内存。)
  --cport         <port>    强制指定 iperf3 客户端 在测试时所使用的本地源端口(source port),默认情况下,客户端的端口由操作系统随机分配,使用 --cport 可以固定源端口,便于防火墙、NAT 或抓包分析。
  -P, --parallel  #         让 iperf3 客户端 并行启动 # 个独立线程/连接 同时向服务器打流,用来快速压满链路、测试多核/多队列网卡或高并发场景下的总带宽。默认值是 1(单线程)。
  -R, --reverse             将测试方向反转: 默认:客户端 → 服务器(上行) 加 -R:服务器 → 客户端(下行 / 下载方向)
  --bidir                   以双向模式运行。                       
  -w, --window    #[KMG]    设置 TCP 窗口大小(即 socket send/receive buffer 大小)             
  -C, --congestion <algo>   设置 TCP 拥塞控制算法(仅适用于 Linux 和 FreeBSD 系统)
  -M, --set-mss   #         设置 TCP/SCTP 最大分段大小(最大传输单元 - 40 字节)(以太网通常是 1500 - 40 = 1460 字节)
  -N, --no-delay            设置 TCP/SCTP 为无延迟模式,同时禁用Nagle 算法,让 TCP 数据包 立即发送,不再等待"小包合并"。
  -4, --version4            仅使用 IPv4
  -6, --version6            仅使用 IPv6
  -S, --tos N               set the IP type of service, 0-255.
                            The usual prefixes for octal and hex can be used,
                            i.e. 52, 064 and 0x34 all specify the same value.
  --dscp N or --dscp val    --dscp 用来给 发出的 IP 报文 设定 DSCP(Differentiated Services Code Point) 字段,共 6 bit(取值 0-63)。仅在 客户端 有效(服务端无需设置)。
  -L, --flowlabel N         设置 IPv6 流标签(仅在 Linux 系统中支持)
  -Z, --zerocopy            仅发送端生效;采用"零拷贝"的数据传输方法
  --skip-rx-copy            仅对 接收端 生效(即服务端或反向测试时的客户端);指示内核 不要把收到的数据包拷贝到用户空间,而是直接丢弃,因而可以测出 网卡 + 内核网络栈 的 真实收包极限(pps/bps),而不受用户态内存拷贝开销的干扰。
  -O, --omit N              告诉 iperf3 先跑 N 秒但 不把这段时间的统计计入最终结果,常用于 跳过 TCP 慢启动 或 测试初期的不稳定阶段,让报告只包含 "稳态" 数据。单位:秒;可以是小数,如 -O 2.5。不指定时 N = 0,即 全程都计入统计。
  -T, --title str            iperf3 客户端 的 JSON/CSV 报告 或 标准输出 的 标题/任务名 字段中,写入任意自定义字符串 str,便于区分多次测试、自动化脚本或仪表盘展示。
  --extra-data str         在 iperf3 的 JSON 输出 或 CSV 输出 中添加 自定义数据字段,用于记录额外的上下文信息或元数据。例如:iperf3 -c 192.168.1.100 -J --extra-data "Test for 1G link"
  --get-server-output      --get-server-output 是 iperf3 的一个客户端参数,用于在测试完成后,让客户端获取服务器端的测试结果。默认情况下,客户端只显示自己的测试结果,而服务器端只显示自己的测试结果。通过使用 --get-server-output 参数,客户端在打印完自己的测试结果后,还会打印服务器端的测试结果。
  --udp-counters-64bit     --udp-counters-64bit 是 iperf3 的一个客户端参数,用于在 UDP 测试数据包中使用 64 位计数器。此选项有助于防止在长时间或高比特率的 UDP 测试期间计数器溢出
  --repeating-payload       指定重复负载的大小,单位是字节(bytes)。这个参数通常用于 UDP 测试中,因为 UDP 不保证数据包的顺序和完整性,而通过设置重复负载可以更好地测试数据包的传输效率和丢包情况。
  --dont-fragment          此参数仅在 UDP 模式下有效,这个标志会告诉网络设备(如路由器)不要对发送的数据包进行分片处理。如果数据包的大小超过了网络路径中的最大传输单元(MTU),那么数据包将被丢弃,而不是被分片。

四、iperf3 演示

iperf3命令使用格式:

Usage: iperf3 [-s|-c host] [options]

iperf3 [-h|--help] [-v|--version]

测试主机:

角色 ip
server 192.168.25.188
client 192.168.25.189

测试前需要关闭防火墙!

示例、 在服务端启动iperf3,客户端连接到服务端测试

启动服务端

clike 复制代码
[root@iperf3-server ~]# iperf3 -s -B 192.168.25.188 -1 -p 8888
-----------------------------------------------------------
Server listening on 8888 (test #1)
-----------------------------------------------------------
Accepted connection from 192.168.25.189, port 42022
[  5] local 192.168.25.188 port 8888 connected to 192.168.25.189 port 42024
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-1.00   sec  3.54 GBytes  30.4 Gbits/sec                  (omitted)
[  5]   1.00-2.00   sec  4.10 GBytes  35.2 Gbits/sec                  (omitted)
[  5]   2.00-3.00   sec  4.49 GBytes  38.6 Gbits/sec                  (omitted)
[  5]   0.00-1.00   sec  4.80 GBytes  41.2 Gbits/sec
[  5]   1.00-2.00   sec  4.14 GBytes  35.5 Gbits/sec
[  5]   2.00-3.00   sec  4.23 GBytes  36.4 Gbits/sec
[  5]   3.00-4.00   sec  4.03 GBytes  34.5 Gbits/sec
[  5]   4.00-5.00   sec  4.14 GBytes  35.6 Gbits/sec
[  5]   5.00-6.00   sec  4.12 GBytes  35.4 Gbits/sec
[  5]   6.00-7.00   sec  4.55 GBytes  39.0 Gbits/sec
[  5]   7.00-8.00   sec  3.89 GBytes  33.4 Gbits/sec
[  5]   8.00-9.00   sec  4.21 GBytes  36.2 Gbits/sec
[  5]   9.00-10.00  sec  4.85 GBytes  41.7 Gbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec  43.0 GBytes  36.9 Gbits/sec                  receiver
  • -s : 启动服务端
  • -B : 绑定本地ip
  • -1:处理一个客户端连接后关闭
  • -p:指定客户端连接端口(默认是5201)
    启动客户端
clike 复制代码
[root@iperf3-client ~]# iperf3 -c 192.168.25.188 -p 8888 -O 3
Connecting to host 192.168.25.188, port 8888
[  5] local 192.168.25.189 port 42024 connected to 192.168.25.188 port 8888
[ ID] Interval           Transfer     Bitrate         Retr  Cwnd
[  5]   0.00-1.00   sec  3.54 GBytes  30.4 Gbits/sec    0   2.90 MBytes       (omitted)
[  5]   1.00-2.00   sec  4.10 GBytes  35.2 Gbits/sec    0   3.01 MBytes       (omitted)
[  5]   2.00-3.00   sec  4.49 GBytes  38.6 Gbits/sec    0   3.01 MBytes       (omitted)
[  5]   0.00-1.00   sec  4.80 GBytes  41.2 Gbits/sec    0   3.01 MBytes
[  5]   1.00-2.00   sec  4.14 GBytes  35.5 Gbits/sec    0   3.01 MBytes
[  5]   2.00-3.00   sec  4.24 GBytes  36.5 Gbits/sec    0   3.01 MBytes
[  5]   3.00-4.00   sec  4.02 GBytes  34.5 Gbits/sec    0   3.01 MBytes
[  5]   4.00-5.00   sec  4.15 GBytes  35.6 Gbits/sec    0   3.01 MBytes
[  5]   5.00-6.00   sec  4.12 GBytes  35.4 Gbits/sec    0   3.01 MBytes
[  5]   6.00-7.00   sec  4.54 GBytes  39.0 Gbits/sec    0   3.01 MBytes
[  5]   7.00-8.00   sec  3.89 GBytes  33.4 Gbits/sec    0   3.01 MBytes
[  5]   8.00-9.00   sec  4.21 GBytes  36.2 Gbits/sec    0   3.01 MBytes
[  5]   9.00-10.00  sec  4.85 GBytes  41.6 Gbits/sec    0   3.01 MBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  43.0 GBytes  36.9 Gbits/sec    0            sender
[  5]   0.00-10.00  sec  43.0 GBytes  36.9 Gbits/sec                  receiver

iperf Done.
  • -c : 指定客户端连接服务端地址
  • -p:指定服务端的端口号
  • -O:前3秒不记录

测试结果各个字段含义:
ID:测试流的 ID,这里为 5
Interval:时间间隔,表示测试的时间段。例如,0.00-1.00 sec 表示从测试开始的第 0 秒到第 1 秒。
Transfer:在该时间段内传输的数据量,单位为字节(Bytes)。例如,3.54 GBytes 表示在该时间段内传输了 3.54 GB 的数据。
Bitrate:在该时间段内的平均传输速率,单位为比特每秒(bits/sec)。例如,30.4 Gbits/sec 表示在该时间段内的平均传输速率为 30.4 Gbps。
Retr:重传次数,表示在该时间段内 TCP 连接的重传次数。这里为 0,表示没有发生重传。
Cwnd:拥塞窗口大小,单位为字节(Bytes)。例如,2.90 MBytes 表示拥塞窗口大小为 2.90 MB。

最后两行是总结,表示测试流的ID为5的测试中,测试时间是10秒,测试期间传输的总数据量为43.0 GB,平均传输带宽为 36.9 Gbps,测试期间的重传次数为 0。

sender:发送方
receiver:接收方

clike 复制代码
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-10.00  sec  43.0 GBytes  36.9 Gbits/sec    0            sender
[  5]   0.00-10.00  sec  43.0 GBytes  36.9 Gbits/sec                  receiver
相关推荐
西岸行者9 天前
学习笔记:SKILLS 能帮助更好的vibe coding
笔记·学习
悠哉悠哉愿意9 天前
【单片机学习笔记】串口、超声波、NE555的同时使用
笔记·单片机·学习
别催小唐敲代码9 天前
嵌入式学习路线
学习
毛小茛9 天前
计算机系统概论——校验码
学习
babe小鑫9 天前
大专经济信息管理专业学习数据分析的必要性
学习·数据挖掘·数据分析
winfreedoms9 天前
ROS2知识大白话
笔记·学习·ros2
在这habit之下9 天前
Linux Virtual Server(LVS)学习总结
linux·学习·lvs
我想我不够好。9 天前
2026.2.25监控学习
学习
im_AMBER9 天前
Leetcode 127 删除有序数组中的重复项 | 删除有序数组中的重复项 II
数据结构·学习·算法·leetcode
CodeJourney_J9 天前
从“Hello World“ 开始 C++
c语言·c++·学习