Netperf是一种网络性能测量工具,主要针对基于TCP或UDP的传输,Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求/应答(request/reponse)模式。Netperf测试结果所反映的是一个系统能够以多快的速度向另外一个系统发送数据,以及另外一个系统能够以多块的速度接收数据。
一 netperf 简介
1.1.工作原理
Netperf工具以client/server方式工作。server端是netserver,用来侦听来自client端的连接,client端是netperf,用来向server发起网络测试.在client与server之间,首先建立一个控制连接,传递有关测试配置的信息,以及测试的结果:在控制连接建立并传递了测试配置信息以后,client与server之间会再建立一个测试连接,进行来回传递特殊的流量模式,以测试网络的性能.具体过程如下图所示:
图.1 建立连接
图2 测试并产生结果
图3 回传结果
1.2 安装
下载Netperf工具
# wget ftp://ftp.netperf.org/netperf/netperf-2.5.0.tar.gz
# tar zxvf netperf-2.5.0.tar.gz
# ./configure
# make && make install
在unix系统中,可以直接运行可执行程序来启动netserver。测试的时候,必须在两台机器上同时安装netperf,当netserver在server端启动以后,就可以在client端运行netperf来测试网络的性能。
1.3 命令介绍
根据作用范围的不同,netperf的命令行参数可以分为两大类:全局命令行参数、测试相关的局部参数,两者之间使用--分隔:
Netperf [global options] –-[test-specific options]
其中:
全局命令行参数包括如下选项:
-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进行网络测试
2.1 测试批量(bulk)网络流量的性能
批量数据传输典型的例子有ftp和其它类似的网络应用(即一次传输整个文件)。根据使用传输协议的不同,批量数据传输又分为TCP批量传输和UDP批量传输。
1.TCP_STREAM
Netperf缺省情况下进行TCP批量传输,即-t TCP_STREAM。测试过程中,netperf向netserver发送批量的TCP数据分组,以确定数据传输过程中的吞吐量:
[root@rac4 ~]# netperf -H 10.250.7.241 -l 60
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.241 (10.250.7.241) 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.12 826.89
从netperf测试的输出结果,可以知道如下信息:
1)远端系统(即server)使用大小为87380字节的socket接收缓冲
2)本地系统(即client)使用大小为16384字节的socket发送缓冲
3)向远端系统发送的测试分组大小为16384字节
4)测试经历的时间为60秒
5)吞吐量的测试结果为826.89 Mbits/秒
在缺省情况下,netperf向发送的测试分组大小设置为本地系统所使用的socket发送缓冲大小。
对于有问题的网络,我们可以修改上面介绍的测试局部参数,来判段是什么原因导致网络的吞吐量异常的!比如修改发送的包的大小来测试,来测试路由的缓存是否合适
[root@rac4 ~]# netperf -H 10.250.7.241 -l 20 -- -m 20480
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.241 (10.250.7.241) 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 20480 20.00 787.26
[root@rac4 ~]# netperf -H 10.250.7.241 -l 20 -- -m 16384
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.241 (10.250.7.241) 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 20.00 998.21
[root@rac4 ~]# netperf -H 10.250.7.241 -l 20 -- -m 10240
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.241 (10.250.7.241) 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 10240 20.01 785.19
从上面的例子看来,增大或者减小都会影响网络的吞吐量!默认的16384是最优的(我的测试环境是同一网段下的两台VM,不具有代表性)
2.UDP_STREAM
UDP_STREAM用来测试进行UDP批量传输时的网络性能。注意:此时测试分组的大小不得大于socket的发送与接收缓冲大小,否则netperf会报出错提示:
[root@rac4 ~]# netperf -t UDP_STREAM -H 10.250.7.241 -l 30 -- -m 262155
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.241 (10.250.7.241) port 0 AF_INET
send_data: data send error: errno 90
netperf: send_omni: send_data failed: Message too long
我的测试环境socket 默认的缓冲大小为262144bytes!
[root@rac3 ~]# netperf -t UDP_STREAM -H 10.250.7.220 -l 10
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.220 (10.250.7.220) port 0 AF_INET
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
262144 65507 10.00 28783 0 1508.00
262144 10.00 35376 1853.42
UDP_STREAM方式的结果中有两行测试数据:
第一行:本地系统的发送统计,这里的吞吐量表示netperf向本地socket发送分组的能力。
第二行:远端系统的接收统计!从上面的结果可以看出10.250.7.220 和 本地的吞吐量是相近的!
在实际环境中,一般远端系统的socket缓冲大小不同于本地系统的socket缓冲区大小,而且由于UDP协议的不可靠性,远端系统的接收吞吐量要远远小于发送出去的吞吐量。
[root@rac4 ~]# netperf -t UDP_STREAM -H 10.250.7.241 -l 10
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.241 (10.250.7.241) port 0 AF_INET
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
262144 65507 10.00 42962 0 2251.09
262144 10.00 17866 936.13
接收的17866少于发送的42962,吞吐量也有较大出入!
2.2 测试请求/应答(request/response)网络流量的性能
另一类常见的网络流量类型是应用在client/server结构中的request/response模式。在每次交易(transaction)中,client向server发出小的查询分组,server接收到请求,经处理后返回大的结果数据。如下图所示
1.TCP_RR
TCP_RR方式的测试对象是多次TCP request和response的交易过程,但是它们发生在同一个TCP连接中,这种模式常常出现在数据库应用中。数据库的client程序与server程序建立一个TCP连接以后,就在这个连接中传送数据库的多次交易过程。
[root@rac3 ~]# netperf -t TCP_RR -H 10.250.7.220
MIGRATED TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.220 (10.250.7.220) 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 10.00 10481.21
16384 87380
第一行显示本地系统的信息。
第二行显示远端系统的信息。
平均的交易率(transaction rate)为 10481.21 次/秒。注意默认情况下每次交易中的request和response分组的大小都为1个字节,不具有实际意义。
我们可以通过测试相关的参数来改变request和response分组的大小,TCP_RR方式下的参数如下表所示:
参数 说明
-r req,resp 设置request和reponse分组的大小
-s size 设置本地系统的socket发送与接收缓冲大小
-S size 设置远端系统的socket发送与接收缓冲大小
-D 对本地与远端系统的socket设置TCP_NODELAY选项
通过使用-r参数,我们可以进行更有实际意义的测试:
[root@rac3 ~]# netperf -t TCP_RR -H 10.250.7.220 -- -r 64 64
MIGRATED TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.220 (10.250.7.220) 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 10.00 10631.44
2.TCP_CRR
与TCP_RR不同,TCP_CRR为每次交易建立一个新的TCP连接。最典型的应用就是HTTP,每次HTTP交易是在一条单独的TCP连接中进行的。因此,由于需要不停地建立新的TCP连接,并且在交易结束后拆除TCP连接,交易率一定会受到很大的影响。
[root@rac3 ~]# netperf -t TCP_CRR -H 10.250.7.220
MIGRATED TCP Connect/Request/Response TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.220 (10.250.7.220) 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 10.00 2988.56 <===明显减小!
16384 87380
3.UDP_RR
UDP_RR方式使用UDP分组进行request/response的交易过程。由于没有TCP连接所带来的负担,所以交易率一定会有相应的提升。
[root@rac3 ~]# netperf -t UDP_RR -H 10.250.7.220
MIGRATED UDP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.250.7.220 (10.250.7.220) 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
262144 262144 1 1 10.00 97886.03 <===明显上升!
262144 262144