使用

server端

[root@jiangyi01.sqa.zmf /home/ahao.mah/ALIOS_QA/tools/netperf]
#netserver -p 10001
Starting netserver with host 'IN(6)ADDR_ANY' port '10001' and family AF_UNSPEC

client端

[root@jiangyi02.sqa.zmf /home/ahao.mah]
#netperf  -H 10.137.16.6 -l 10  -p 10001 -t TCP_STREAM -- -s 65535
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.137.16.6 () port 0 AF_INET
Recv   Send    Send
Socket Socket  Message  Elapsed
Size   Size    Size     Time     Throughput
bytes  bytes   bytes    secs.    10^6bits/sec

 87380 131070 131070    10.00     939.92

-H 主机名或IP 指定运行netserver的服务器的IP

-l 测试时长 指定测试的时间长度,单位为秒

-t 测试项目 指定测试的内容。测试项目如下:

TCP批量数据传输测试 TCP_STREAM

             TCP_SENDFILE

             TCP_MAERTS

TCP请求应答(长连接)模式测试 TCP_RR

             TCP_CRR

UCP批量数据传输测试 UDP_STREAM

             UDP_RR

             DLCO_STREAM

             DLCO_RR

             DLCL_STREAM

             DLCL_RR

             STREAM_STREAM

             STREAM_RR

             DG_STREAM

             DG_RR

             SCTP_STREAM

             SCTP_STREAM_MANY

             SCTP_RR

             SCTP_RR_MANY

             LOC_CPU

             REM_CPU

test specific options是测试项用的参数,它与全局参数之间要用“–”分开类似

netperf -H 127.0.0.1 -l 30 -- -m 2048

测试项参数与测试项目相关。

常用测试项目

网络带宽测试

带宽测试一般使用-t TCP_STREAM测试项,这也是netperf的默认测试项目。此项测试与ftp类似可以测试系统的带宽,但可以通过参数进行更多的设置。比如:

$ netperf -H 127.0.0.1 -l 60
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo
Recv   Send    Send
Socket Socket  Message  Elapsed
Size   Size    Size     Time     Throughput
bytes  bytes   bytes    secs.    10^6bits/sec  

 87380  16384  16384    60.00    2760.70 

第一列为服务端接收包的Socket缓冲区大小,这里没87380

第二列为客户端发送数据的Socket缓冲区大小,这里为16384

第三列为发送的消息的大小,这里为16384

第四列为测试时长

第五列为测试的速率,单位为M,这里结果为2.7G。因为使用的是localhost,实际是在本机的内存中收发的数据。

TCP_STREAM的常用测试参数有:

-s 缓冲区大小 指定客户端发送数据的缓冲区大小 -S 缓冲区大小 指定服务端接收数据的缓冲区大小

-m 发送消息大小 单位为bytes

-M 接收消息大小 单位为bytes

可以调整这些参数,了解哪些因素对传输速率有影响。比如将发送缓冲变大,测试结果变化不大:

$ netperf -H 127.0.0.1 -l 60 -- -s 65535
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo
Recv   Send    Send
Socket Socket  Message  Elapsed
Size   Size    Size     Time     Throughput
bytes  bytes   bytes    secs.    10^6bits/sec  

 87380 131070 131070    60.00    2672.42   

而改变接收缓冲和发包大小,则可以提升性能:

$ netperf -H 127.0.0.1 -l 60 -- -S 65535
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo
Recv   Send    Send
Socket Socket  Message  Elapsed
Size   Size    Size     Time     Throughput
bytes  bytes   bytes    secs.    10^6bits/sec  

131070  16384  16384    60.00    3058.22   
$ netperf -H 127.0.0.1 -l 60 -- -m 65535
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo
Recv   Send    Send
Socket Socket  Message  Elapsed
Size   Size    Size     Time     Throughput
bytes  bytes   bytes    secs.    10^6bits/sec  

 87380  16384  65535    60.00    3266.55   

从TCP_RR 到TCP_CRR

TCP_RR方式1

  1. 不指定-r ,这样 请求包 和回包大小都是1
  2. 每秒传输速度:19336.06
