iperf的简介

iperf是一款基于TCP/IP和UDP/IP的网络性能测试工具,它可以用来测量网络带宽和网络质量,还可以提供网络延迟抖动、数据包丢失率、最大传输单元等统计信息。它运行于服务器端、客户端模式下,其服务器端主要用于监听到达的测试请求,而客户端主要用于发起连接会话。网络管理员可以根据这些信息了解并判断网络性能问题,从而定位网络瓶颈,解决网络故障。

iperf的原理

iperf测试TCP带宽
  • 即在客户端和服务器端建立连接(三次握手)后,客户端发送一定大小的数据包,并记下发送的时间, 或者客户端在一定的时间内发送数据,并记下发送的总数据。带宽的大小等于发送的总数据除以发送的总时间。对服务器端来说,就是在连接建立时间内,接收的总数据除以所花时间即为服务器端所测得的带宽。MSS的大小通过TCP内核接口函数直接获得
    
iperf测试UDP的性能
  •  客户端可以指定UDP数据流的速率。客户端发送数据时,将根据客户端提供的速率计算数据包发送之间的延时。另外客户端还可以指定发送数据报的大小。每个发送的数据包包含一个ID号,用来惟一地标识该报文。服务器端则根据该ID号来确定数据包丢失和乱序。当把UDP报文大小设置可以将整个报文放入IP层的包(packet)内时,那么UDP所测得的报文丢失数据即为IP层包的丢失数据,这提供了一个有效的测试包丢失情况的方法。数据报传输延迟抖动 (Jitter)的测试由服务器端完成,客户发送的报文数据包含有发送时间戳,服务器端根据该时间信息和接收到报文的时间戳来计算传输延迟抖动。传输延迟抖动反映传输过程中是否平滑。由于它是一个相对值,所以并不需要客户端和服务器端时间同步
    
iperf的功能
  •  TCP
    
    • 测试网络带宽
    • 支持多线程,在客户端与服务端支持多重连接
    • 报告MSS/MTU值的大小
    • 支持TCP窗口值自定义
  • UDP
    
    • 可以设置指定带宽的UDP数据流
    • 可以测试传输延时、丢包数
    • 支持多播测试
    • 支持多线程,在客户端与服务端支持多重连接
iperf 的安装
   $ tar zxvf iperf-3.0.tar.gz
   $ cd iperf
   $ sudo ./configure;make;make install
   $ sudo ldconfig
  • 检查是否安装成功 iperf3 –v
    iperf网络性能测试工具_服务端
