iperf3安装配置使用踩坑记录

本文最后更新于:June 9, 2021 pm

iperf3是一个开源的多平台测速工具,涵盖了Windows,Android,Linux,iOS,MacOS等主流操作系统。本文以Windows为例记录一下在使用iperf3的过程中踩的一些坑。

1、下载安装iperf3

iperf3的官网提供了所有平台的下载方法,我们点击这里跳转到官网。

windows端

Windows分为32位和64位的,对应自己的系统版本下载,下载解压完成之后,将解压得到的文件复制到%systemroot%目录下,就能够直接使用了。

这里需要注意两点:

  1. Windows的%systemroot%目录是C:\Windows\System32
  2. 不管是使用CMD还是Powershell,都必须要以管理员身份运行,否则无法正常使用

Linux端

常见的主流Linux发行版(红帽系、debian系、suse系等)都可以直接通过对应的源或者包进行安装,如果是其他的Linux发行版,也可以选择手动安装

1
2
3
sudo wget -O /usr/lib/libiperf.so.0 https://iperf.fr/download/ubuntu/libiperf.so.0_3.1.3
sudo wget -O /usr/bin/iperf3 https://iperf.fr/download/ubuntu/iperf3_3.1.3
sudo chmod +x /usr/bin/iperf3

如果出现下面这一类的报错,则需要将依赖文件拷贝到/lib目录和/lib64目录

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
root@tiny-unraid:~# iperf3 --help
iperf3: error while loading shared libraries: libiperf.so.0: cannot open shared object file: No such file or directory
root@tiny-unraid:~# ldd /usr/bin/iperf3
linux-vdso.so.1 (0x00007ffd35bde000)
libiperf.so.0 => not found
libc.so.6 => /lib64/libc.so.6 (0x0000154f00c69000)
/lib64/ld-linux-x86-64.so.2 (0x0000154f00e5e000)

root@tiny-unraid:~# cp /usr/lib/libiperf.so.0 /lib/libiperf.so.0
root@tiny-unraid:~# cp /usr/lib/libiperf.so.0 /lib64/libiperf.so.0
root@tiny-unraid:~# ldd /usr/bin/iperf3
linux-vdso.so.1 (0x00007ffd36c72000)
libiperf.so.0 => /lib64/libiperf.so.0 (0x000014dd232e4000)
libc.so.6 => /lib64/libc.so.6 (0x000014dd230ff000)
libm.so.6 => /lib64/libm.so.6 (0x000014dd22fb2000)
/lib64/ld-linux-x86-64.so.2 (0x000014dd23516000)

2、运行服务端(server)

iperf3是一款c-s软件,即client-server软件,分为客户端和服务端,服务端需要一直运行,客户端才能够正常使用。

1
2
iperf3 -help
# 查看所有的操作指令

2.1 运行与退出

最常见的运行服务端的命令是:

1
2
iperf3 -s
# 这里的s就是server的意思

这种情况下默认监听的是5201端口

按下ctrl+c就可以关闭服务端

如果是只运行一次测速就退出,可以这样:

1
2
iperf3 -s -1
# 运行一次后自动退出服务端

2.2 指定监听端口

如果需要指定特定的监听端口,我们可以使用-p参数,这里的p就是port的意思。

1
2
iperf3 -s -p 7777
# 手动指定监听端口为7777

需要注意的是手动指定监听端口的时候不要和其他应用的端口冲突了,否则会无法运行服务或产生服务冲突。

2.3 守护进程模式

如果需要服务端在后台运行而不被关闭,可以尝试使用守护进程模式。

Daemon()程序是一直运行的服务端程序,又称为守护进程。通常在系统后台运行,没有控制终端,不与前台交互,Daemon程序一般作为系统服务使用。Daemon是长时间运行的进程,通常在系统启动后就运行,在系统关闭时才结束。一般说Daemon程序在后台运行,是因为它没有控制终端,无法和前台的用户交互。Daemon程序一般都作为服务程序使用,等待客户端程序与它通信。我们也把运行的Daemon程序称作守护进程。

1
2
iperf3 -s -D
# 注意D一定要大写

这个时候iperf3以服务端模式在后台运行,该进程不会轻易被结束运行。

使用netstat命令可以看到此时5201端口正在被使用。