[root@jiangyi02.sqa.zmf /home/ahao.mah]
#netperf  -H 10.137.16.6 -l 10  -p 10001 -t TCP_RR
MIGRATED TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.137.16.6 () 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    19336.06
16384  87380

TCP_RR方式2

  1. 指定-r 32,1204 这样 请求包大小:32 ,回包大小:1204
  2. 每秒传输速度:6236.67

可见,仅仅是 增加了 -r 32,1204 就看到 ,导致了交易率明显的下降。 注:相对于实际的系统,这里交易率的计算没有充分考虑到交易过程中的应用程序处理时延,因此结果往往会高于实际情况。

[root@jiangyi02.sqa.zmf /home/ahao.mah]
#netperf  -H 10.137.16.6 -l 10  -p 10001 -t TCP_RR -- -r 32,1204
MIGRATED TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.137.16.6 () 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  32       1204    10.00    6236.67
16384  87380

TCP_CRR方式1

  1. 不指定-r ,这样 请求包 和回包大小都是1
  2. 交易率 5587.74 ,比 5587.74 要小的多,这就是TCP_CRR ,创建了大量TCP连接导致
[root@jiangyi02.sqa.zmf /home/ahao.mah]
#netperf  -H 10.137.16.6 -l 10  -p 10001 -t TCP_CRR --
MIGRATED TCP Connect/Request/Response TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.137.16.6 () 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    5587.74
16384  87380

TCP_CRR方式2

  1. 指定 -r 32,1204 ,这样 请求包 和回包大小 32,1204
  2. 交易率 5425.13 ,这个数据又变小了
[root@jiangyi02.sqa.zmf /home/ahao.mah]
#netperf  -H 10.137.16.6 -l 10  -p 10001 -t TCP_CRR -- -r 32,1204
MIGRATED TCP Connect/Request/Response TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.137.16.6 () 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  32       1204    10.00    5425.13
16384  87380

UDP协议的传输性能

与网络带宽测试类似,只是更换了协议,所以这个项目是UDP_STREAM:

$ netperf -H 127.0.0.1 -l 60 -t UDP_STREAM
MIGRATED UDP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo
Socket  Message  Elapsed      Messages
Size    Size     Time         Okay Errors   Throughput
bytes   bytes    secs            #      #   10^6bits/sec

212992   65507   60.00      440506      0    3847.46
212992           60.00      433151           3783.22

与TCP_STREAM不太一样,测试结果中有两行数据。第一行是客户端的,第二行是服务端。

第一列为缓冲区大小,在netperf测试中,两端的缓冲区大小会设置成一样大。

第二列为消息大小

第三列为测试传输时间

第四列为传输数据包量,UDP由于协议不保证传输可靠性,收发消息数量不一样多,而且实际生产环境收包量可能比发包少得更多。从数据看,这个包数量应是每秒数量(消息大小和速度的单位不一样)

最后是测试的速率,可以看到要比TCP协议快一些。这是协议决定的。

例子

[root@jiangyi02.sqa.zmf /home/ahao.mah]
#netperf  -H 10.137.16.6 -l 10  -p 10001 -t TCP_STREAM -- -s 65535
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.137.16.6 () port 0 AF_INET
Recv   Send    Send
Socket Socket  Message  Elapsed
Size   Size    Size     Time     Throughput
bytes  bytes   bytes    secs.    10^6bits/sec

 87380 131070 131070    10.00     939.92
 
[root@jiangyi02.sqa.zmf /home/ahao.mah]
#netperf  -H 10.137.16.6 -l 10  -p 10001 -t TCP_STREAM -- -s 6553
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.137.16.6 () port 0 AF_INET
Recv   Send    Send
Socket Socket  Message  Elapsed
Size   Size    Size     Time     Throughput
bytes  bytes   bytes    secs.    10^6bits/sec

 87380  13106  13106    10.00     890.73
[root@jiangyi02.sqa.zmf /home/ahao.mah]
#netperf  -H 10.137.16.6 -l 10  -p 10001 -t TCP_STREAM -- -s 1553
MIGRATED TCP STREAM TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 10.137.16.6 () port 0 AF_INET
Recv   Send    Send
Socket Socket  Message  Elapsed
Size   Size    Size     Time     Throughput
bytes  bytes   bytes    secs.    10^6bits/sec

 87380   3106   3106    10.00     112.31