参数说明
  • 通用参数
    • -p, --port #,Server 端监听、Client 端连接的端口号;
    • -f, --format [KMG],报告中所用的数据单位,Kbits, Mbits, KBytes, Mbytes;
    • -i, --interval #,每次报告的间隔,单位为秒;
    • -F, --file name,测试所用文件的文件名。如果使用在 Client 端,发送该文件用作测试;如果使用在 Server 端,则是将数据写入该文件,而不是丢弃;
    • -V, --verbose,运行时输出更多细节;
    • -J, --json,运行时以 JSON 格式输出结果;
    • -logfile f,输出到文件;
    • -d, --debug,以 debug 模式输出结果;
    • -v, --version,显示版本信息并退出;
    • -h, --help,显示帮助信息并退出。
  • Server 端参数:
    • -s, --server,以 Server 模式运行;
    • -D, --daemon,在后台以守护进程运行;
    • -I, --pidfile file,指定 pid 文件;
    • -1, --one-off,只接受 1 次来自 Client 端的测试,然后退出。
  • Client 端参数
    • -c, --client ,以 Client 模式运行,并指定 Server 端的地址
    • -u, --udp,以 UDP 协议进行测试
    • -b, --bandwidth #[KMG][/#],限制测试带宽。UDP 默认为 1Mbit/秒,TCP 默认无限制
    • -t, --time #,以时间为测试结束条件进行测试,默认为 10 秒
    • -n, --bytes #[KMG],以数据传输大小为测试结束条件进行测试
    • -k, --blockcount #[KMG],以传输数据包数量为测试结束条件进行测试;
    • -l, --len #[KMG],读写缓冲区的长度,TCP 默认为 128K,UDP 默认为 8K;
    • --cport ,指定 Client 端运行所使用的 TCP 或 UDP 端口,默认为临时端口;
    • -P, --parallel #,测试数据流并发数量;(多线程)
    • -R, --reverse,反向模式运行(Server 端发送,Client 端接收)
    • -w, --window #[KMG],设置套接字缓冲区大小,TCP 模式下为窗口大小;
    • -C, --congestion ,设置 TCP 拥塞控制算法(仅支持 Linux 和 FreeBSD );
    • -M, --set-mss #,设置 TCP/SCTP 最大分段长度(MSS,MTU 减 40 字节);
    • -N, --no-delay,设置 TCP/SCTP no delay,屏蔽 Nagle 算法;
    • -4, --version4,仅使用 IPv4;
    • -6, --version6,仅使用 IPv6;
    • -S, --tos N,设置 IP 服务类型(TOS,Type Of Service);
    • -L, --flowlabel N,设置 IPv6 流标签(仅支持 Linux);
    • -Z, --zerocopy,使用 “zero copy”(零拷贝)方法发送数据;
    • -O, --omit N,忽略前 n 秒的测试;
    • -T, --title str,设置每行测试结果的前缀;
    • --get-server-output,从 Server 端获取测试结果;
    • --udp-counters-64bit,在 UDP 测试包中使用 64 位计数器(防止计数器溢出)

iperf 的使用

  • 使用iperf检测网络带宽利用率
服务端 客户端
iperf3 -s iperf3 -c 172.16.124.63
iperf网络性能测试工具_数据_02 iperf网络性能测试工具_服务器端_03

iperf默认的运行时间是10秒钟,每隔一秒钟输出一次传输状态,同时还可以看到每秒钟传输的数据量在940MB左右,刚好与“bitrate”列的值对应起来,网卡的带宽速率维持在940Mbits/sec左右,
而测试的服务器是千兆网卡,这个测试值也基本合理。在输出的最后,
iperf还给出了总的数据发送、接收量,并给出了带宽速率平均值,通过这些值,基本可以判断网络带宽是否正常,网络传输状态是否稳定

  • iperf客户端通过“-t”’-i’,指定传输的总时间,每次报告的之间的时间间隔
    iperf网络性能测试工具_服务器端_04

可以看出,输出状态的间隔变为每5秒钟一次,总共执行测试时间为20秒,测试的带宽速率仍然保持在940Mbits/sec左右

  • "-p","-w"指定端口监听,设置tcp窗口大小,一般可以不用设置,默认即可
    iperf网络性能测试工具_服务端_05

不设置端口,默认端口号为5201

  • iperf客户端通过“-n”参数指定要传输的数据量
    iperf网络性能测试工具_服务端_06

  • 有时候,为了模拟更真实的TCP应用,iperf客户端允许从一个特定的文件发送数据,这可以通过“-F”参数实现
    iperf网络性能测试工具_服务器端_07

  • 测试UDP丢包和延迟

    • iperf也可以用于UDP数据包吞吐量、丢包率和延迟指标,但是由于UDP协议是一个非面向连接的轻量级传输协议,并且不提供可靠的数据传输服务,因此对UDP应用的关注点不是传输数据有多快,而是它的丢包率和延时指标。通过iperf的“-u”参数即可测试UDP应用的传输性能
客户端 服务端
iperf网络性能测试工具_服务端_08 iperf网络性能测试工具_多线程_09
  • 增加参数 –b 指定带宽,-n 指定传输的数据量
    iperf网络性能测试工具_服务器端_10
  • -P 参数设置多线程测试
    iperf网络性能测试工具_客户端_11