Dubbo接口性能测试,JMeter篇

一、JMeter远程性能监控工具的使用

在JMeter中安装插件“jp@gc - PerfMon Metrics Collector”,可以实现监听指定服务器的资源消耗情况,包括CPU、Disk I/O、Network I/O 、Memory等。该插件提供了图形化式的输出结果,能够实时反映在服务调用过程中的服务器资源消耗情况,相比nmon更为方便(nmon本身提供了数据的导出功能,但是还需要通过另外的分析工具才能生成报表,并且需要测试人员手工选择采样数据的时间区间,)。具体的实现步骤为:

1. JMeter上安装“jp@gc - PerfMon Metrics Collector”插件,插件列表如下:

JMeter-Plugins-Extras.jar

JMeterPlugins-Standard.jar

拷贝上面的两个jar包到../apache-jmeter-xx.x/lib/ext目录下,并重启客户端。

2.服务器上安装性能监听程序

ServerAgent-2.2.1.zip

拷贝压缩包到服务器任意目录并解压,启动startAgent.sh脚本。(如果无法执行,执行chmod +x startAgent.sh添加执行权限)。执行命令为:./startAgent.sh &。在JMeter正常运行时,必须确保服务器上的该进程存在,否则JMeter客户端无法采集服务器资源消耗数据。

3. 使用“jp@gc - PerfMon Metrics Collector”

在线程组中添加了“jp@gc - PerfMon Metrics Collector”后,界面上可以配置需要监控的服务器,主要配置的是:Host/IP、Port和Metric to collect。其中Port默认为4444,不需要更改。

注意:安装插件可以使用JMeter的插件管理工具(jmeter-plugins-manager-0.11.jar),下载该jar包并拷贝到../jmeter-xx/lib/ext目录下后,重启JMeter。在“选项”->“Plugins Manager”中可以看到可以使用的插件。


二、使用HTTP请求查看服务器调用时间

为测试计划添加“teardownThread Group”,该线程组在Java请求完成后只执行一次,在其中配置了HTTP请求,通过168.168.98.56:9092/services/time/timeCollect的REST接口获取服务器的调用时间。通过配置“HTTP请求”实现。通过“jp@gc JSON Path Extractor”解析HTTP Response中的timeNumber、crmTime、serviceTime等参数。配置“Debug Sampler”进行数据的输出。最后,在“查看结果树”中就可以查看到从服务器获取到的数据。具体的实现步骤为:

1. 安装“jp@gc JSON Path Extractor”插件(可选)

jpgc-json-2.6.zip

将该插件解压并拷贝到../apache-jmeter-xx.x/lib目录下,并重启JMeter。

注意:使用后置处理器中的“JSON Extractor”的功能一致,此时就不用安装“jp@gc JSON Path Extractor”插件了。

2. 添加“teardownThread Group”

“teardown Thread Group”会在测试计划的“线程组”执行完毕后,再执行。这样我们就可以通过一个HTTP接口调用,获取到“线程组”中所有的请求完成后的统计数据。


                                                        添加teardownThread Group

3. 添加“HTTP请求”


图添加HTTP请求

之所以要在这里加一个“HTTP请求”的Sampler,是因为我们的系统实现了一个Rest接口,可以通过调用该接口获取所有的请求完成后的服务器总时间和外部系统调用时间。

4. 添加后置处理器“jp@gc JSON Path Extractor”或者“JSON Extractor”


图添加JSON Path Extractor或者JSON Extractor


因为我们的Http的Response为如下的格式:{"code":"0000","msg":"","level":null,"data":{"timeNumber":1,"serviceTime":1,"crmTime":1},"totalAmount":0},所以配置jp@gc-JSON Path Extractor中的配置信息为:


图配置JSON Path Extractor中的crmTime



图配置JSON Path Extractor中的timeNumber



图配置JSON Path Extractor中的serviceTime


表示从Response的JSON信息中提取crmTime、serviceTime和timeNumber。如果Http中不是JSON返回信息,该监听器就无法使用。

5. 添加“Debug Sampler”


图添加Debug Sampler

具体的配置信息为:

JMeter Properties:False

JMeter Variables: True

System Properties:False

6. 添加“查看结果树”

略。

7. 查看结果