-s 缓冲区大小 指定客户端发送数据的缓冲区大小

-S 缓冲区大小 指定服务端接收数据的缓冲区大小

如下是我的机器,可以看出不用调整,我的带宽就可以最大利用,但是并非所有的机器

TCP长连接请求应答模式测试

除了网络数据传输,大量的网络流量是请求/应答式的,即一方发送一个报文,另一方回复一个。而且通常这类请求和回复的报文大小不一样大,甚至差别很大。netperf可以简单模拟这类应用场景,进行网络性能测试。测试使用类型为TCP_RR。

最简单的TCP_RR测试如下:

姜弋: 这种模式下,最重要的是使用-r 来模拟真实的场景,-r 可以指定请求包和回包大小

$ netperf -H 127.0.0.1 -l 60 -t TCP_RR
MIGRATED TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo : 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    13517.65
16384  87380 

测试结果分为两行,第一行是本地,第二行是远端(服务端)

第一列和第二列应该还是缓冲区,只是和STREAM测试的顺序相反。

第三、四列为请求和返回包的大小。默认为1位。

第五列为测试时间

第六列为交易速率,这次是笔数/每秒,不再是带宽。

默认的包大小实际业务中不可能发生,可以通过参数进行调整,来模拟真实的情况。使用测试参数-r 请求包大小,应答包大小(-r request,response)来测试。注意此参数单位为BYTES,实际的业务一般是以字节为单位的报文:

$ netperf -H 127.0.0.1 -l 60 -t TCP_RR -- -r 64,2048
MIGRATED TCP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo : 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       2048    60.00    13129.09
16384  87380 

此测试使用8字节的请求,256字节的返应答包进行测试,测试结果相对默认值轻微下降。

TCP短连接请求应答模式测试

TCP请求的另一大类是类似HTTP业务的短连接请求应答报文。对应的测试项是TCP_CRR:

$ netperf -H 127.0.0.1 -l 60 -t TCP_CRR
MIGRATED TCP Connect/Request/Response TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo
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    2210.55
16384  87380 

测试参数和显示与TCP_RR类似。由于业务类型的影响,速率降得比厉害。

UDP连接请求应答模式测试

由于UDP协议的原因,UDP请求应答不分长短连接。只有UDP_RR一个测试项目,测试参数也类似TCP类的测试:

$ netperf -H 127.0.0.1 -l 60 -t UDP_RR
MIGRATED UDP REQUEST/RESPONSE TEST from 0.0.0.0 (0.0.0.0) port 0 AF_INET to 127.0.0.1 () port 0 AF_INET : demo : 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    15837.63
212992 212992

理论上,UDP的测试结果要好于TCP,但在实际网络中,可能受网络设备配置等影响,存在一定未知数。

总结

  1. 你会发现,使用netperf,我们无法指定 我们只打多少带宽,我们只可以,指定client的发包的分组大小,server的收包分组大小,client的发包socket缓存大小,server的缓存大小,这是因为我使用UDP_STREAM TCP_STREAM这两个都是 模拟 UDP TCP在连接上后大量发包的情况
  2. 当测试udp时候,udp的分组大小不能大于socket缓存大小
  3. -M 在server端使用,-m在client端使用

