带宽测试
安装
macOS
直接用brew安装
brew install iperf3
CentOS
如果已经启用epel
源,直接安装即可
yum install iperf
FreeNAS
一个基于FreeBSD的NAS系统,系统自带
Windows
直接从https://iperf.fr/下载二进制包
C:\iperf>iperf3.exe
源码安装
从https://github.com/esnet/iperf下载源码
./configure; make; make install
基本概念
TCP 窗口(TCP Window)
TCP(传输控制协议)是用于网络通信的可靠传输层协议。 TCP的工作方式超出了本文的范围。 通过发送消息并等待接收者的确认,TCP以一种可靠的方式工作。
每当两台机器相互通信时,它们中的每一个都会通知对方有关一次可以接收的字节数的信息。
换句话说,发送方在没有确认的情况下可以发送另一端的最大数据量称为窗口大小。 此TCP窗口大小有时会严重影响网络吞吐量。 让我们举个例子。
假设您要从一台计算机向另一台计算机发送500MB的数据,并且tcp窗口大小为64KB。这意味着要发送全部500MB数据,发送端必须等待800次才能收到接收方的确认。
500MB / 64KB = 800
举一反三,你可以想到如果增加Window大小来调整TCP,则可以显着提高吞吐量。
测试
服务端
iperf -s
-s
参数表示该机器作为服务器
上面的命令机器上启动iperf服务器,默认情况下在端口5001上运行(默认的TCP窗口大小为64.0KB)。
客户端
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
参数指定服务端的端口
# iperf -s -p 2000
------------------------------------------------------------
Server listening on TCP port 2000
TCP window size: 64.0 KByte (default)
------------------------------------------------------------
客户端也要指定相应端口,让我来多加些参数测试吧
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
指定时间间隔显示统计信息:
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
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
参数:
# 服务端
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测试将非常有帮助。