注意:一个tearDown Thread Group只能添加一个HTTP请求,否则会导致其中一个HTTP请求无请求结果从而使得JSON Path Extractor提取信息失败,无法得到正确的结果。但是我们的服务器有两个,解决办法是:添加两个“teardownThread Group”,分别添加HTTP请求。


三、服务器性能监控工具的使用

解压nmon_linux_14g.tar.gz包至服务器任意目录,根据操作系统选择合适的程序,我这里选择的是nmon_linux_x86_64。(注意需要chmod +x添加可执行权限)。执行后可查看服务器的实时资源使用情况,包括CPU、Disk I/O、Network I/O、Memory等。


也可以将资源消耗数据通过文件保存起来后续分析使用,具体可参考:http://www.cnblogs.com/simeone/p/4026173.html

四、nonGUI的环境部署


图xx  JMeter的nonGUI测试环境搭建拓扑图


1. 搭建基于Dubbo服务的接口性能测试测试环境。

以两个JMeter服务节点(jmeter-server)、一个JMeter客户端(复用JMeter服务节点)、两个Dubbo服务节点为例搭建一个基于nonGUI-JMeter的Dubbo服务压力测试环境。

1) [将apache-jmeter-3.1拷贝到服务节点的任一目录下;

2)修改bin/jmeter中的内存配置(HEAP);

3) 如果jmeter、jmeter-server未赋予可执行权限,通过chmod +x jmeter, chmod +x jmeter-server赋予其可执行权限;

4) 在JMeter客户端所在节点上,修改bin/jmeter.properties文件中的remote_hosts,指向IP1:port, P2:port;

2. JMeter服务节点部署

1. 拷贝apache-jmeter-3.1至服务器上指定地址(一般为/home/appadmin目录);

2. 启动jmeter-server(./jmeter_server &)。确保jmeter_server拥有可执行的权限(chmod +x jmeter_server);

3. 在每次更新jar包时,需要kill掉当前的jmeter-server进程并重启;

4.JMeter客户端部署

无需部署,一般选择其中的一个jmeter_server作为Jmeter client。

4. 实现AbstractJavaSamplerClient接口的jar包的编写、打包和发布

4.1 编写

新建一个springboot工程,在pom.xml文件中引入依赖:

<dependency>

<groupId>org.apache.jmeter</groupId>

<artifactId>ApacheJMeter_core</artifactId>

<version>3.1</version>

</dependency>

<dependency>

<groupId>org.apache.jmeter</groupId>

<artifactId>ApacheJMeter_java</artifactId>

<version>3.0</version>

</dependency>


原则上针对每一个要进行压力测试的dubbo接口编写一个类,继承AbstractJavaSamplerClient抽象类。父类中包含若干要重新实现的方法:

public void setupTest(JavaSamplerContext context);

在该方法中实现创建Spring上下文,获取dubbo接口实例等功能;


public void teardownTest(JavaSamplerContext context);

在该方法中实现关闭Spring的ApplicationContext的功能;

 

publicArguments getDefaultParameters();

在这里实现在JMeter的UI配置界面上展现测试接口所需的参数,并且给参数一些默认值的功能;当JMeter运行时,从界面上取参数数据。

 

SampleResult runTest(JavaSamplerCOntext context);

运行JMeter;


在GatewayDubboTest工程中配置该工程连接Zookeeper的属性为:dubbo.registry.address = zookeeper://IP(同时部署在客户端IP1/客户端IP2节点的服务配置的Zookeeper参数也是这个ZK地址)。

4.2 打包

在Maven工程中使用maven-assembly-plugin插件打包,pom依赖为:

<build>

<plugins>

<plugin>

<artifactId>maven-assembly-plugin</artifactId>

<version>2.2</version>

<configuration>

<archive>

<manifest>

<mainClass>com.XXXX.starcraft.Starter.Main</mainClass>

</manifest>

</archive>

<descriptorRefs>

<descriptorRef>

jar-with-dependencies

</descriptorRef>

</descriptorRefs>

</configuration>

</plugin>

</plugins>

</build>

然后在工程中使用assembly:assembly –DskipTests命令进行打包即可。

4.3 发布

将生成的jar包拷贝到服务器1, 服务器2的./apache-jmeter/lib/ext目录下。注意:因为打包时未把依赖jar包加入,所以该jar包依赖的其他jar包需要手动添加到../apache-jmeter/lib目录下。

5. 运行测试用例

