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
相关推荐
林林要一直努力1 小时前
AOSP Settings模块问题初窥
android·学习·bug·android studio
余大侠在劈柴4 小时前
pdf.js 开发指南:在 Web 项目中集成 PDF 预览功能
前端·javascript·学习·pdf
计算机毕设定制辅导-无忧学长6 小时前
Modbus 开发工具实战:ModScan32 与 Wireshark 抓包分析(一
网络·测试工具·wireshark
老神在在0016 小时前
SpringMVC2
java·前端·学习·spring·java-ee
老神在在0016 小时前
SpringMVC3
java·前端·学习·spring·java-ee
Pocker_Spades_A10 小时前
TextIn:文档全能助手,让学习效率飙升的良心软件~
学习·textln
我.佛.糍.粑11 小时前
Shusen Wang推荐系统学习 --召回 矩阵补充 双塔模型
人工智能·学习·机器学习·矩阵·推荐算法
好奇龙猫11 小时前
日语学习-日语知识点小记-构建基础-JLPT-N3阶段(3):语法+单词+復習
学习
今天背单词了吗98011 小时前
算法学习笔记:16.哈希算法 ——从原理到实战,涵盖 LeetCode 与考研 408 例题
笔记·学习·算法