iperf
- 安装
- windows端
Windows分为32位和64位的,对应自己的系统版本下载,下载解压完成之后,将解压得到的文件复制到%systemroot%目录下,就能够直接使用了。
Windows的%systemroot%目录是C:\Windows\System32
不管是使用CMD还是Powershell,都必须要以管理员身份运行,否则无法正常使用
- linux端
sudo apt-get install iperf3
- 测试时记得关闭防火墙或者自行配置防火墙规则,为了快速测试,这里就直接关闭防火墙
systemctl stop firewalld
- 安装完iperf后,在Server端执行
iperf3 -s -i 1 -f m
-s表示server,-i表示显示时间间隔,-f表示显示格式化的单位
- -p, —port #,Server 端监听、Client 端连接的端口号;
- -f, —format [kmgKMG],报告中所用的数据单位,Kbits, Mbits, KBytes, Mbytes;
- -i, —interval #,每次报告的间隔,单位为秒;
- -F, —file name,测试所用文件的文件名。如果使用在 Client 端,发送该文件用作测试;如果使用在
Server 端,则是将数据写入该文件,而不是丢弃;
- -A, —affinity n/n,m,设置 CPU 亲和力;
- -B, —bind ,绑定指定的网卡接口;
- -V, —verbose,运行时输出更多细节;
- -J, —json,运行时以 JSON 格式输出结果;
—logfile f,输出到文件;
- -d, —debug,以 debug 模式输出结果;
- -v, —version,显示版本信息并退出;
- -h, —help,显示帮助信息并退出。
Server 端参数:
- -s, —server,以 Server 模式运行;
- -D, —daemon,在后台以守护进程运行;
- -I, —pidfile file,指定 pid 文件;
- -1, —one- -off,只接受 1 次来自 Client 端的测试,然后退出。
Client 端参数
- -c, —client ,以 Client 模式运行,并指定 Server 端的地址;
- -u, —udp,以 UDP 协议进行测试;
- -b, —bandwidth #[KMG][/#],限制测试带宽。UDP 默认为 1Mbit/秒,TCP 默认无限制;
- -t, —time #,以时间为测试结束条件进行测试,默认为 10 秒;
- -n, —bytes #[KMG],以数据传输大小为测试结束条件进行测试;
- -k, —blockcount #[KMG],以传输数据包数量为测试结束条件进行测试;
- -l, —len #[KMG],读写缓冲区的长度,TCP 默认为 128K,UDP 默认为 8K
—cport ,指定 Client 端运行所使用的 TCP 或 UDP 端口,默认为临时端口;
- -P, —parallel #,测试数据流并发数量;
- -R, —reverse,反向模式运行(Server 端发送,Client 端接收);
- -w, —window #[KMG],设置套接字缓冲区大小,TCP 模式下为窗口大小;
- -C, —congestion ,设置 TCP 拥塞控制算法(仅支持 Linux 和 FreeBSD );
- -M, —set- -mss #,设置 TCP/SCTP 最大分段长度(MSS,MTU 减 40 字节);
- -N, —no- -delay,设置 TCP/SCTP no delay,屏蔽 Nagle 算法;
- -4, —version4,仅使用 IPv4;
- -6, —version6,仅使用 IPv6;
- -S, —tos N,设置 IP 服务类型(TOS,Type Of Service);
- -L, —flowlabel N,设置 IPv6 流标签(仅支持 Linux);
- -Z, —zerocopy,使用 “zero copy”(零拷贝)方法发送数据;
- -O, —omit N,忽略前 n 秒的测试;
- -T, —title str,设置每行测试结果的前缀;
—get- -server- -output,从 Server 端获取测试结果;
—udp- -counters- -64bit,在 UDP 测试包中使用 64 位计数器(防止计数器溢出)。
iperf3 python
tcp
- 服务端
import iperf3 def iperfserver(): server = iperf3.Server() result = server.run() result.remote_host print(result) iperfserver(received_Mbps)
- 客户端
import iperf3 def iperfclient(): client = iperf3.Client() client.duration = 1 client.server_hostname = '127.0.0.1' client.port = 5201 result = client.run() result.sent_Mbps iperfclient()
tips:预先
pip install iperf3
和sudo apt-get install iperf
输出结果
# Bits are measured in 10**3 terms
# Bytes are measured in 2**10 terms
# kbps = Kilobits per second
# Mbps = Megabits per second
# kB_s = kiloBytes per second
# MB_s = MegaBytes per second
self.sent_kbps = self.sent_bps / 1000
self.sent_Mbps = self.sent_kbps / 1000
self.sent_kB_s = self.sent_bps / (8 * 1024)
self.sent_MB_s = self.sent_kB_s / 1024
self.received_kbps = self.received_bps / 1000
self.received_Mbps = self.received_kbps / 1000
self.received_kB_s = self.received_bps / (8 * 1024)
self.received_MB_s = self.received_kB_s / 1024
看一眼源码,然后就拿到了输出数据
- bandwidth 目标带宽(以位/秒为单位)
- blksize 测试 blksize。
- duration 测试持续时间(以秒为单位)。
看了一下最小测试时间为1s,有点长。
udp
服务端
import iperf3
server = iperf3.Server()
server.bind_address = '127.0.0.1'
server.port = 5201
server.verbose = False
while True:
server.run()
客户端
#!/usr/bin/env python3
import iperf3
client = iperf3.Client()
client.duration = 1
client.server_hostname = '127.0.0.1'
client.port = 5201
client.protocol = 'udp'
client.bind_address="127.0.0.1"
print('Connecting to {0}:{1}'.format(client.server_hostname, client.port))
result = client.run()
if result.error:
print(result.error)
else:
print("lost_percent",result.lost_percent)
print("Bandwidth",result.Mbps)
print("packets",result.packets)
print("lost_packets",result.lost_packets)
print("lost_percent",result.lost_percent)
iperf2
tcp:
iperf -s -p 5001
iperf -c localhost -p 5001 -R -t 0.1 -f s
udp:
iperf -s -p 5001 -u
iperf -c localhost -p 5001 -R -t 0.1 -f s -u -b 10000m
- -R 双向测试
- iperf3中则不区分两者区别。
udp时发现传输带宽只有1.05Mbits/sec
1.05Mbits/sec远低于TCP测试中观察到的值,它也远远低于1GB 的最大出站贷款上限,这是因为默认情况下,iperf讲UDP客户端的贷款限制为每秒1Mbit。
可以用-b标志更改此值,讲数字替换为要测试的最大带宽速率。如果需要测试网络速度,可以将数字设置为高于网络提供商提供的最大带宽上线:
iperf -c 198.51.100.5 -u -b 1000m
这将告诉客户端我们希望尽可能达到每秒1000Mbits的最大值,该-b标志仅在使用UDP连接时有效,因为iperf未在TCP客户端上设置带宽限制。
import os
tmp = os.popen('iperf3 -c localhost -R -t 0.1 -f s').readlines()
print(tmp[6].split(" ")[12])
输出
110M/bits
tips 后台运行
iperf3 -s -D # 注意D一定要大写
默认情况下我们进行测试,都是客户端发送数据,服务器端接收数据,这种情况下相当于只对上行带宽进行了测试,如果我们需要检测下行带宽,只需要使用
-R
命令,即可变为客户端接收,服务器端发送。
参考:
https://iperf.fr/iperf-doc.php
https://github.com/thiezn/iperf3-python
带宽测试
可以通过上述方法获取信道带宽丢包率和时延
print("lost_percent",result.lost_percent)
print("Bandwidth",result.Mbps)
print("packets",result.packets)
print("lost_packets",result.lost_packets)
print("lost_percent",result.lost_percent)