本文下载链接:
一、Netperf工具简介
1、什么是Netperf ?
(1)Netperf是由惠普公司开发的一种网络性能测量工具,主要针对基于TCP或UDP的传输。
(2)Netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量数据传输(bulk data transfer)模式和请求/应答(request/reponse)模式。
(3)Netperf测试结果所反映的是一个系统能够以多快的速度向另外一个系统发送数据,以及另外一个系统能够以多块的速度接收数据。
2、Netperf 工作原理
(1)Netperf 工具的工作方式
① Netperf 工具以client/server方式工作。
② server端是netserver,用来侦听来自client端的连接。
③ client端是netperf,用来向server发起网络测试。
(2)Netperf 工具的工作原理
在client与server之间,首先建立一个控制连接,用于传递有关测试配置的信息,以及测试的结果。在控制连接建立并传递了测试配置信息以后,client与server之间会再建立一个测试连接,用来来回传递着特殊的流量模式,以测试网络的性能。
(3)Netperf 工具的工作流程
① 建立控制连接:
❶ server端netserver启动监听,监听来自client端netperf 的连接请求;
❷ client端向server端发送控制连接请求,server端发现连接请求,建立控制连接。
❸ 控制连接创建完成,使用BSD socket传输信息,属于TCP连接。
② 建立测试连接
❶ client端通过控制连接向server端传递测试配置信息。
❷ server端获取测试配置信息,建立测试连接。
❸ 测试连接用于传输各种模式的流量测试网络的性能。
③ 测试网络性能
❶ client端通过测试连接向server端发送Bulk模式流量模式的数据。
❷ server端接受Bulk模式流量模式的数据并产生测试结果1。
❸ client端通过测试连接向server端发送request/response流量模式的数据。
❹ server端接受request/response流量模式的数据并产生测试结果2。
④ 输出测试结果
❶ server端通过控制连接向client端发送测试结果。
❷ client端接受到测试结果并显示或保存。
3、Netperf 安装
(1)下载安装 Netperf
wget -c "https://codeload.github.com/HewlettPackard/netperf/tar.gz/netperf-2.5.0" -O netperf-2.5.0.tar.gz
tar -zxvf netperf-2.5.0.tar.gz
cd netperf-netperf-2.5.0
./configure
make && make install
编译不过可尝试执行:./configure --build=mips
(2)确认安装成功
执行netperf -h
和netserver -h
命令,确认安装成功。
注:服务器及客户端使用相同的源码,测试时关闭防火墙
4、网络性能测量的五项指标
(1)可用性(availability)
测试网络性能的第一步是确定网络是否正常工作,最简单的方法是使用 ping 命令。通过向远端的机器发送 icmp echo request,并等待接收 icmp echo reply 来判断远端的机器是否连通,网络是否正常工作。
(2)响应时间(response time)
ping 命令的 echo request/reply 一次往返所花费时间就是响应时间。
(3)网络利用率(network utilization)
网络利用率是指网络被使用的时间占总时间(即被使用的时间+空闲的时间)的比例。
网络测试工具一般使用网络吞吐量和网络带宽容量来确定网络中两个节点之间的性能。
(4)网络吞吐量(network throughput)
网络吞吐量是指在某个时刻,在网络中的两个节点之间,提供给网络应用的剩余带宽。
网络吞吐量非常依赖于当前的网络负载情况,可以帮组寻找网络路径中的瓶颈。
(5)网络带宽容量(network bandwidth capacity)
网络带宽容量指的是在网络的两个节点之间的最大可用带宽。这是由组成网络的设备的能力所决定的。
二、Netperf 使用语法
1、neserver语法格式
参数 | 说明 |
---|---|
-H host | 指定远端运行netserver的server IP地址 |
2、netperf语法格式
netperf 通过命令行参数来控制测试的类型和具体的测试选项。
netperf 命令行参数分为两大类:全局命令行参数、测试相关的局部参数,两者之间使用--分隔。
[root@Netperf-test ~]# netperf -h
Usage: netperf [global options] -- [test options]
Global options:
-a send,recv Set the local send,recv buffer alignment
-A send,recv Set the remote send,recv buffer alignment
-B brandstr Specify a string to be emitted with brief output
-c [cpu_rate] Report local CPU usage
-C [cpu_rate] Report remote CPU usage
-d Increase debugging output
-D time,[units] * Display interim results at least every time interval
using units as the initial guess for units per second
A negative value for time will make heavy use of the
system's timestamping functionality
-f G|M|K|g|m|k Set the output units
-F lfill[,rfill]* Pre-fill buffers with data from specified file
-h Display this text
-H name|ip,fam * Specify the target machine and/or local ip and family
-i max,min Specify the max and min number of iterations (15,1)
-I lvl[,intvl] Specify confidence level (95 or 99) (99)
and confidence interval in percentage (10)
-j Keep additional timing statistics
-l testlen Specify test duration (>0 secs) (<0 bytes|trans)
-L name|ip,fam * Specify the local ip|name and address family
-o send,recv Set the local send,recv buffer offsets
-O send,recv Set the remote send,recv buffer offset
-n numcpu Set the number of processors for CPU util
-N Establish no control connection, do 'send' side only
-p port,lport* Specify netserver port number and/or local port
-P 0|1 Don't/Do display test headers
-r Allow confidence to be hit on result only
-s seconds Wait seconds between test setup and test start
-S Set SO_KEEPALIVE on the data connection
-t testname Specify test to perform
-T lcpu,rcpu Request netperf/netserver be bound to local/remote cpu
-v verbosity Specify the verbosity level
-W send,recv Set the number of send,recv buffers
-v level Set the verbosity level (default 1, min 0)
-V Display the netperf version and exit
-y local,remote Set the socket priority
-Y local,remote Set the IP_TOS. Use hexadecimal.
-Z passphrase Set and pass to netserver a passphrase
(1)全局命令行参数 [global options]
参数 | 说明 |
---|---|
-H host | 指定远端运行netserver的server IP地址 |
-l testlen | 指定测试的时间长度(秒) |
-t testname | 指定进行的测试类型(包括TCP_STREAM,UDP_STREAM,TCP_RR,TCP_CRR,UDP_RR)。 |
(2)局部可选参数 [test options]
参数 | 说明 |
---|---|
-s size | 设置本地系统的socket发送与接收缓冲大小 |
-S size | 设置远端系统的socket发送与接收缓冲大小 |
-m size | 设置本地系统发送测试分组的大小,测试PPS时值为1。测试BPS时为1400。 |
-M size | 设置远端系统接收测试分组的大小 |
-p port | 设置测试连接Server端的端口 |
-D | 对本地与远端系统的socket设置TCP_NODELAY选项 |
-r req,resp | 设置request和reponse分组的大小 |
2、Netperf 模拟的流量模式
(1)Netperf 模拟的TCP流量模式
单个TCP连接,批量(bulk)传输大量数据
单个TCP连接,request/response流量模式
多个TCP连接,每个连接中一对request/response的交易(transaction)方式
TCP协议提供端到端]的可靠传输,但可靠性的建立会消耗一定的网络带宽。
(2)Netperf 模拟的UDP流量模式
从client到server的单向批量传输
请求/应答request/response的交易方式
UDP不保证传输的可靠性,在使用netperf时要确保发送的缓冲区大小不大于接收缓冲区大小,否则数据会丢失,netperf将给出错误的结果。因此,对于接收到分组的统计不一定准确,需要结合发送分组的统计综合得出结论。
三、Netperf 测试实例
Netperf 测试主要分服务端和客户端,在一台主机运行服务端netserver,在另一台主机运行客户端netperf。
- 服务端:192.168.0.128
- 客户端:192.168.0.120
测试通过单个TCP连接传输批量数据。
1、启动服务端
[root@Netserver-test ~]# netserver -p 4444 //服务端开放4444端口用于监听
Starting netserver with host 'IN(6)ADDR_ANY' port '12865' and family AF_UNSPEC
通常建议在server端执行sar命令来统计实际收到的包并作为实际结果:sar -n DEV 1 320
。
2、启动客户端
[root@Netperf-test ~]# netperf -H 192.168.0.128 -l 60 --m 1
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
87380 16384 16384 60.01 935.66
测试结果:显示吞吐量是881.21Mb/s。
四、Netperf 网络性能测试分类
1、批量(bulk)网络流量的性能测试
根据使用传输协议的不同,批量数据传输又分为TCP批量传输和UDP批量传输。
(1)TCP_STREAM
Netperf缺省情况下进行TCP批量传输,即-t TCP_STREAM,用来测试进行TCP批量传输时的网络性能。
测试过程中,netperf向netserver发送批量的TCP数据分组,以确定数据传输过程中的吞吐量。
[root@Netperf-test ~]# netperf -H 192.168.0.128 -l 60
TCP STREAM TEST to 192.168.0.128
Recv Send Send
Socket Socket Message Elapsed
Size Size Size Time Throughput
bytes bytes bytes secs. 10^6bits/sec
87380 16384 16384 60.00 88.00
从netperf的结果输出中可知:
远端系统(即server)使用大小为87380字节的socket接收缓冲
本地系统(即client)使用大小为16384字节的socket发送缓冲
向远端系统发送的测试分组大小为16384字节
测试经历的时间为60秒
吞吐量的测试结果为88Mbits/秒
在缺省情况下,netperf向netserver发送的测试分组大小设置为本地系统所使用的socket发送缓冲大小。
如果怀疑路由器由于缺乏足够的缓冲区空间,使得转发大的分组时存在问题,就可以增加测试分组(-m)的大小,以观察吞吐量的变化。减小测试分组的大小,如果吞吐量有了较大的提升,则说明在网络中间的路由器确实存在缓冲区的问题。
(2)UDP_STREAM
UDP_STREAM用来测试进行UDP批量传输时的网络性能。
测试UDP的网络性能时,测试分组的大小不得大于socket的发送与接收缓冲大小,否则netperf会报出错提示。
[root@Netperf-test ~]# netperf -t UDP_STREAM -H 192.168.0.128 -l 60
UDP UNIDIRECTIONAL SEND TEST to 192.168.0.128
udp_send: data send error: Message too long
为了避免这样的情况,可以通过命令行参数限定测试分组的大小,或者增加socket的发送/接收缓冲大小。
UDP_STREAM方式使用使用-m来修改测试中使用分组的大小。
[root@Netperf-test ~]# netperf -t UDP_STREAM -H 192.168.0.128 -- -m 1024
UDP UNIDIRECTIONAL SEND TEST to 192.168.0.128
Socket Message Elapsed Messages
Size Size Time Okay Errors Throughput
bytes bytes secs # # 10^6bits/sec
65535 1024 9.99 114127 0 93.55
65535 9.99 114122 93.54
UDP_STREAM方式的结果中有两行测试数据:
第一行显示的是本地系统的发送统计,吞吐量93.55Mbits/秒表示netperf向本地socket发送分组的能力。但是UDP是不可靠的传输协议,发送出去的分组数量不一定等于接收到的分组数量。
第二行显示的就是远端系统接收的情况,远端系统的吞吐量93.54Mbits/秒也几乎等于本地系统的发送吞吐量。但是,在实际环境中,一般远端系统的socket缓冲大小不同于本地系统的socket缓冲区大小,而且由于UDP协议的不可靠性,远端系统的接收吞吐量要远远小于发送出去的吞吐量。
2、请求/应答(request/response)网络流量的性能测试
在client/server结构中的request/response模式。在每次交易(transaction)中,client向server发出小的查询分组,server接收到请求,经处理后返回大的结果数据。
(1)TCP_RR
TCP_RR方式的测试对象是多次TCP request和response的交易过程,但发生在同一个TCP连接中,这种模式常常出现在数据库应用中。数据库的client程序与server程序建立一个TCP连接以后,就在这个连接中传送数据库的多次交易过程。
[root@Netperf-test ~]# netperf -t TCP_RR -H 192.168.0.128
TCP REQUEST/RESPONSE TEST to 192.168.0.128
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 9502.73
16384 87380
Netperf输出的结果也是由两行组成。第一行显示本地系统的情况,第二行显示的是远端系统的信息。平均的交易率(transaction rate)为9502.73次/秒。
通过使用-r参数设置request和reponse分组的大小,可以进行更有实际意义的测试。
[root@Netperf-test ~]# netperf -t TCP_RR -H 192.168.0.128 -- -r 32,1024
TCP REQUEST/RESPONSE TEST to 192.168.0.128
Local /Remote
Socket Size Request Resp. Elapsed Trans.
Send Recv Size Size Time Rate
bytes Bytes bytes bytes secs. per sec
16384 87380 32 1024 10.00 4945.97
16384 87380
(2)TCP_CRR
TCP_CRR的测试对象是多次TCP request和response的交易过程,但为每次交易建立一个新的TCP连接。最典型的应用就是HTTP,每次HTTP交易是在一条单独的TCP连接中进行的。因此,由于需要不停地建立新的TCP连接,并且在交易结束后拆除TCP连接,交易率一定会受到很大的影响。
[root@Netperf-test ~]# netperf -t TCP_CRR -H 192.168.0.128
TCP Connect/Request/Response TEST to 192.168.0.128
Local /Remote
Socket Size Request Resp. Elapsed Trans.
Send Recv Size Size Time Rate
bytes Bytes bytes bytes secs. per sec
131070 131070 1 1 9.99 2662.20
16384 87380
即使是使用一个字节的request/response分组,交易率也明显的降低了,只有2662.20次/秒。TCP_CRR使用与TCP_RR相同的局部参数。
(3)UDP_RR
UDP_RR方式使用UDP分组进行request/response的交易过程。由于没有TCP连接所带来的负担,所以我们推测交易率一定会有相应的提升。
[root@Netperf-test ~]# netperf -t UDP_RR -H 192.168.0.128
UDP REQUEST/RESPONSE TEST to 192.168.0.128
Local /Remote
Socket Size Request Resp. Elapsed Trans.
Send Recv Size Size Time Rate
bytes Bytes bytes bytes secs. per sec
65535 65535 1 1 9.99 10141.16
65535 65535
结果证实了我们的推测,交易率为10141.16次/秒,高过TCP_RR的数值。不过,如果出现了相反的结果,即交易率反而降低了,也不需要担心,因为这说明了在网络中,路由器或其它的网络设备对UDP采用了与TCP不同的缓冲区空间和处理技术。
五、学习笔记参考资料
1、《Netperf-百度百科》,https://baike.baidu.com/item/netperf/11070957?fr=aladdin
2、《Netperf安装及使用》,soloate,https://www.cnblogs.com/soloate/p/5763748.html
3、《netperf 与网络性能测量》,汤凯,https://www.ibm.com/developerworks/cn/linux/l-netperf/
4、《网络性能测试方法》,阿里云帮助文档,https://help.aliyun.com/knowledge_detail/55757.html#HFXbx