JMeter测试WebSocket协议应用的性能

96
XMeter性能测试云服务
2016.09.16 22:38* 字数 1928

本文版权归xmeter.net 所有。欢迎转载,转载请注明出处。

摘要##

本文描述了如何使用JMeter对WebSocket应用进行性能测试。先对WebSocket作了概要介绍,然后以一个简单的echo的web为例,如何使用第三方提供的插件对其进行性能测试。

WebSocket概述##

WebSocket是在单个的TCP连接上提供了全双工通信通道的协议,该协议于2011年作为RFC6455被正式标准化。WebSocket在Web服务器和浏览器端都需要做实现。如果没有WebSocket,为了实现即时通讯,可以采用的技术都是轮询(polling)。轮询是在特定的时间间隔(如每1秒),由浏览器对服务器发出HTTP请求,然后由服务器返回最新的数据给客户端的浏览器。这种传统的HTTP请求的模式带来很明显的缺点 – 浏览器需要不断的向服务器发出请求,然而HTTP请求中头部会占用一定的开销,这种方式效率和实效性都不太好。而利用WebSocket,浏览器和服务器在基于HTTP协议完成握手后,在浏览器和服务器之间就形成了一条通信通道,他们之间就直接可以互相传送数据。在WebSocket 协议中,为我们实现即时服务带来了两大好处:
1) 头信息少,减少了系统的消耗。
2)服务器端推送,服务器不再被动的接收到浏览器的请求后才返回数据,而是在有新数据时就主动推送给浏览器。
通过这种方式,效率和实效性都得到了明显的提高,现在大部分浏览器都已经实现了对WebSocket协议的支持,当然使用WebSocket付出的代价是浏览器和服务器端要保留一个“有状态”的连接。

基于轮询机制和WebSocket的架构在实际项目中哪一种效率高,很难一概而论,因为这个跟实际的业务场景有关,最好的方法就是通过模拟实际的用户行为,对被测系统进行打压测试,然后观察被测系统的表现。采用轮询机制的系统,因为基于HTTP/HTTPS协议,现在有很多性能测试工具可以实现对这种系统进行测试。而基于WebSocket的性能测试则需要费一番功夫,不过幸运的是在开源软件生态日益完善的今天,这也不是什么难题 :)

JMeter扩展实现WebSocket性能测试##

JMeter是目前最为流行的开源性能测试工具,JMeter本身提供的基于插件的机制允许第三方实现标准JMeter所不支持的协议,而WebSocket的一个比较好的实现是WebSocketSampler。利用该插件,基本上能完成基于WebSocket协议的性能测试。

安装过程###

  1. 下载JAR包。该github项目下提供了打包好的JAR包的下载,但是还是需要用户自己再去找依赖的JAR包,使用起来还是不太方便。如果想更简单的话,可以到github下载所有打包好的JAR包。
  2. 把下载下来的JAR包拷贝到$JMETER_HOME/lib/ext目录下。如果从maciejzaleski项目下载到JAR包,还需要手工将页面 里列出的JAR也拷贝到$JMETER_HOME/lib/ext目录。
  3. 如果之前开着JMeter,需要关闭再次重启。如果安装成功,就应该在Sampler那里看到新的“WebSocket Sampler”

如果重启之后没有发现“WebSocket Sampler”,请确认在$JMETER_HOME/lib/ext是否拷贝了正确的JAR包;如果JAR拷贝正确,如果使用从maciejzaleski下载的JAR包,请确认相关依赖的JAR包和版本的正确性;如果还是有问题,请打开$JMETER_HOME/bin/jmeter.log,检查一下里面的日志是否报错,根据报错信息来采取相应的操作。

准备被测应用###

为了描述测试过程,这里准备了一个简单的Java WebSocket的工程,该工程下提供了一个叫做echo的WebSocket服务,实现的逻辑非常简单,当浏览器端发送一条文本消息的时候,该echo服务返回: "server echo, " + 浏览器发送的文本。比如浏览器发送”hello",则服务器返回 "server echo, hello"。

安装应用分成两步:
1)下载Apache Tomcat 8,并解压,启动Tomcat服务器;
2)将示例工程的war包拷贝到$TOMCAT_HOME/webapps目录下

在浏览器中打开链接,如下所示,在文本框中输入”hello”,点击“GO”,服务器端返回”server echo, hello”的话就表示工作正常了。

应用例子截图

编写测试脚本,开始测试##

如下图所示,填入相应的信息就可以开始进行测试。需要的主要信息有:

1)Server Name or IP:部署WebSocket应用所在的服务器地址
2)Port Number:端口号
3)Timeout:Connection,连接超时,超过此时间未建立连接则测试报错;Response,发送消息后的超时时间。
4)Implementation:现在只支持RFC6455
5)Protocol:ws或者wss。wss指的是加密的web socket,根据被测的配置而定
6)Path:所部署WebSocket服务的路径
7)Streaming connection:测试期间是否重用连接,如果处于非选中状态,每次得到服务器端的返回后就会关闭连接,下次执行时会新建连接
8)Request Data:发送出去的数据
9)Response pattern:等待服务器返回的特定的字符集合;否则等待Response Timeout设定的超时时间
10)Close Connection Pattern:与8类似,但是符合条件的时候连接将被关闭
11)Message Backlog:定义最多留下的返回消息的数目

WebSocket Sampler JMeter插件使用截图

在脚本中加入一个“View Results Tree“可以查看连接和发出数据的信息。如下图所示:

测试结果树

大规模WebSocket协议测试 - XMeter帮您提高效率,降低成本##

单台机器能够模拟的WebSocket客户端是有限的,如果针对大规模的WebSocket协议测试,可能需要准备大量的测试机器对被测系统进行打压,这个过程需要大量的准备机器环境,以及管理这些环境的工作,导致工作效率比较低、而且容易出错。XMeter将这些过程迁移至云端,弹性伸缩管理这些压力机,用户只要关注测试脚本的实现过程,而无需关心这些测试环境的管理,从而大大降低了大规模性能测试的复杂度。另外XMeter提供了丰富的测试报告,让性能问题一目了然。

关于我们##

XMeter成立于2016年,核心团队都来自于IBM,是一家领先技术的性能测试持续集成咨询与服务提供商。我们致力于提供给客户可靠,简单,低成本的性能测试解决方案。

JMeter
Web note ad 1