如果需要关闭的话,我们可以使用taskkill指令。

1
2
tasklist | findstr iperf3
# Windows下的CMD无法使用grep命令可以使用findstr命令来代替
1
2
3
taskkill /PID 9492 /F
# 这里的9492要改成查询到的对应的PID
# 由于是守护进程,所以需要强制终止

其他的一些指令大家可以自己继续尝试,小七就不再赘述。

3、运行客户端(Client)

运行客户端的前提是有服务端在运行且我们知道服务端的IP并能正常访问服务端(有时候可能会被防火墙或其他杀软拦截)。

3.1 简单测试

因为外部设备所限,接下来小七同时在本机上运行服务端和客户端进行测速示例。

最简单的使用方法就是:

1
2
iperf3 -c ServerhostIP
# hostIP为服务端的IP地址

由于这里小七是在本机上运行的服务端,因此使用本机的IP地址或者localhost或者127.0.0.1都可以。

主要的几个参数列这里解释一下,Intervel指的是时间间隔,Transfer则是对应时间段里面传输的数据总量,Bandwidth则是该时间段内的平均带宽。

3.2 自定义测试时间和输出格式

1
iperf3 -c localhost -i 2 -t 30 --logfile output.log

对于这一条指令,我们对后面的参数进行逐个解析。

  • -i 2的作用是每2秒输出一次测试结果,数字2可以按照需要改成不同的数字
  • -t 30的作用是连续测试30s的时间
  • --logfile output.log的作用是将测试的结果输出到当前目录的output.log文件里面,需要注意的是此时不会在控制台上输出测试信息

▲打开log文件可以看到对应的测试数据都保存在里面了

如果需要指定路径输出json文件,我们只需要使用-J并在文件名前面指定路径即可:

1
2
iperf3 -c localhost -i 2 -t 30 -J --logfile C:\Users\Mr7th\Desktop\output.log
# 以Json格式将测试结果文件输出到桌面

下面为截取的部分json文件

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
{
"start": {
"connected": [{
"socket": 5,
"local_host": "::1",
"local_port": 7013,
"remote_host": "::1",
"remote_port": 5201
}],
"version": "iperf 3.1.3",
"system_info": "CYGWIN_NT-10.0 Tiny-Surface 2.5.1(0.297/5/3) 2016-04-21 22:14 x86_64",
"timestamp": {
"time": "Tue, 09 Apr 2019 11:40:34 GMT",
"timesecs": 1554810034
},
"connecting_to": {
"host": "localhost",
"port": 5201
},
"cookie": "Tiny-Surface.1554810034.839053.017f3",
"tcp_mss_default": 0,
"test_start": {
"protocol": "TCP",
"num_streams": 1,
"blksize": 131072,
"omit": 0,
"duration": 30,
"bytes": 0,
"blocks": 0,
"reverse": 0
}
},
"intervals": [{
"streams": [{
"socket": 5,
"start": 0,
"end": 2.000219,
"seconds": 2.000219,
"bytes": 1222770688,
"bits_per_second": 4.890547e+09,
"omitted": false
}],
"sum": {
"start": 0,
"end": 2.000219,
"seconds": 2.000219,
"bytes": 1222770688,
"bits_per_second": 4.890547e+09,
"omitted": false
}
}, {
"streams": [{
"socket": 5,
"start": 2.000219,
"end": 4.000079,
"seconds": 1.999860,
"bytes": 1384644608,
"bits_per_second": 5.538966e+09,
"omitted": false
}],
"sum": {
"start": 2.000219,
"end": 4.000079,
"seconds": 1.999860,
"bytes": 1384644608,
"bits_per_second": 5.538966e+09,
"omitted": false
}
},

3.3 使用反转模式(Reverse)

默认情况下我们进行测试,都是客户端发送数据,服务器端接收数据,这种情况下相当于只对上行带宽进行了测试,如果我们需要检测下行带宽,只需要使用-R命令,即可变为客户端接收,服务器端发送。

这里我们采用手机作为服务器端进行测试。

▼默认情况下,电脑作为客户端,主要是发送数据(上行带宽)。

▼使用反转模式(Reverse),此时电脑仍然是客户端,只不过变成了接收数据(下行带宽)。

其他的一些指令,大家感兴趣的可以点击这里查看官方的说明文档。