Tools

带宽测试

iperf3 一个网络性能测量工具,用于测试网络带宽和吞吐量,通过客户端和服务器模式生成 TCP 和 UDP 数据流,并测量其传输速率。

安装

macOS

直接用brew安装

terminal
brew install iperf3

CentOS

如果已经启用epel源,直接安装即可

terminal
yum install iperf

FreeNAS

一个基于FreeBSD的NAS系统,系统自带

Windows

直接从https://iperf.fr/下载二进制包

terminal
C:\iperf>iperf3.exe

源码安装

https://github.com/esnet/iperf下载源码

terminal
./configure; make; make install

基本概念

TCP 窗口(TCP Window)

TCP(传输控制协议)是用于网络通信的可靠传输层协议。 TCP的工作方式超出了本文的范围。 通过发送消息并等待接收者的确认,TCP以一种可靠的方式工作。

每当两台机器相互通信时,它们中的每一个都会通知对方有关一次可以接收的字节数的信息。

换句话说,发送方在没有确认的情况下可以发送另一端的最大数据量称为窗口大小。 此TCP窗口大小有时会严重影响网络吞吐量。 让我们举个例子。

假设您要从一台计算机向另一台计算机发送500MB的数据,并且tcp窗口大小为64KB。这意味着要发送全部500MB数据,发送端必须等待800次才能收到接收方的确认。

500MB / 64KB = 800

举一反三,你可以想到如果增加Window大小来调整TCP,则可以显着提高吞吐量。

测试

服务端

terminal
iperf -s

-s参数表示该机器作为服务器

上面的命令机器上启动iperf服务器,默认情况下在端口5001上运行(默认的TCP窗口大小为64.0KB)。

客户端

terminal
MAC-➜  ~ iperf -c 192.168.248.139
------------------------------------------------------------
Client connecting to 192.168.248.139, TCP port 5001
TCP window size:  129 KByte (default)
------------------------------------------------------------
[  4] local 192.168.248.1 port 56783 connected with 192.168.248.139 port 5001
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-10.0 sec  1.56 GBytes  1.34 Gbits/sec

-c 表示客户端,后面跟的是服务端的ip,从上面可以看到我们的速度是1.34G每秒,列名含义如下:

  • Interval:数据传输的持续时间间隔。
  • Transfer:使用iperf传输的数据大小。
  • Bandwidth:这显示了数据传输的速度。

你也可以通过-p参数指定服务端的端口

terminal
# iperf -s -p 2000
------------------------------------------------------------
Server listening on TCP port 2000
TCP window size: 64.0 KByte (default)
------------------------------------------------------------

客户端也要指定相应端口,让我来多加些参数测试吧

terminal
MAC-➜  ~ iperf -c 192.168.248.139 -t 20 -p 2000 -w 40k
------------------------------------------------------------
Client connecting to 192.168.248.139, TCP port 2000
TCP window size: 39.6 KByte (WARNING: requested 39.1 KByte)
------------------------------------------------------------
[  4] local 192.168.248.1 port 63265 connected with 192.168.248.139 port 2000
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-20.0 sec  2.92 GBytes  1.25 Gbits/sec

-t 指定传输数据的时长 -p 指定连接服务器的端口 -w 将指定所需的窗口大小值。 如前所述,窗口大小调整将在一定程度上提高TCP传输速率。

你也可以使用-P进行并行传输并通过-i指定时间间隔显示统计信息:

terminal
MAC-➜  ~ iperf -c 192.168.0.104 -i 1
------------------------------------------------------------
Client connecting to 192.168.0.104, TCP port 5001
TCP window size:  161 KByte (default)
------------------------------------------------------------
[  4] local 192.168.0.105 port 62114 connected with 192.168.0.104 port 5001
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0- 1.0 sec   110 MBytes   923 Mbits/sec
[  4]  1.0- 2.0 sec   105 MBytes   884 Mbits/sec
[  4]  2.0- 3.0 sec   110 MBytes   927 Mbits/sec
[  4]  3.0- 4.0 sec   111 MBytes   928 Mbits/sec
[  4]  4.0- 5.0 sec   111 MBytes   930 Mbits/sec
[  4]  5.0- 6.0 sec   111 MBytes   932 Mbits/sec
[  4]  6.0- 7.0 sec   111 MBytes   929 Mbits/sec
[  4]  7.0- 8.0 sec   109 MBytes   913 Mbits/sec
[  4]  8.0- 9.0 sec   111 MBytes   928 Mbits/sec
[  4]  9.0-10.0 sec   110 MBytes   924 Mbits/sec
[  4]  0.0-10.0 sec  1.07 GBytes   922 Mbits/sec
您可能已经注意到,与正常的操作系统下载器相比,某些下载软件速度非常快。 其背后的主要原因是它们在“并行TCP连接”上工作。比如迅雷。
terminal
MAC-➜  ~ iperf -c 192.168.0.104  -P 20
------------------------------------------------------------
Client connecting to 192.168.0.104, TCP port 5001
TCP window size:  129 KByte (default)
------------------------------------------------------------
[ 23] local 192.168.0.105 port 62000 connected with 192.168.0.104 port 5001
[ 19] local 192.168.0.105 port 61996 connected with 192.168.0.104 port 5001
[ 15] local 192.168.0.105 port 61994 connected with 192.168.0.104 port 5001
[ 20] local 192.168.0.105 port 61997 connected with 192.168.0.104 port 5001
[ 21] local 192.168.0.105 port 61998 connected with 192.168.0.104 port 5001
[  4] local 192.168.0.105 port 61982 connected with 192.168.0.104 port 5001
[  6] local 192.168.0.105 port 61983 connected with 192.168.0.104 port 5001
[  8] local 192.168.0.105 port 61985 connected with 192.168.0.104 port 5001
[  5] local 192.168.0.105 port 61981 connected with 192.168.0.104 port 5001
[ 11] local 192.168.0.105 port 61988 connected with 192.168.0.104 port 5001
[ 10] local 192.168.0.105 port 61987 connected with 192.168.0.104 port 5001
[ 12] local 192.168.0.105 port 61989 connected with 192.168.0.104 port 5001
[ 16] local 192.168.0.105 port 61992 connected with 192.168.0.104 port 5001
[ 17] local 192.168.0.105 port 61993 connected with 192.168.0.104 port 5001
[ 13] local 192.168.0.105 port 61990 connected with 192.168.0.104 port 5001
[ 22] local 192.168.0.105 port 61999 connected with 192.168.0.104 port 5001
[ 18] local 192.168.0.105 port 61995 connected with 192.168.0.104 port 5001
[  9] local 192.168.0.105 port 61986 connected with 192.168.0.104 port 5001
[  7] local 192.168.0.105 port 61984 connected with 192.168.0.104 port 5001
[ 14] local 192.168.0.105 port 61991 connected with 192.168.0.104 port 5001
[ ID] Interval       Transfer     Bandwidth
[ 19]  0.0-10.0 sec  54.0 MBytes  45.3 Mbits/sec
[ 21]  0.0-10.0 sec  54.0 MBytes  45.3 Mbits/sec
[  6]  0.0-10.0 sec  54.0 MBytes  45.3 Mbits/sec
[  5]  0.0-10.0 sec  54.0 MBytes  45.3 Mbits/sec
[ 11]  0.0-10.0 sec  54.0 MBytes  45.3 Mbits/sec
[ 10]  0.0-10.0 sec  45.1 MBytes  37.8 Mbits/sec
[ 12]  0.0-10.0 sec  54.0 MBytes  45.3 Mbits/sec
[ 16]  0.0-10.0 sec  54.0 MBytes  45.3 Mbits/sec
[ 17]  0.0-10.0 sec  54.0 MBytes  45.3 Mbits/sec
[ 22]  0.0-10.0 sec  45.2 MBytes  37.9 Mbits/sec
[  9]  0.0-10.0 sec  51.9 MBytes  43.5 Mbits/sec
[  7]  0.0-10.0 sec  54.0 MBytes  45.3 Mbits/sec
[ 23]  0.0-10.0 sec  54.0 MBytes  45.2 Mbits/sec
[ 15]  0.0-10.0 sec  49.1 MBytes  41.1 Mbits/sec
[ 20]  0.0-10.0 sec  54.1 MBytes  45.3 Mbits/sec
[  4]  0.0-10.0 sec  53.4 MBytes  44.7 Mbits/sec
[  8]  0.0-10.0 sec  45.1 MBytes  37.8 Mbits/sec
[ 13]  0.0-10.0 sec  45.2 MBytes  37.9 Mbits/sec
[ 18]  0.0-10.0 sec  51.0 MBytes  42.7 Mbits/sec
[ 14]  0.0-10.0 sec  54.0 MBytes  45.2 Mbits/sec
[SUM]  0.0-10.0 sec  1.01 GBytes   865 Mbits/sec

在上面显示的示例中,我告诉iperf客户端在数据传输时创建与远程主机的20个并行TCP连接。 如果观察输出,您可以清楚地看到客户端上的20个不同端口已连接到服务器上的默认5001端口。 而且所有连接的传输速率都不同,最后,我们获得了865Mbits / s的组合吞吐量。

UDP

使用iperf进行UDP速度测试将为您提供有关网络的更多信息,这对于查找网络瓶颈非常有用。

影响吞吐量的不仅是TCP窗口大小,还有以下几项:

  • 乱序传输(Out of order delivery)
  • 网络抖动(Network Jitter)
  • 丢包占比(Packet loss out of total number of packets)

要进行udp测试,你需要在命令后面加上-u参数:

terminal
# 服务端
root@freenas[~]# iperf -s -u
------------------------------------------------------------
Server listening on UDP port 5001
Receiving 1470 byte datagrams
UDP buffer size: 41.1 KByte (default)
------------------------------------------------------------

# 客户端
MAC-➜  ~ iperf -c 192.168.0.104  -u -b 100m
------------------------------------------------------------
Client connecting to 192.168.0.104, UDP port 5001
Sending 1470 byte datagrams, IPG target: 117.60 us (kalman adjust)
UDP buffer size: 9.00 KByte (default)
------------------------------------------------------------
[  4] local 192.168.0.105 port 55425 connected with 192.168.0.104 port 5001
[ ID] Interval       Transfer     Bandwidth
[  4]  0.0-10.0 sec   119 MBytes   100 Mbits/sec
[  4] Sent 85035 datagrams
[  4] Server Report:
[  4]  0.0-10.0 sec   119 MBytes   100 Mbits/sec   0.003 ms    0/85035 (0%)
[  4]  0.0-10.0 sec  1 datagrams received out-of-order

在上面的示例中,我使用了-b选项来指定要使用的带宽(因为默认情况下,iperf UDP仅使用1Mbps,所以我建议您使用全部可用带宽来了解一下)

输出告诉了我们以下信息:

  • Bandwidth = 100 Mbits/sec
  • Network jitter = 0.003 ms (网络抖动是数据报文周期性到达的时间偏差。 如果使用地球另一端的服务器进行测试,则iperf输出中可能会看到较高的抖动值。)
  • Out of Order = 1 datagram
  • Lost/Total = 0/85035 (0%)

VOIP对于数据包损失的要求非常高。 较高的数据包丢失可能会导致语音中断。因此,如果您的基础架构上有VOIP或其他此类关键应用程序,则使用iperf进行UDP测试将非常有帮助。


Copyright © 2024