网络性能测试工具-netperf
2020-03-12 13:55:38 阿炯

Netperf是一款由惠普公司开发的网络性能的测量工具(网络栈,即测试不同类型的网络性能的benchmark工具),主要针对基于TCP或UDP的传输。Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求/应答(request/reponse)模式。Netperf测试结果所反映的是一个系统能够以多快的速度向另外一个系统发送数据,以及另外一个系统能够以多块的速度接收数据。


Netperf is a benchmark that can be used to measure the performance of many different types of networking. It provides tests for both unidirectional throughput, and end-to-end latency. The environments currently measureable by netperf include:
TCP and UDP via BSD Sockets for both IPv4 and IPv6
DLPI
Unix Domain Sockets
SCTP for both IPv4 and IPv6

Netperf工具以client/server方式工作。server端是netserver,用来侦听来自client端的连接,client端是netperf,用来向server发起网络测试。在client与server之间,首先建立一个控制连接,传递有关测试配置的信息,以及测试的结果:在控制连接建立并传递了测试配置信息以后,client与server之间会再建立一个测试连接,进行来回传递特殊的流量模式,以测试网络的性能。

软件的工作原理

Netperf工具以client/server方式工作。server端是netserver,用来侦听来自client端的连接,client端是netperf,用来向server发起网络测试。在client与server之间,首先建立一个控制连接,传递有关测试配置的信息,以及测试的结果;在控制连接建立并传递了测试配置信息以后,client与server之间会再建立一个测试连接,进行来回传递特殊的流量模式,以测试网络的性能。


建立连接


测试并产生结果


回传结果


性能测量的五项指标

可用性(availability): 测试网络性能的第一步是确定网络是否正常工作,最简单的方法是使用 ping 命令。通过向远端的机器发送 icmp echo request,并等待接收 icmp echo reply 来判断远端的机器是否连通,网络是否正常工作。Ping 命令有非常丰富的命令选项,比如 -c 可以指定发送 echo request 的个数,-s 可以指定每次发送的 ping 包大小 。

响应时间(response time): Ping 命令的 echo request/reply 一次往返所花费时间就是响应时间。有很多因素会影响到响应时间,如网段的负荷,网络主机的负荷,广播风暴,工作不正常的网络设备等等。

网络利用率(network utilization): 是指网络被使用的时间占总时间(即被使用的时间+空闲的时间)的比例。

网络吞吐量(network throughput): 是指在某个时刻,在网络中的两个节点之间,提供给网络应用的剩余带宽。网络吞吐量非常依赖于当前的网络负载情况。因此,为了得到正确的网络吞吐量,最好在不同时间(一天中的不同时刻,或者一周中不同的天)分别进行测试,只有这样才能得到对网络吞吐量的全面认识。

网络带宽容量(network bandwidth capacity): 与网络吞吐量不同,网络带宽容量指的是在网络的两个节点之间的最大可用带宽。这是由组成网络的设备的能力所决定的。



命令行参数

命令行主要的参数包括如下选项:
-H host :指定远端运行netserver的server IP地址。
-l testlen:指定测试的时间长度(秒)
-t testname:指定进行的测试类型,包括TCP_STREAM,UDP_STREAM,TCP_RR,TCP_CRR,UDP_RR
-s size    设置本地系统的socket发送与接收缓冲大小
-S size    设置远端系统的socket发送与接收缓冲大小
-m size    设置本地系统发送测试分组的大小
-M size    设置远端系统接收测试分组的大小
-D 对本地与远端系统的socket设置TCP_NODELAY选项


netperf语法格式为: netperf [global options] -- [test options]

[global options] 可选参数,其中可选的参数有如下几个:

|参数 |说明 |
|: ------------- |: -------------|
|-H host | 指定远端运行netserver的server IP地址 |
|-l testlen | 指定测试的时间长度(秒)|
|-t testname | 指定进行的测试类型 (TCP_STREAM,UDP_STREAM,TCP_RR,TCP_CRR,UDP_RR) |

[test-specific options] 可选参数,其中可选的参数有如下几个:
|参数|说明|
|: ---|: ---|
|-s size|设置本地系统的socket发送与接收缓冲大小|
|-S size|设置远端系统的socket发送与接收缓冲大小|
|-m size|设置本地系统发送测试分组的大小|
|-M size|设置远端系统接收测试分组的大小|
|-D|对本地与远端系统的socket设置TCP_NODELAY选项|
|-r req,resp|设置request和reponse分组的大小|

使用netperf进行网络测试

批量(bulk)网络流量的性能测试

说明:根据使用传输协议的不同,批量数据传输又分为TCP批量传输和UDP批量传输。测试类型有TCP_STREAM 和UDP_STREAM 。

(1)TCP_STREAM :netperf缺省参数情况下进行TCP批量传输,即 -t TCP_STREAM。测试过程中,netperf向netserver发送批量的TCP数据分组,以确定数据传输过程中的吞吐量。

例 1 :netperf -H 192.168.8.84 -l 60 (测试60秒内TCP批量数据传输表现)
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.8.84 () port 0 AF_INET
Recv   Send    Send
Socket Socket  Message  Elapsed
Size   Size    Size     Time     Throughput
bytes  bytes   bytes    secs.    10^6bits/sec
 87380  16384  16384    60.08      93.93
