iperf网络测试

iPerf/iPerf3提供了IP网络的最大带宽测试功能,支持不通参数调整,包括时间,缓存和协议(TCp, UDP, SCTP, 协议 IPv4 和 IPv6)。每次策四可以报告带宽,丢包以及其他参数。

iperf2 vs. iperf3

源代码安装

tar xfz iperf-3.6.tar.gz
cd iperf-3.6
./configure
make
make install

二进制安装

Ubuntu安装

软件仓库已经包含了iperf3

apt update
apt-cache search iperf3
apt install iperf3

使用

  • 服务器端启动:

iperf2使用如下命令启动

iperf -s -D

-D表示后台服务模式,-s表示服务器端

对于iperf3,执行指定端口监听

iperf3 -s -p 5201 -D
  • 客户端

iperf2测试

iperf -c 172.16.9.249 -t 86400 -l 8k -i 10
  • -t表示持续时间,86400秒就是24小时

  • -l 8k表示8k缓存

  • -i 10表示每10秒打印一个信息

上述命令是向服务器发送数据,如果要从服务器下载数据,则使用-R参数

上述命令会将整个带宽打满,所以很容易获得网络性能。

此外,-b参数可以限制流量,例如-b 200M就限制200Mb流量。不过,对于iperf2只支持UDP流量限流。

iperf3测试

iperf3 -c 192.168.101.1 -t 60 -l 8k -i 10 -b 500M -p 5201 -R
  • -t表示持续时间,600秒就是10分钟

  • -l 8k表示8k缓存

  • -i 10表示每10秒打印一个信息

  • -b 500M表示最高带宽500Mb/s

  • -p 5201表示端口

  • -R表示反向,也就是从服务器下载

测试输出

Reverse mode, remote host 192.168.101.1 is sending
[  5] local 192.168.101.81 port 60690 connected to 192.168.101.1 port 5201
[ ID] Interval           Transfer     Bitrate
[  5]   0.00-10.00  sec   709 KBytes   580 Kbits/sec
[  5]  10.00-20.00  sec   636 KBytes   521 Kbits/sec
[  5]  20.00-30.00  sec   875 KBytes   717 Kbits/sec
[  5]  30.00-40.00  sec  1.16 MBytes   975 Kbits/sec
[  5]  40.00-50.00  sec  1.04 MBytes   874 Kbits/sec
[  5]  50.00-60.00  sec   853 KBytes   699 Kbits/sec
- - - - - - - - - - - - - - - - - - - - - - - - -
[ ID] Interval           Transfer     Bitrate         Retr
[  5]   0.00-60.00  sec  5.43 MBytes   759 Kbits/sec    0             sender
[  5]   0.00-60.00  sec  5.21 MBytes   728 Kbits/sec                  receiver

iperf Done.
  • 自动重连

在使用iperf测试网络的时候,如果遇到网络抖动,可能客户端会出现如下报错

write failed: Connection reset by peer

此时客户端会退出。

但是这对一些测试环境是非常麻烦的,手工去处理是不可能的。

另外,我想了一个方法,通过cron脚本来实现

if ps aux | grep "iperf -c"| grep -v grep; then
    echo "iperf is running" > /dev/null
else
    iperf -c 172.16.9.249 -t 86400 -l 8k -i 10 -b 100M
fi

不过,对于iperf3,上述脚本也不能解决问题。因为iperf3是单线程程序,如果服务器启动并被一个客户端连接以后,后续其他客户端再连接就会提示错误:

iperf3: error - the server is busy running a test. try again later

解决的方法参考iperf3 at 40Gbps and above,在服务器端启动多个进程,并监听不同端口:

例如,以下脚本启动5个监听服务

for i in {1..5};do
    iperf3 -s -p 520${i} -D
done

则客户端脚本命令增加参数

if ps aux | grep "iperf -c"| grep -v grep; then
    echo "iperf is running" > /dev/null
else
    for i in {1..5};do
        iperf -c 172.16.9.249 -t 86400 -l 8k -i 10 -b 100M -p 520${i}
        if [ $? = 0]; then
            echo "iperf connect success" > /dev/null
            exit 0
        fi
    done
fi

还有一点问题暂时没有解决:虽然能够匹配某个连接,但是没有nohup放到后台。

参考

Last updated