iperf3是一个网络速度测试工具,支持IPv4与IPv6,支持TCP、UDP、SCTP传输协议,可在Windows、Mac OS X、Linux、FreeBSD等各种平台使用,是一个简单又实用的小工具。 本文介绍安装、使用iperf3 网速测试工具。
iperf3本身是以C++所开发的小程序,在官网https://iperf.fr/iperf-download.php上有提供各种平台的预编译二进制文件,解压缩后即可使用。
在CentOS 7上使用下列命令即可安装:
yum install iperf3
MAC OS X上使用下列命令即可安装:
brew install iperf3
在使用iperf3测试时,要同时在server端与client端都各执行一个程序,让它们互相传送报文进行测试。下面的例子是在CentOS7上进行的测试。
首先在10.23.5.66机器启动server端的程序:
iperf3 -s
接着在10.23.5.65服务器上执行client 端的程序:
iperf3 -c 10.23.5.66
在测试时server端与client端都会出现测试的数据,client端以下是测试的结果:
[jinguang1@localhost ~]$ iperf3 -c 10.23.5.66
Connecting to host 10.23.5.66, port 5201
[ 4] local 10.23.5.65 port 10412 connected to 10.23.5.66 port 5201
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 114 MBytes 953 Mbits/sec 0 95.5 KBytes
[ 4] 1.00-2.00 sec 113 MBytes 948 Mbits/sec 0 95.5 KBytes
[ 4] 2.00-3.00 sec 113 MBytes 950 Mbits/sec 0 95.5 KBytes
[ 4] 3.00-4.00 sec 113 MBytes 948 Mbits/sec 0 95.5 KBytes
[ 4] 4.00-5.00 sec 113 MBytes 950 Mbits/sec 0 95.5 KBytes
[ 4] 5.00-6.00 sec 113 MBytes 948 Mbits/sec 0 95.5 KBytes
[ 4] 6.00-7.00 sec 113 MBytes 948 Mbits/sec 0 95.5 KBytes
[ 4] 7.00-8.00 sec 113 MBytes 950 Mbits/sec 0 95.5 KBytes
[ 4] 8.00-9.00 sec 113 MBytes 948 Mbits/sec 0 95.5 KBytes
[ 4] 9.00-10.00 sec 113 MBytes 950 Mbits/sec 0 95.5 KBytes
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-10.00 sec 1.10 GBytes 949 Mbits/sec 0 sender
[ 4] 0.00-10.00 sec 1.10 GBytes 949 Mbits/sec receiver
iperf Done.
从打印的内容看,缺省参数下,Client将连接Server端的5201端口,持续向Server端发送数据,并统计出每秒传输的字节数、带宽、出现报文重传的次数、拥塞窗口(Congestion Window)大小,整个测试将持续10秒钟;最后将汇总10秒的平均数据,并给出发送和接收端的统计。
接下来分析一下Server的测试输出结果:
[jinguang1@localhost ~]$ iperf3 -s
warning: this system does not seem to support IPv6 - trying IPv4
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Accepted connection from 10.23.5.65, port 10410
[ 5] local 10.23.5.66 port 5201 connected to 10.23.5.65 port 10412
[ ID] Interval Transfer Bandwidth
[ 5] 0.00-1.00 sec 109 MBytes 913 Mbits/sec
[ 5] 1.00-2.00 sec 113 MBytes 948 Mbits/sec
[ 5] 2.00-3.00 sec 113 MBytes 949 Mbits/sec
[ 5] 3.00-4.00 sec 113 MBytes 949 Mbits/sec
[ 5] 4.00-5.00 sec 113 MBytes 949 Mbits/sec
[ 5] 5.00-6.00 sec 113 MBytes 949 Mbits/sec
[ 5] 6.00-7.00 sec 113 MBytes 949 Mbits/sec
[ 5] 7.00-8.00 sec 113 MBytes 949 Mbits/sec
[ 5] 8.00-9.00 sec 113 MBytes 949 Mbits/sec
[ 5] 9.00-10.00 sec 113 MBytes 949 Mbits/sec
[ 5] 10.00-10.04 sec 4.29 MBytes 947 Mbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth
[ 5] 0.00-10.04 sec 0.00 Bytes 0.00 bits/sec sender
[ 5] 0.00-10.04 sec 1.10 GBytes 945 Mbits/sec receiver
-----------------------------------------------------------
Server listening on 5201
-----------------------------------------------------------
Server端缺省监听IPv6地址和端口,如果未配置IPv6,会尝试IPv4。日志显示接收了来自10.23.5.65,源端口未10410的测试请求。Client端连续进行了10秒的测试,并显示了每秒传输的字节数,带宽信息;测试结束后会汇总发送和接收的统计信息。在Client连接关闭之后会继续侦听5201端口。
iperf3 所提供的选项非常多,以下介绍一些常用的参数。
1. 测试时间和输出统计数据间隔
-t参数可以指定传输测试的持续时间,而-i可以指定统计输出的间隔时间,如需要持续测试一个小时,每10秒钟打印一次输出结果:
iperf3 -c server_ip -i 10 -t 3600
2. 储存测试结果
--logfile参数可以将输出的测试结果储存至文件中:
iperf3 -c server_ip --logfile stats.txt
3. 设定侦听端口
iperf3缺省使用5201端口,如果需要指定,可以使用-p参数。这需要在Server和Client侧都需要进行指定,如使用12345端口:
#server侧
iperf3 -s -p 12345
#client侧
iperf3 -c server_ip -p 12345
4. JSON 格式输出
如果需要做一些自动化方面测试和管理工作,需要读取格式化的测试结果,那可以选择-J参数,来输出JSON格式测试结果。
[jinguang1@localhost ~]$ iperf3 -c 10.23.5.66 -J -t 2
{
"start": {
"connected": [{
"socket": 4,
"local_host": "10.23.5.65",
"local_port": 13346,
"remote_host": "10.23.5.66",
"remote_port": 5201
}],
"version": "iperf 3.1.7",
"system_info": "Linux localhost.localdomain 3.10.0-862.9.1.el7.x86_64 #1 SMP Mon Jul 16 16:29:36 UTC 2018 x86_64",
"timestamp": {
"time": "Fri, 07 Sep 2018 01:31:45 GMT",
"timesecs": 1536283905
},
"connecting_to": {
"host": "10.23.5.66",
"port": 5201
},
"cookie": "localhost.localdomain.1536283905.522",
"tcp_mss_default": 1460,
"test_start": {
"protocol": "TCP",
"num_streams": 1,
"blksize": 131072,
"omit": 0,
"duration": 2,
"bytes": 0,
"blocks": 0,
"reverse": 0
}
},
"intervals": [{
"streams": [{
"socket": 4,
"start": 0,
"end": 1.000059,
"seconds": 1.000059,
"bytes": 118546160,
"bits_per_second": 948313208.319058,
"retransmits": 0,
"snd_cwnd": 97820,
"rtt": 508,
"omitted": false
}],
"sum": {
"start": 0,
"end": 1.000059,
"seconds": 1.000059,
"bytes": 118546160,
"bits_per_second": 948313208.319058,
"retransmits": 0,
"omitted": false
}
}, {
"streams": [{
"socket": 4,
"start": 1.000059,
"end": 2.000063,
"seconds": 1.000004,
"bytes": 117912520,
"bits_per_second": 943296336.710671,
"retransmits": 0,
"snd_cwnd": 97820,
"rtt": 499,
"omitted": false
}],
"sum": {
"start": 1.000059,
"end": 2.000063,
"seconds": 1.000004,
"bytes": 117912520,
"bits_per_second": 943296336.710671,
"retransmits": 0,
"omitted": false
}
}],
"end": {
"streams": [{
"sender": {
"socket": 4,
"start": 0,
"end": 2.000063,
"seconds": 2.000063,
"bytes": 236458680,
"bits_per_second": 945804841.588347,
"retransmits": 0,
"max_snd_cwnd": 97820,
"max_rtt": 508,
"min_rtt": 499,
"mean_rtt": 503
},
"receiver": {
"socket": 4,
"start": 0,
"end": 2.000063,
"seconds": 2.000063,
"bytes": 235998780,
"bits_per_second": 943965299.700324
}
}],
"sum_sent": {
"start": 0,
"end": 2.000063,
"seconds": 2.000063,
"bytes": 236458680,
"bits_per_second": 945804841.588347,
"retransmits": 0
},
"sum_received": {
"start": 0,
"end": 2.000063,
"seconds": 2.000063,
"bytes": 235998780,
"bits_per_second": 943965299.700324
},
"cpu_utilization_percent": {
"host_total": 3.365885,
"host_user": 0.294900,
"host_system": 3.447099,
"remote_total": 0.054653,
"remote_user": 0.003388,
"remote_system": 0.049958
},
"sender_tcp_congestion": "cubic",
"receiver_tcp_congestion": "cubic"
}
}
5. 使用多条连接进行测试
-P参数可以指定同时连接测试的数量,缺省使用一条连接。
[jinguang1@localhost ~]$ iperf3 -c 10.23.5.66 -P 2 -t 2
Connecting to host 10.23.5.66, port 5201
[ 4] local 10.23.5.65 port 13652 connected to 10.23.5.66 port 5201
[ 6] local 10.23.5.65 port 13654 connected to 10.23.5.66 port 5201
[ ID] Interval Transfer Bandwidth Retr Cwnd
[ 4] 0.00-1.00 sec 56.8 MBytes 477 Mbits/sec 0 65.6 KBytes
[ 6] 0.00-1.00 sec 56.9 MBytes 478 Mbits/sec 0 67.0 KBytes
[SUM] 0.00-1.00 sec 114 MBytes 954 Mbits/sec 0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ 4] 1.00-2.00 sec 56.5 MBytes 474 Mbits/sec 0 65.6 KBytes
[ 6] 1.00-2.00 sec 56.5 MBytes 474 Mbits/sec 0 67.0 KBytes
[SUM] 1.00-2.00 sec 113 MBytes 948 Mbits/sec 0
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval Transfer Bandwidth Retr
[ 4] 0.00-2.00 sec 113 MBytes 475 Mbits/sec 0 sender
[ 4] 0.00-2.00 sec 113 MBytes 474 Mbits/sec receiver
[ 6] 0.00-2.00 sec 113 MBytes 476 Mbits/sec 0 sender
[ 6] 0.00-2.00 sec 113 MBytes 474 Mbits/sec receiver
[SUM] 0.00-2.00 sec 227 MBytes 951 Mbits/sec 0 sender
[SUM] 0.00-2.00 sec 226 MBytes 949 Mbits/sec receiver
iperf Done.
6. 选择使用的传输协议
iperf3缺省使用TCP作为传输协议,如果使用UDP则使用-u参数,使用SCTP 则使用--sctp参数。
7. 反向传输
缺省iperf3使用上传模式:Client负责发送数据,Server负责接收;如果需要测试下载速度,则在Client侧使用-R参数即可。