运行测试任务前,1)确保JMeterServer(即服务器1, 服务器2)已经启动(启动方式为./jmeter-server &),可通过ps–ef | grep jmeter命令进行查看;2)确保dubbo服务节点(即用户端)的服务已经启动,可通过ps –ef|grep java命令进行查看。

选择服务器1作为发起JMeter请求的客户端。进入/bin目录下,使用./jmeter命令,具体的格式有两种:

(1)仅生成*.jtl文件

./jmeter -t script/dingtoukaitong.jmx -n -l listener.jtl–r

其中:./jmeter是JMeter提供的命令;dingtoukaitong.jmx是待执行的脚本文件;listener.jtl是要输出的文本化结果,该结果输出到当前目录下。


(2) 生成*.jtl同时生成报表

./jmeter -n -t script/dingtoukaitong.jmx -r -l listener-aipOpen-2-2-2*500000.jtl -e -o /home/appadmin/apache-jmeter-3.1/bin/resultReport-aipOpen-2-2-2*500000

其中:./jmeter是JMeter提供的执行命令;dingtoukaitong.jmx是待执行的脚本文件;listener-aipOpen-2-2-2*500000.jtl是要输出的文本化结果;resultReport-aipOpen-2-2-2*500000是待生成的报表所在文件夹。

注意:当使用此种方式时,确保待输出的文本化结果和报表文件夹都必须不存在。

6. 运行结果分析

6. 几种重要的监听器

(1)运行结果输出为index.html图表

./jmeter -n -t script/dingtoukaitong.jmx -r -l listener-2-2-4*25000.jtl -e -o /home/appadmin/apache-jmeter-3.1/bin/resultReport

script/dingtoukaitong.jmx 是要运行的测试工程;

listener-2-2-4*25000.jtl是要输出的性能测试结果;

resultReport是要输出的图形化结果

五、java request sampler的参数化

有时候对于某一个dubbo请求接口,需要模拟多条不同参数的请求。这时候可以将参数写准备在一个*.csv或者*.txt文件中。通过在线程组中添加CSV Data Set Config读取文件中的数据,如下图所示:


图中①处表示CSV Data Set Config读取的目标文件的绝对路径;②处表示文件中每一行数据的组织形式,以“,”分隔不同的数据。其中,数据在*.csv或*.txt文件中的具体形式如下图:


与②处的表现形式是一样的。


然后,在Java Request Sampler中可以像下图这样设置:


此时,dubbo接口的参数从CSV Data Set Config中读取的文件行中解析,达到了不同的请求,使用不同的请求参数的目的。


使用non-gui模式进行多节点测试时,需要将*.jmx拷贝到服务器上,同时需要拷贝*.csv或者*.txt文件到任意目录,同时在*.jmx文件中修改filename的路径,如下图所示:



问题汇总

1. 问题描述:调用Dubbo服务时,客户端报KryoException或者NoClassDefFoundError等错误时,需要检查使用的starcraft-api和starcraft-base的jar包是否与服务器一致;

解决方案:如果出现不正常的调用错误,比如包冲突、包中的类无法找到等类似的问题,需要到指定的路径下重新下载jar包(接口工程包)

并拷贝到../apache-jmeter-xx.x/lib目录下,重新启动JMeter;

因此,若项目中需要引用非外部的包资源,该包资源在频繁的变动过程中时,必须确保JMeter客户端和服务器使用的包的一致性;

2. 问题描述:在做Dubbo接口压力测试时,需要对接口进行封装,实现AbstractJavaSamplerClient接口。实现中需要通过创建ClassPathXmlApplicationContext并从中获取Dubbo接口,实例化context在定义变量时进行,导致了dubbo服务的TCP连接数太多。

解决方案:建议在setupTest中进行context的实例创建工作,具体代码为:

context = new ClassPathXmlApplicationContext(new String[] {"applicationContext.xml"});

3. 问题描述:在大并发时,JMeter客户端会偶发OutOfMemory的异常;

解决方案:JMeter客户端在../bin/jmeter.bat中设置JVM参数,增加内存配置。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,544评论 6 501
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,430评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,764评论 0 353
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,193评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,216评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,182评论 1 299
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,063评论 3 418
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,917评论 0 274
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,329评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,543评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,722评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,425评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 41,019评论 3 326
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,671评论 0 22
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,825评论 1 269
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,729评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,614评论 2 353

推荐阅读更多精彩内容