从netperf的结果输出中,我们可以知道以下的一些信息:
远端系统(即server)使用大小为87380字节的socket接收缓冲;
本地系统(即client)使用大小为16384字节的socket发送缓冲;
向远端系统发送的测试分组大小为16384字节;
测试经历的时间为60秒。
吞吐量的测试结果为93.93Mbits/秒。

例 2 :netperf -H 192.168.8.84 -l 60 -- -m 2048 (减小测试分组为2048,观察吞吐量的变化)
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.8.84 () port 0 AF_INET
Recv   Send    Send
Socket Socket  Message  Elapsed
Size   Size    Size     Time     Throughput
bytes  bytes   bytes    secs.    10^6bits/sec
 87380  16384   2048    60.13      93.46
说明:从上面两个示例中可以看出,当减小测试分组的大小为2048后吞吐量几乎没有变化,由此可以说明网络中间的路由器不存在缓冲区的问题。

(2)UDP_STREAM:用来测试进行UDP批量传输时的网络性能。需要特别注意的是,此时测试分组的大小不得大于socket的发送与接收缓冲大小,否则netperf会报出错提示:
例1 :netperf -H 10.238.154.166 -t UDP_STREAM -l 60
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.238.154.166 () port 0 AF_INET
Socket  Message  Elapsed      Messages
Size    Size     Time         Okay Errors   Throughput
bytes   bytes    secs            #      #   10^6bits/sec
212992   65507   60.00     10663576      0    93138.47
212992           60.00     10650638           93025.47
测试结果说明:接收的10650638少于发送的10663576,吞吐量也有差别!

例2 : netperf -H 10.238.154.166 -t UDP_STREAM -l 60 -- -m 220000
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.238.154.166 () port 0 AF_INET
send_data: data send error: Message too long (errno 90)
netperf: send_omni: send_data failed: Message too long

从例1可以看出socket的发送与接收缓冲大小为212992,而分组的大小220000大于212992,因此报错。


测试请求/应答(request/response)网络流量的性能

(1) TCP_RR : 测试对象是多次TCP request和response的交易过程,但是它们发生在同一个TCP连接中,这种模式常常出现在数据库应用中。数据库的client程序与server程序建立一个TCP连接以后,就在这个连接中传送数据库的多次交易过程。

可以通过测试相关的参数来改变request和response分组的大小,TCP_RR方式下的参数如下表所示:
参数               说明
-r req,resp    设置request和reponse分组的大小
-s size        设置本地系统的socket发送与接收缓冲大小
-S size        设置远端系统的socket发送与接收缓冲大小
-D            对本地与远端系统的socket设置TCP_NODELAY选项

例1 :netperf -H 192.168.8.84 -t TCP_RR -l 60
MIGRATED TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.8.84 () port 0 AF_INET : first burst 0
Local /Remote
Socket Size   Request  Resp.   Elapsed  Trans.
Send   Recv   Size     Size    Time     Rate
bytes  Bytes  bytes    bytes   secs.    per sec
16384  87380  1        1       60.00    1468.28

从netperf的结果输出中,可以看出:平均的交易率(transaction rate)为1468.28次/秒。注意默认情况下每次交易中的request和response分组的大小都为1个字节,不具有实际意义。

通过使用-r参数,我们可以进行更有实际意义的测试:
例2:netperf -H 192.168.8.84 -t TCP_RR -l 60 -- -r 64 64
MIGRATED TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.8.84 () port 0 AF_INET : first burst 0
Local /Remote
Socket Size   Request  Resp.   Elapsed  Trans.
Send   Recv   Size     Size    Time     Rate
bytes  Bytes  bytes    bytes   secs.    per sec
16384  87380  64       64      60.00    1417.17

(2)TCP_CRR:与TCP_RR不同,TCP_CRR为每次交易建立一个新的TCP连接。最典型的应用就是HTTP,每次HTTP交易是在一条单独的TCP连接中进行的。因此,由于需要不停地建立新的TCP连接,并且在交易结束后拆除TCP连接,交易率一定会受到很大的影响。

例 1 :netperf -H 192.168.8.84 -t TCP_CRR -l 60
MIGRATED TCP Connect/Request/Response TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.8.84 () port 0 AF_INET
Local /Remote
Socket Size   Request  Resp.   Elapsed  Trans.
Send   Recv   Size     Size    Time     Rate         
bytes  Bytes  bytes    bytes   secs.    per sec   
16384  87380  1        1       60.00       1.23   <=== 每次重新建立TCP连接,效率明显下降。

(3)UDP_RR : UDP_RR方式使用UDP分组进行request/response的交易过程。由于没有TCP连接所带来的负担,所以交易率一定会有相应的提升。
例1 :netperf -H 192.168.8.84 -t UDP_RR -l 60
MIGRATED UDP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 192.168.8.84 () port 0 AF_INET : first burst 0
Local /Remote
Socket Size   Request  Resp.   Elapsed  Trans.
Send   Recv   Size     Size    Time     Rate         
bytes  Bytes  bytes    bytes   secs.    per sec   
212992 212992 1        1       60.00    1452.85    <=== 效率明显上升。


参考来源:


netperf测试
netperf与网络性能测量

最新版本:2.7


项目主页:https://hewlettpackard.github.io/netperf/