菜鸟笔记
提升您的技术认知

netperf-ag真人游戏

netperf概况

   netperf是一种网络性能的测量工具,主要针对基于tcp或udp的传输。netperf根据应用的不同,可以进行不同模式的网络性能测试,即批量 数据传输(bulk data transfer)模式和请求/应答(request/reponse)模式。netperf测试结果所反映的是一个系统能够以多快的速度向另外一个系统 发送数据,以及另外一个系统能够以多块的速度接收数据。   netperf工具以client/server方式工作。server端是 netserver,用来侦听来自client端的连接,client端是netperf,用来向server发起网络测试。在client与 server之间,首先建立一个控制连接,传递有关测试配置的信息,以及测试的结果;在控制连接建立并传递了测试配置信息以后,client与 server之间会再建立一个测试连接,用来来回传递着特殊的流量模式,以测试网络的性能。

tcp网络性能

  由于tcp协议能够提供端到端的可靠传输,因此被大量的网络应用程序使用。但是,可靠性的建立是要付出代价的。tcp协议保证可靠性的措施,如建立并维护连接、控制数据有序的传递等都会消耗一定的网络带宽。   netperf可以模拟三种不同的tcp流量模式:   1) 单个tcp连接,批量(bulk)传输大量数据   2) 单个tcp连接,client请求/server应答的交易(transaction)方式   3) 多个tcp连接,每个连接中一对请求/应答的交易方式

udp网络性能

  udp没有建立连接的负担,但是udp不能保证传输的可靠性,所以使用udp的应用程序需要自行跟踪每个发出的分组,并重发丢失的分组。   netperf可以模拟两种udp的流量模式:   1) 从client到server的单向批量传输   2) 请求/应答的交易方式   由于udp传输的不可靠性,在使用netperf时要确保发送的缓冲区大小不大于接收缓冲区大小,否则数据会丢失,netperf将给出错误的结果。因此,对于接收到分组的统计不一定准确,需要结合发送分组的统计综合得出结论。

netperf的命令行参数

  在unix系统中,可以直接运行可执行程序来启动netserver,也可以让inetd或xinetd来自动启动netserver。   当netserver在server端启动以后,就可以在client端运行netperf来 测试网络的性能。netperf通过命令行参数来控制测试的类型和具体的测试选项。根据作用范围的不同,netperf的命令行参数可以分为两大类:全局 命令行参数、测试相关的局部参数,两者之间使用--分隔:

netperf [global options]-- [test-specific options]

 这里我们只解释那些常用的命令行参数,其它的参数读者可以查询netperf的man手册。   -h host :指定远端运行netserver的server ip地址。   -l testlen:指定测试的时间长度(秒)   -t testname:指定进行的测试类型,包括tcp_stream,udp_stream,tcp_rr,tcp_crr,udp_rr,在下文中分别对它们说明。   在后面的测试中,netserver运行在192.168.0.28,server与client通过局域网连接(100m hub)。

netperf测试网络性能

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

  批量数据传输典型的例子有ftp和其它类似的网络应用(即一次传输整个文件)。根据使用传输协议的不同,批量数据传输又分为tcp批量传输和udp批量传输。   1. tcp_stream   netperf缺省情况下进行tcp批量传输,即-t tcp_stream。测试过程中,netperf向netserver发送批量的tcp数据分组,以确定数据传输过程中的吞吐量:

./netperf -h 192.168.0.28 -l 60tcp stream test to 192.168.0.28recv send sendsocket socket message elapsedsize size size time throughputbytes bytes bytes secs. 10^6bits/sec 87380 16384 16384 60.00 88.00

 从netperf的结果输出中,我们可以知道以下的一些信息:   1) 远端系统(即server)使用大小为87380字节的socket接收缓冲   2) 本地系统(即client)使用大小为16384字节的socket发送缓冲   3) 向远端系统发送的测试分组大小为16384字节   4) 测试经历的时间为60秒   5) 吞吐量的测试结果为88mbits/秒   在缺省情况下,netperf向发送的测试分组大小设置为本地系统所使用的socket发送缓冲大小。   tcp_stream方式下与测试相关的局部参数如下表所示:
参数 说明

  • -s size 设置本地系统的socket发送与接收缓冲大小
  • -s size 设置远端系统的socket发送与接收缓冲大小
  • -m size 设置本地系统发送测试分组的大小
  • -m size 设置远端系统接收测试分组的大小
  • -d 对本地与远端系统的socket设置tcp_nodelay选项

通过修改以上的参数,并观察结果的变化,我们可以确定是什么因素影响了连接的吞吐量。例如,如果怀疑路由器由于缺乏足够的缓冲区空间,使得转发大的分组时存在问题,就可以增加测试分组(-m)的大小,以观察吞吐量的变化:

./netperf -h 192.168.0.28 -l 60 -- -m 2048tcp stream test to 192.168.0.28recv send sendsocket socket message elapsedsize size size time throughputbytes bytes bytes secs. 10^6bits/sec 87380 16384 2048 60.00 87.62

 在这里,测试分组的大小减少到2048字节,而吞吐量却没有很大的变化(与前面例子中测试分组大小为16k字节相比)。相反,如果吞吐量有了较大的提升,则说明在网络中间的路由器确实存在缓冲区的问题。   2. udp_stream   udp_stream用来测试进行udp批量传输时的网络性能。需要特别注意的是,此时测试分组的大小不得大于socket的发送与接收缓冲大小,否则netperf会报出错提示:

