一、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