iPerf功能上分为:服务端和客户端,但程序用的都是官网下载的那个iperf,这一点不像ixchariot,它的控制端和客户端是不一样的。
要想测试一段链路的带宽,需要两端都安装iperf,然后用命令的方式指定哪一端工作在服务器模式,哪一端工作在客户端模式。
简单常用版
服务端:用-s参数,指明这端是服务端。
iperf3.exe -s
*服务端通常就用-s一个参数就可以了,更多的操作往往是在客户端加参数实现。
客户端:用-c参数,指明这端是客户端,后面要跟服务器端的ip。
iperf3.exe -c 192.168.3.120
其中,192.168.3.120是服务端ip。
这种情况下,iperf默认是单线程、TCP连接,数据流方向是:客户端-->服务器端,也即客户端发送、服务端接收。
为了测试更准确,通常会用-P参数来启动多个线程,以保证吃满带宽,让测试结果更准确。但也不用太多,一般来说10个线程已经足够了。
iperf3.exe -c 192.168.3.120 -P 10
如果你想要测试下载方向的带宽(站在客户端角度),只需在客户端加参数-R,此时,数据流的方向就变成了:服务端-->客户端。
iperf3.exe -c 192.168.3.120 -R
UDP测试
在客户端加参数-u,表示使用UDP协议,如果不加-u参数,默认使用TCP协议。
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -u
Connecting to host 192.168.100.3, port 5201
[ 4] local 192.168.100.2 port 57860 connected to 192.168.100.3 port 5201
[ ID] Interval Transfer Bandwidth Total Datagrams
[ 4] 0.00-1.02 sec 136 KBytes 1.10 Mbits/sec 17
[ 4] 1.02-2.01 sec 120 KBytes 987 Kbits/sec 15
......
[ 4] 9.01-10.01 sec 128 KBytes 1.05 Mbits/sec 16
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 4] 0.00-10.01 sec 1.25 MBytes 1.05 Mbits/sec 0.060 ms 0/159 (0%)
[ 4] Sent 159 datagramsiperf Done.
结合官方文档-b参数的介绍可知,UDP默认是1Mbits/s(TCP不限制),所以,上面才只跑出这么低的带宽。因此,-u通常需要与-b参数结合使用,才能测出实际链路最大带宽。
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -u -b 1000M
Connecting to host 192.168.100.3, port 5201
[ 4] local 192.168.100.2 port 58604 connected to 192.168.100.3 port 5201
[ ID] Interval Transfer Bandwidth Total Datagrams
[ 4] 0.00-1.00 sec 102 MBytes 855 Mbits/sec 13040
[ 4] 1.00-2.00 sec 114 MBytes 958 Mbits/sec 14622
[ 4] 2.00-3.00 sec 113 MBytes 949 Mbits/sec 14474
......
[ 4] 8.00-9.00 sec 114 MBytes 958 Mbits/sec 14618
[ 4] 9.00-10.00 sec 114 MBytes 958 Mbits/sec 14622
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 4] 0.00-10.00 sec 1.10 GBytes 946 Mbits/sec 0.064 ms 7607/144319 (5.3%)
[ 4] Sent 144319 datagramsiperf Done
进阶玩法
1、双向同时打流
这种方法主要为了测试上传、下载同时工作时的最大带宽,因为目前的链路基本上都是全双工,所以,理论上,上传和下载都应该同时达到链路最大带宽。
方法:
需要分别在服务端和客户端起2个进程,windows需要开2个CMD窗口,这样才能实现双向同时打流(客户端的其中一个进程加-R参数即可)、或单向多进程打流。
*因为iperf3没有双向同时打流的参数,所以只能用这种方式。但iperf是支持的。
服务端:
d:\iperf-3.1.3-win64>iperf3.exe -s -p 5201
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
D:\iperf-3.1.3-win64>iperf3.exe -s -p 5202
-----------------------------------------------------------
Server listening on 5202
-----------------------------------------------------------
客户端:
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -p 5201
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -p 5202 -R
论双向打流,还得数ixchariot!想了解的同学,转这里!
2、小包测试
小包测试建议用UDP模式,TCP模式设置难度高,且很容易出问题。
方法:
UDP模式,并设置l=18,即可得到64B的最小帧(可通过抓包软件验证,wireshark抓包会显示为60B,至于为什么不是64B,详见-l参数介绍),这样也就能获得64B小包发送速率了。
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -u -b 1000m -l 18
Connecting to host 192.168.100.3, port 5201
[ 4] local 192.168.100.2 port 52399 connected to 192.168.100.3 port 5201
[ ID] Interval Transfer Bandwidth Total Datagrams
[ 4] 0.00-1.00 sec 710 KBytes 5.82 Mbits/sec 40395
[ 4] 1.00-2.00 sec 686 KBytes 5.62 Mbits/sec 39011
[ 4] 2.00-3.00 sec 694 KBytes 5.68 Mbits/sec 39461
[ 4] 3.00-4.00 sec 679 KBytes 5.56 Mbits/sec 38615
[ 4] 4.00-5.00 sec 646 KBytes 5.29 Mbits/sec 36740
[ 4] 5.00-6.00 sec 667 KBytes 5.47 Mbits/sec 37970
[ 4] 6.00-7.00 sec 710 KBytes 5.82 Mbits/sec 40394
[ 4] 7.00-8.00 sec 688 KBytes 5.64 Mbits/sec 39142
[ 4] 8.00-9.00 sec 671 KBytes 5.50 Mbits/sec 38171
[ 4] 9.00-10.00 sec 705 KBytes 5.77 Mbits/sec 40103
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 4] 0.00-10.00 sec 6.69 MBytes 5.62 Mbits/sec 0.030 ms 179057/361285 (50%)
[ 4] Sent 361285 datagramsiperf Done.
图片
其他参数详解
(红色表示仅支持服务端,蓝色表示仅支持客户端,黑色表示都支持)
-b:设置发送带宽,注意它设置的是单个线程的带宽,单位bits/s。哪怕你是千兆链路,如果你-b=100M,那么测试结果最大也不会超过100Mbits/s。
默认值:UDP是1Mbits/s,TCP是不限制。因此,这个参数通常与-u搭配使用,虽然它也可以与TCP搭配使用。
#这个例子是“不太正确”的用法:与TCP搭配。因为tcp默认就是不限制。
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -b 100m -P 3
Connecting to host 192.168.100.3, port 5201
[ 4] local 192.168.100.2 port 18532 connected to 192.168.100.3 port 5201
[ 6] local 192.168.100.2 port 18533 connected to 192.168.100.3 port 5201
[ 8] local 192.168.100.2 port 18534 connected to 192.168.100.3 port 5201
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-1.01 sec 11.2 MBytes 93.0 Mbits/sec
[ 6] 0.00-1.01 sec 11.2 MBytes 93.0 Mbits/sec
[ 8] 0.00-1.01 sec 11.2 MBytes 93.0 Mbits/sec
[SUM] 0.00-1.01 sec 33.8 MBytes 279 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 4] 1.01-2.01 sec 11.9 MBytes 100 Mbits/sec
[ 6] 1.01-2.01 sec 11.9 MBytes 100 Mbits/sec
[ 8] 1.01-2.01 sec 11.9 MBytes 100 Mbits/sec
[SUM] 1.01-2.01 sec 35.6 MBytes 300 Mbits/sec
......
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-10.01 sec 118 MBytes 99.3 Mbits/sec sender
[ 4] 0.00-10.01 sec 118 MBytes 99.3 Mbits/sec receiver
[ 6] 0.00-10.01 sec 118 MBytes 99.3 Mbits/sec sender
[ 6] 0.00-10.01 sec 118 MBytes 99.3 Mbits/sec receiver
[ 8] 0.00-10.01 sec 118 MBytes 99.3 Mbits/sec sender
[ 8] 0.00-10.01 sec 118 MBytes 99.3 Mbits/sec receiver
[SUM] 0.00-10.01 sec 356 MBytes 298 Mbits/sec sender
[SUM] 0.00-10.01 sec 355 MBytes 298 Mbits/sec receiver
iperf Done.
-w:设置socket缓冲区大小。对TCP来说,这个用于设置 TCP 窗口接收的大小(这个选项会被发送到服务器端,同样的参数会在服务器端生效)。
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.9.68 -w 100000
图片
对于UDP来说,通常不需要设置这个参数,这个数设置得太小了,会导致发送端发送速度慢,测得的结果偏小。
关于 TCP 窗口大小的理论值如何计算的问题?
iPerf 的主要目标是帮助调整特定路径上的 TCP 连接。TCP 最基本的调优问题是 TCP 窗口大小,它控制着网络中任一时刻可以有多少数据。如果太小,发送方有时会处于空闲状态,性能不佳。
用于 TCP 窗口大小的理论值是带宽延迟积,
带宽延迟积 = 瓶颈带宽 * 往返时间
其中,瓶颈带宽即链路带宽,往返时间可以通过ping测量。
比如:瓶颈链路是 45 Mbit/sec DS3 链路,使用 ping 测量的往返时间是 42 ms。
带宽延迟积为45 Mbit/sec * 42 ms= (45e6) * (42e-3)= 1890000 位= 230 KB
这是确定最佳窗口大小的起点;将其设置得更高或更低可能会产生更好的结果。(更多信息,可以参考本文底部官方文档的链接。)
-M:尝试去设置TCP的MSS最大分片长度(我测试发现,对于windows系统,不管我设置多少,最后还是MSS=1460,不知是哪里的问题,应该是需要跟服务端协商)。MSS通常是MTU减去40字节的TCP/IP首部。对以太网来说MSS是1460(MTU是1500字节)。
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -M 300
图片
-l:length of buffer to read or write。
设置每次发送报文的最大长度,默认TCP是128KB, UDP是8KB。
我测试发现,这个参数用于UDP模式会比较好,使用这个参数可以设定每个包的大小,如下方截图。
l=18:
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -u -b 1000M -l 18
Connecting to host 192.168.100.3, port 5201
[ 4] local 192.168.100.2 port 57282 connected to 192.168.100.3 port 5201
[ ID] Interval Transfer Bandwidth Total Datagrams
[ 4] 0.00-1.00 sec 722 KBytes 5.91 Mbits/sec 41071
[ 4] 1.00-2.00 sec 686 KBytes 5.62 Mbits/sec 39051
......
[ 4] 8.00-9.00 sec 631 KBytes 5.17 Mbits/sec 35893
[ 4] 9.00-10.00 sec 710 KBytes 5.82 Mbits/sec 40412
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 4] 0.00-10.00 sec 6.77 MBytes 5.68 Mbits/sec 0.018 ms 197039/368476 (53%)
[ 4] Sent 368476 datagrams
iperf Done.
通过抓包可以看到,l=18时,帧长度为60B(18+8+20+14:l+UDP头+ip头+帧头。正常帧头+帧尾应该是12+2+4=18B,但Wireshark 抓包时是看不到前导码和FCS(帧尾)的,所以这里是14,也因此wireshark抓包,以太网最大帧长是1514,这个通过下面的抓包也能看出来)
图片
l=2000:
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -u -b 1000M -l 2000
Connecting to host 192.168.100.3, port 5201
[ 4] local 192.168.100.2 port 61197 connected to 192.168.100.3 port 5201
[ ID] Interval Transfer Bandwidth Total Datagrams
[ 4] 0.00-1.00 sec 57.4 MBytes 482 Mbits/sec 30117
[ 4] 1.00-2.00 sec 48.7 MBytes 409 Mbits/sec 25551
......
[ 4] 9.00-10.00 sec 59.2 MBytes 497 Mbits/sec 31032
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 4] 0.00-10.00 sec 573 MBytes 481 Mbits/sec 0.043 ms 148555/300317 (49%)
[ 4] Sent 300317 datagrams
iperf Done.
图片
图片
对于TCP模式来说,单独设置-l,好像没啥用处。即对于TCP来说,单独用-l参数,并不能达到限制len的目的。原因:https://github.com/esnet/iperf/discussions/1294
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -l 10
图片
要想让-l对TCP模式生效,需要搭配另一个参数-N才可以(但情况复杂,跟服务端系统类型等因素也有关系,而且即使大部分正常,有时偶尔还会出现夹杂大包的情况出现,总之,小包测试建议用UDP):
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -l 6 -N
图片
另:测试发现(TCP模式)也可以用-w来达到限制-l的目的,但会报很多提示:接收方的窗口现在已经完全满了(其实,这也跟服务端系统类型有关,我测试发现服务端是Linux系统是,-w=6也能很好的限制每个帧=60B,而没有任何报警提示,总之,还是那句话,小包测试建议用UDP,tcp情况太复杂)。
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -w 10
图片
图片
还可以用-w和-l搭配使用,注意:-w要大于-l,(等于或者小于都不行)不然会有很多类似上面截图一样的提示。
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -l 100 -w 500
图片
总之,要想理解-Mlw这3个参数的使用,需要先熟悉TCP的工作原理才可以,这对多数人来说,还是比较难的。我们仅仅测速的话,没必要去深究这几个参数。
-P:我测试发现:windows下,-P参数无法跟UDP模式配合使用。linux下可以。
#客户端和服务端均在windows下测试
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -u -P 2
Connecting to host 192.168.100.3, port 5201
[ 4] local 192.168.100.2 port 56095 connected to 192.168.100.3 port 5201
#一直停留在这里。
-i:设置输出频率,也就是多久报告一次结果。默认是1s一次,你不仅可以设置成5s一次,还可以设置成丧心病狂的0.1s一次。我测试最多也就精确到0.1s了,再往下0.01s这个级别是设置不成功的。还可以设置为0,表示仅输出一条,也就类似于仅输出结果。
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -i 0.1
Connecting to host 192.168.100.3, port 5201
[ 4] local 192.168.100.2 port 5109 connected to 192.168.100.3 port 5201
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-0.10 sec 10.1 MBytes 842 Mbits/sec
[ 4] 0.10-0.20 sec 11.2 MBytes 945 Mbits/sec
[ 4] 0.20-0.30 sec 11.2 MBytes 951 Mbits/sec
-t:设置测试时长,单位s,默认测试时长为10s。输出的频率跟你设置的-i参数有关,默认是i=1,也就是1s输出一次,如果t=3,则只输出3次(如下);如果-i=0.1,则输出3/0.1=30次。
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -t 3
Connecting to host 192.168.100.3, port 5201
[ 4] local 192.168.100.2 port 5124 connected to 192.168.100.3 port 5201
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-1.00 sec 112 MBytes 940 Mbits/sec
[ 4] 1.00-2.00 sec 112 MBytes 943 Mbits/sec
[ 4] 2.00-3.00 sec 112 MBytes 942 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-3.00 sec 337 MBytes 942 Mbits/sec sender
[ 4] 0.00-3.00 sec 337 MBytes 942 Mbits/sec receiver
-n:指定要发送多少的数据量,单位是Byte。不指定单位,表示多少个字节;可以指定单位为k/m/g(大小写一样的效果)。注意:这个参数表示一共发送多少数据量,且直到发完为止,而不管多长时间,因此,它和-t参数是冲突的,不能同时使用的。它还与-k参数冲突。
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -n 10m
Connecting to host 192.168.100.3, port 5201
[ 4] local 192.168.100.2 port 6020 connected to 192.168.100.3 port 5201
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-0.09 sec 10.0 MBytes 909 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-0.09 sec 10.0 MBytes 909 Mbits/sec sender
[ 4] 0.00-0.09 sec 9.89 MBytes 899 Mbits/sec receiver
-k:要发送多少个数据包,发完为止、发完即止。因此,它也是跟-t参数冲突的。而且也跟-n冲突。
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -k 20
Connecting to host 192.168.100.3, port 5201
[ 4] local 192.168.100.2 port 6273 connected to 192.168.100.3 port 5201
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-0.00 sec 384 KBytes 1.51 Gbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-0.00 sec 384 KBytes 1.51 Gbits/sec sender
[ 4] 0.00-0.00 sec 244 KBytes 961 Mbits/sec receiver
iperf Done.
-tnk这3个参数是相互冲突的,不能同时使用这3个参数中的任意2个或3个,同一时间只能使用其中一个。且-nk参数会覆盖默认测试时长10s的限制。
另外,需要注意的是,如果某些参数设置的太小(比如-nkwl),可能会导致带宽测试结果不准确。比如:你是千兆带宽,却只设置发送一个1M的包,测试结果是不可能准确的。
-F:用在不同的端,代表不同的含义。用在客户端,表示发送实际文件,而不是用软件提供的随机数据;用在服务端,表示把从客户端发送过来的数据,写入文件(默认是写入iperf的文件夹中),而不是默认丢弃收到的数据。另外,发现我不管在客户端指定多大的文件,都只发送一部分(26%左右)大小的数据,而不是整个文件发送完再结束(均是在windows下测试的)。
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -F d:\123.iso
Connecting to host 192.168.100.3, port 5201
[ 4] local 192.168.100.2 port 6468 connected to 192.168.100.3 port 5201
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-1.00 sec 100 MBytes 842 Mbits/sec
[ 4] 1.00-2.00 sec 104 MBytes 871 Mbits/sec
[ 4] 2.00-3.00 sec 106 MBytes 888 Mbits/sec
[ 4] 3.00-4.00 sec 99.6 MBytes 835 Mbits/sec
[ 4] 4.00-4.36 sec 37.5 MBytes 888 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-4.36 sec 447 MBytes 861 Mbits/sec sender
Sent 447 MByte / 1.71 GByte (25%) of d:\123.iso
[ 4] 0.00-4.36 sec 447 MBytes 861 Mbits/sec receiver
iperf Done.
因此,它可以跟-tnk同时使用,哪个值先到,以哪个为准。即最多只能发送文件的26%左右就停止了,不管你-t设置了多少s。除非你设置的t值小于发送26%所需时间,才生效。比如下图:
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -F d:\456.iso -t 10
Connecting to host 192.168.100.3, port 5201
[ 4] local 192.168.100.2 port 6514 connected to 192.168.100.3 port 5201
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-1.00 sec 105 MBytes 880 Mbits/sec
[ 4] 1.00-2.00 sec 105 MBytes 884 Mbits/sec
......
[ 4] 5.00-6.00 sec 105 MBytes 884 Mbits/sec
[ 4] 6.00-6.15 sec 15.1 MBytes 864 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-6.15 sec 648 MBytes 884 Mbits/sec sender
Sent 648 MByte / 2.41 GByte (26%) of d:\456.iso
[ 4] 0.00-6.15 sec 648 MBytes 884 Mbits/sec receiver
iperf Done.
#6s就结束了,并没有发够10s。
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -F d:\456.iso -t 3
Connecting to host 192.168.100.3, port 5201
[ 4] local 192.168.100.2 port 6518 connected to 192.168.100.3 port 5201
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-1.00 sec 104 MBytes 872 Mbits/sec
[ 4] 1.00-2.00 sec 105 MBytes 879 Mbits/sec
[ 4] 2.00-3.00 sec 107 MBytes 894 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-3.00 sec 316 MBytes 882 Mbits/sec sender
Sent 316 MByte / 2.41 GByte (12%) of d:\456.iso
[ 4] 0.00-3.00 sec 316 MBytes 882 Mbits/sec receiver
iperf Done.
#3s结束。
-v(小写):查看iperf版本信息:
D:\iperf-3.1.3-win64>iperf3.exe -v
iperf 3.1.3
CYGWIN_NT-10.0 DESKTOP-4FI1NSS 2.5.1(0.297/5/3) 2016-04-21 22:14 x86_64
Optional features available: None
-V(大写):输出更为详细的信息:会发现多了iperf版本、TCP MSS大小、CPU占用率、时间等信息。
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.3.120Connecting to host 192.168.3.120, port 5201[ 4] local 192.168.11.27 port 4629 connected to 192.168.3.120 port 5201[ ID] Interval Transfer Bandwidth[ 4] 0.00-1.01 sec 11.5 MBytes 95.3 Mbits/sec...[ 4] 9.00-10.00 sec 11.2 MBytes 94.4 Mbits/sec- - - - - - - - - - - - - - - - - - - - - - - - -[ ID] Interval Transfer Bandwidth[ 4] 0.00-10.00 sec 105 MBytes 88.3 Mbits/sec sender[ 4] 0.00-10.00 sec 105 MBytes 88.3 Mbits/sec receiveriperf Done.
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.3.120 -V
iperf 3.1.3
CYGWIN_NT-10.0 alzhang-pc 2.5.1(0.297/5/3) 2016-04-21 22:14 x86_64
Time: Fri, 02 Sep 2022 08:45:06 GMT
Connecting to host 192.168.3.120, port 5201
Cookie: alzhang-pc.1662108306.706278.50b10eb
TCP MSS: 0 (default)
[ 4] local 192.168.11.27 port 4634 connected to 192.168.3.120 port 5201
Starting Test: protocol: TCP, 1 streams, 131072 byte blocks, omitting 0 seconds, 10 second test
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-1.01 sec 7.50 MBytes 62.6 Mbits/sec
...
[ 4] 9.00-10.02 sec 11.6 MBytes 96.3 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
Test Complete. Summary Results:
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-10.02 sec 107 MBytes 89.5 Mbits/sec sender
[ 4] 0.00-10.02 sec 107 MBytes 89.5 Mbits/sec receiver
CPU Utilization: local/sender 1.5% (0.0%u/1.5%s), remote/receiver 3.4% (1.4%u/1.9%s)
iperf Done.
-B:绑定网卡,用在有多个网卡的主机。对于客户端,这将设置出站接口。对于服务器,这将设置传入接口
iperf3.exe -s -B 192.168.100.3
-S:设置被发送出去报文的类型(TOS字段),用的不多,可以参考文末提供的链接文档。
-h:显示帮助
iperf3.exe -h
-O:官方文档写的忽略前几秒的测试结果,用来跳过TCP慢启动过程,从而让测试结果更加接近链路的最大带宽。但我测试发现,这个参数也是可以跟-u结合使用的,表示忽略前多少秒的输出结果。
#UDP测试:
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -u -b 1000M -O 2
Connecting to host 192.168.100.3, port 5201
[ 4] local 192.168.100.2 port 58837 connected to 192.168.100.3 port 5201
[ ID] Interval Transfer Bandwidth Total Datagrams
[ 4] 0.00-1.00 sec 102 MBytes 852 Mbits/sec 13001 (omitted)
[ 4] 1.00-2.00 sec 114 MBytes 958 Mbits/sec 14621 (omitted)
......
[ 4] 9.00-10.00 sec 114 MBytes 958 Mbits/sec 14619
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Jitter Lost/Total Datagrams
[ 4] 0.00-10.00 sec 1.12 GBytes 958 Mbits/sec 0.065 ms 4725/146171 (3.2%)
[ 4] Sent 146171 datagrams
iperf Done.
#TCP测试:
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.100.3 -O 2
Connecting to host 192.168.100.3, port 5201
[ 4] local 192.168.100.2 port 18827 connected to 192.168.100.3 port 5201
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-1.00 sec 112 MBytes 942 Mbits/sec (omitted)
[ 4] 1.00-2.00 sec 112 MBytes 942 Mbits/sec (omitted)
......
[ 4] 9.00-10.00 sec 112 MBytes 941 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-10.00 sec 1.09 GBytes 939 Mbits/sec sender
[ 4] 0.00-10.00 sec 1.10 GBytes 942 Mbits/sec receiver
iperf Done.
-N:设置 TCP 无延迟选项,禁用 Nagle 算法。通常这个选项只用于交互式人机对话的应用程序中,比如Telnet。可与-l参数配合使用,来限制单个数据包的大小,用法可参见-l参数。
-d:输出debug信息。很有用,可以查看一些详细信息:
D:\iperf-3.1.3-win64>iperf3.exe -c 192.168.9.68 -d -l 1
send_parameters:
{
"tcp": true,
"omit": 0,
"time": 10,
"parallel": 1,
"len": 1,
"client_version": "3.1.3"
}
Connecting to host 192.168.9.68, port 5201
SO_SNDBUF is 212992
[ 4] local 192.168.11.27 port 9869 connected to 192.168.9.68 port 5201
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-1.00 sec 423 KBytes 3.46 Mbits/sec
[ 4] 1.00-2.00 sec 427 KBytes 3.50 Mbits/sec
[ 4] 2.00-3.00 sec 428 KBytes 3.51 Mbits/sec
[ 4] 3.00-4.00 sec 383 KBytes 3.13 Mbits/sec
[ 4] 4.00-5.00 sec 355 KBytes 2.91 Mbits/sec
[ 4] 5.00-6.00 sec 356 KBytes 2.92 Mbits/sec
[ 4] 6.00-7.00 sec 360 KBytes 2.94 Mbits/sec
[ 4] 7.00-8.00 sec 364 KBytes 2.98 Mbits/sec
[ 4] 8.00-9.00 sec 330 KBytes 2.71 Mbits/sec
send_results
{
"cpu_util_total": 88.957849,
"cpu_util_user": 17.942077,
"cpu_util_system": 71.015772,
"sender_has_retransmits": 0,
"streams": [{
"id": 1,
"bytes": 3889330,
"retransmits": -1,
"jitter": 0,
"errors": 0,
"packets": 0
}]
}
get_results
{
"cpu_util_total": 0.619146,
"cpu_util_user": 0.194834,
"cpu_util_system": 0.424207,
"sender_has_retransmits": -1,
"congestion_used": "cubic",
"streams": [{
"id": 1,
"bytes": 3514113,
"retransmits": -1,
"jitter": 0,
"errors": 0,
"packets": 0
}]
}
[ 4] 9.00-10.00 sec 373 KBytes 3.05 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 4] 0.00-10.00 sec 3.71 MBytes 3.11 Mbits/sec sender
[ 4] 0.00-10.00 sec 3.35 MBytes 2.81 Mbits/sec receiver
iperf Done.
常见问题:
1、命令参数要区分大小写的。
比如:-p的意思是指定端口,-P的意思是指定并发线程数量。
2、如果客户端连不上服务器,检查关闭防火墙,再试。
3、windows端和linux端的iperf是可以互通的。
官方教程:
https://iperf.fr/iperf-doc.php
https://software.es.net/iperf/invoking.html
参考链接:
https://www.592850.com/archives/1036.html
https://software.es.net/iperf/faq.html
https://software.es.net/iperf/dev.html
https://github.com/esnet/iperf/discussions
来源:https://mp.weixin.qq.com/s/1yA7zGnhwnemTvafwB14cA