./netperf -t udp_stream -h 192.168.0.28 -l 60udp unidirectional send test to 192.168.0.28udp_send: data send error: message too long

 为了避免这样的情况,可以通过命令行参数限定测试分组的大小,或者增加socket的发送/接收缓冲大小。udp_stream方式使用与tcp_stream方式相同的局部命令行参数,因此,这里可以使用-m来修改测试中使用分组的大小:

```bash
./netperf -t udp_stream -h 192.168.0.28 -- -m 1024udp unidirectional send test to 192.168.0.28socket message elapsed messagessize size time okay errors throughputbytes bytes secs # # 10^6bits/sec 65535 1024 9.99 114127 0 93.55 65535 9.99 114122 93.54

 udp_stream方式的结果中有两行测试数据,第一行显示的是本地系统的发送统计,这里的吞吐量表示netperf向本地socket发送分组的能力。但是,我们知道,udp是不可靠的传输协议,发送出去的分组数量不一定等于接收到的分组数量。   第二行显示的就是远端系统接收的情况,由于client与server直接连接在一起,而且网 络中没有其它的流量,所以本地系统发送过去的分组几乎都被远端系统正确的接收了,远端系统的吞吐量也几乎等于本地系统的发送吞吐量。但是,在实际环境中, 一般远端系统的socket缓冲大小不同于本地系统的socket缓冲区大小,而且由于udp协议的不可靠性,远端系统的接收吞吐量要远远小于发送出去的 吞吐量。   测试请求/应答(request/response)网络流量的性能   另一类常见的网络流量类型是应用在client/server结构中的request/response模式。在每次交易(transaction)中,client向server发出小的查询分组,server接收到请求,经处理后返回大的结果数据。   1. tcp_rr   tcp_rr方式的测试对象是多次tcp request和response的交易过程,但是它们发生在同一个tcp连接中,这种模式常常出现在数据库应用中。数据库的client程序与 server程序建立一个tcp连接以后,就在这个连接中传送数据库的多次交易过程。
```bash
./netperf -t tcp_rr -h 192.168.0.28tcp request/response test to 192.168.0.28local /remotesocket size request resp. elapsed trans.send recv size size time ratebytes bytes bytes bytes secs. per sec 16384 87380 1 1 10.00 9502.7316384 87380

 netperf输出的结果也是由两行组成。第一行显示本地 系统的情况,第二行显示的是远端系统的信息。平均的交易率(transaction rate)为9502.73次/秒。注意到这里每次交易中的request和response分组的大小都为1个字节,不具有很大的实际意义。用户可以通 过测试相关的参数来改变request和response分组的大小,tcp_rr方式下的参数如下表所示:

参数 说明
- -r req,resp 设置request和reponse分组的大小
- -s size 设置本地系统的socket发送与接收缓冲大小
- -s size 设置远端系统的socket发送与接收缓冲大小
- -d 对本地与远端系统的socket设置tcp_nodelay选项

通过使用-r参数,我们可以进行更有实际意义的测试:

./netperf -t tcp_rr -h 192.168.0.28 -- -r 32,1024tcp request/response test to 192.168.0.28local /remotesocket size request resp. elapsed trans.send recv size size time ratebytes bytes bytes bytes secs. per sec 16384 87380 32 1024 10.00 4945.9716384 87380

 从结果中可以看出,由于request/reponse分组的大小增加了,导致了交易率明显的下降。 注:相对于实际的系统,这里交易率的计算没有充分考虑到交易过程中的应用程序处理时延,因此结果往往会高于实际情况。   2. tcp_crr   与tcp_rr不同,tcp_crr为每次交易建立一个新的tcp连接。最典型的应用就是http,每次http交易是在一条单独的tcp连接中进行的。因此,由于需要不停地建立新的tcp连接,并且在交易结束后拆除tcp连接,交易率一定会受到很大的影响。

./netperf -t tcp_crr -h 192.168.0.28 tcp connect/request/response test to 192.168.0.28local /remotesocket size request resp. elapsed trans.send recv size size time ratebytes bytes bytes bytes secs. per sec 131070 131070 1 1 9.99 2662.2016384 87380

 即使是使用一个字节的request/response分组,交易率也明显的降低了,只有2662.20次/秒。tcp_crr使用与tcp_rr相同的局部参数。   3. udp_rr   udp_rr方式使用udp分组进行request/response的交易过程。由于没有tcp连接所带来的负担,所以我们推测交易率一定会有相应的提升。

./netperf -t udp_rr -h 192.168.0.28 udp request/response test to 192.168.0.28local /remotesocket size request resp. elapsed trans.send recv size size time ratebytes bytes bytes bytes secs. per sec 65535 65535 1 1 9.99 10141.1665535 65535

 结果证实了我们的推测,交易率为10141.16次/秒,高过tcp_rr的数值。不过,如果出现了相反的结果,即交易率反而降低了,也不需要担心,因为这说明了在网络中,路由器或其它的网络设备对udp采用了与tcp不同的缓冲区空间和处理技术。

结束   除了netperf以外,还有很多其它的网络性能测试工具,如dbs, iperf, pathrate, nettest, netlogger, tcptrace, ntop等。这些工具有其各自的特色和不同的侧重点,我们可以根据具体的应用环境,有选择的使用它们,这样就可以使这些工具发挥出最大的功效。虽然都是开 放源代码的软件,但是这些工具的功能与商业的网络测试工具同样强大,而且也得到了广泛的应用,熟悉这些工具对我们的实际工作一定会有很大的帮助。

网站地图