基准测试之netperf的更多相关文章

  1. [转帖]TPC-C基准测试之链路层优化

    TPC-C基准测试之链路层优化 阿里数据库 6000万 TPMC的测试结构. http://www.itpub.net/2019/10/14/3436/ 作者:易鸿伟 闫建良 王光树 在 TPC-C ...

  2. [转帖]TPC-C解析系列05_TPC-C基准测试之存储优化

    TPC-C解析系列05_TPC-C基准测试之存储优化 http://www.itpub.net/2019/10/08/3332/ 蚂蚁金服科技 2019-10-08 11:27:02 本文共3664个 ...

  3. [转帖]TPC-C解析系列04_TPC-C基准测试之数据库事务引擎的挑战

    TPC-C解析系列04_TPC-C基准测试之数据库事务引擎的挑战   http://www.itpub.net/2019/10/08/3331/ OceanBase这次TPC-C测试与榜单上Oracl ...

  4. [转帖]TPC-C解析系列03_TPC-C基准测试之SQL优化

    TPC-C解析系列03_TPC-C基准测试之SQL优化 http://www.itpub.net/2019/10/08/3330/ TPC-C是一个非常严苛的基准测试模型,考验的是一个完备的关系数据库 ...

  5. 六大主流开源SQL引擎

    导读 本文涵盖了6个开源领导者:Hive.Impala.Spark SQL.Drill.HAWQ 以及Presto,还加上Calcite.Kylin.Phoenix.Tajo 和Trafodion.以 ...

  6. SQL数据分析概览——Hive、Impala、Spark SQL、Drill、HAWQ 以及Presto+druid

    转自infoQ! 根据 O’Reilly 2016年数据科学薪资调查显示,SQL 是数据科学领域使用最广泛的语言.大部分项目都需要一些SQL 操作,甚至有一些只需要SQL. 本文涵盖了6个开源领导者: ...

  7. 主流开源SQL(on Hadoop)总结

    转载至 大数据杂谈 (BigdataTina2016),同时参考学习 http://www.cnblogs.com/barrywxx/p/4257166.html 进行整理. 使用SQL 引擎一词是有 ...

  8. 六大主流开源SQL引擎总结

    本文涵盖了6个开源领导者:Hive.Impala.Spark SQL.Drill.HAWQ 以及Presto,还加上Calcite.Kylin.Phoenix.Tajo 和Trafodion.以及2个 ...

  9. 【大数据之数据仓库】GreenPlum优化器对比测试

    在< [大数据之数据仓库]选型流水记>一文中有提及,当时没有测试GreenPlum的quicklz压缩算法和ORCA查询优化器,考虑到quicklz压缩算法因为版权问题不会开源(详情请参阅 ...

随机推荐

  1. java相关的路径获取 (转载 http://tomfish88.iteye.com/blog/971255)

    在jsp和class文件中调用的相对路径不同.在jsp里,根目录是WebRoot 在class文件中,根目录是WebRoot/WEB-INF/classes 当然你也可以用System.getProp ...

  2. 配置NFS服务器

    一.配置NFS服务器 1.安装软件包 [root@wjb10000 ~]# yum -y install nfs-utils.x86_64 2.修改配置文件[root@wjb10000 ~]# vim ...

  3. C语言原码反码补码与位运算.

      目录:     一.机器数和真值     二.原码,反码和补码的基础概念     三.为什么要使用原码,反码和补码     四.原码,补码,反码再深入     五.数据溢出测试     六.位运算 ...

  4. 富文本 SpannableString Span

    经典使用场景 SpannableStringBuilder needStartSSB = new SpannableStringBuilder("需要"); SpannableSt ...

  5. eclipse-android-activity_main/fragment_main文件处理

    android新建工程后,在res/layout/下有两个文件,之前用studio的时候貌似没有,只有一个文件,然后再测试Activity切换的时候,一直在纠结这个问题,下面是解决方法: 1)将fra ...

  6. maven自动下载jar包

    只需要修改pom文件即可.需要哪个jar包,在pom中就配置哪个(还包括手动向仓库中添加) 例如 http://blog.csdn.net/beyondlpf/article/details/8592 ...

  7. expr的简单应用

    expr命令 是一个手工命令行计数器,用于在UNIX/LINUX下求表达式变量的值,一般用于整数值,也可用于字符串. –格式为: expr expression_r(命令读入Expression 参数 ...

  8. java 对list中对象按属性排序

    实体对象类 --略 排序类----实现Comparator接口,重写compare方法 package com.tang.list; import java.util.Comparator; publ ...

  9. web项目环境搭建(1):建立一个maven项目

    一.maven简介以及常用概念 1.Maven是一个项目管理和整合的工具.Maven为开发者提供了一套完整的构建生命周期框架.开发团队基本不用花多少时间就能自动完成工程的基础构建配置,因为Maven使 ...

  10. C++拾遗(九)类与动态内存分配(1)

    创建类时编译器自动生成以下成员函数(如果用户没有定义): 1.默认构造函数 2.拷贝构造函数 3.赋值操作符 4.默认析构函数 5.地址操作符 以下一一说明: 构造函数 构造函数在创建对象时被调用. ...